diff --git a/Directory.Packages.props b/Directory.Packages.props index 91b1ffe98a..820f8a2b33 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -149,7 +149,7 @@ - + diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 7f9b928749..bb6c1aeef4 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -783,7 +783,7 @@ "Enum:SourceChannel:1": "Studio", "Enum:SourceChannel:2": "Support Site", "Enum:SourceChannel:3": "Suite", - "Menu:OrganizationTokenUsage": "Organization Token Usage", + "Menu:AITokens": "AI Tokens", "Permission:OrganizationTokenUsage": "Organization Token Usage" } } diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/POST.md b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/POST.md new file mode 100644 index 0000000000..a56dd5a464 --- /dev/null +++ b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/POST.md @@ -0,0 +1,173 @@ +# Announcing .NET Aspire Integration for ABP Microservice Template + +We are excited to announce the integration of **.NET Aspire** into the ABP microservice solution, available starting with **ABP Studio v2.0.0**. This integration brings a unified development experience for building, running, debugging, and deploying distributed applications. With Aspire, you can now orchestrate your entire microservice ecosystem with a single command, eliminating complex configurations and making local development effortless. + +## What is .NET Aspire? + +[Aspire](https://aspire.dev/get-started/what-is-aspire/) is a cloud-ready stack designed to streamline the development of distributed applications. It provides: + +- **Orchestration**: A code-first approach to defining and running distributed applications, managing dependencies, and launch order. +- **Integrations**: Pre-built components for common services (databases, caches, message brokers) with automatic configuration. +- **Tooling**: A developer dashboard for real-time monitoring of logs, traces, metrics, and resource health. +- **Service Discovery**: Automatic service-to-service communication without hardcoded endpoints. +- **Observability**: Built-in OpenTelemetry support for distributed tracing, metrics, and structured logging. + +## How Does It Work with ABP? + +When you enable .NET Aspire in an ABP microservice solution, you get a fully integrated development experience where: + +- All microservices, gateways, and applications are orchestrated through a single entry point (AppHost). +- Infrastructure containers (databases, Redis, RabbitMQ, Elasticsearch, etc.) are managed as code. +- OpenTelemetry, health checks, and service discovery are automatically configured for all projects via the shared ServiceDefaults project. + +## Enabling Aspire in Your Solution + +When creating a new microservice solution via ABP Studio: + +1. In the solution creation wizard, look for the **".NET Aspire Integration"** step. +2. Toggle the option to **enable .NET Aspire**. +3. Complete the wizard—Aspire projects will be generated along with your solution. + +![Enable Aspire in ABP Studio](aspire-configuration.png) + +## Solution Structure Changes + +When Aspire is enabled, two additional projects are added to your solution: + +![Aspire Solution Structure](aspire-solution-structure.png) + +### AppHost (Orchestrator) + +[`AppHost`](https://aspire.dev/get-started/app-host/) is the .NET Aspire orchestrator project that declares all resources (services, databases, containers, applications) and their dependencies in C# code. It provides: + +- **Centralized orchestration**: Start your entire microservice ecosystem with a single command. +- **Code-first infrastructure**: Databases, Redis, RabbitMQ, Elasticsearch, and observability tools are defined programmatically. +- **Dependency management**: Services start in the correct order using `WaitFor()` declarations. +- **Automatic configuration**: Connection strings, endpoints, and environment variables are injected automatically. + +### ServiceDefaults + +[`ServiceDefaults`](https://aspire.dev/fundamentals/service-defaults/) is a shared library that provides common cloud-native configuration for all projects in the solution. Every service uses the same observability, health check, and resilience patterns. + +| Feature | Description | +|---------|-------------| +| OpenTelemetry | Tracing, metrics, and structured logging with automatic instrumentation | +| Health Checks | `/health` and `/alive` endpoints for Kubernetes-style probes | +| Service Discovery | Automatic resolution of service endpoints | +| HTTP Resilience | Retry policies, timeouts, and circuit breakers for HTTP clients | + +## Running the Solution with Aspire + +Running your microservice solution has never been easier: + +1. Open **Solution Runner** in ABP Studio. +2. Select the **Aspire** profile. +3. Run `AppHost`. + +![Solution Runner with Aspire](solution-runner-aspire-profile.png) + +AppHost automatically: + +- Starts all infrastructure containers (database, Redis, RabbitMQ, Elasticsearch, etc.). +- Launches all microservices, gateways, and applications in dependency order. +- Injects connection strings and environment variables. +- Opens the Aspire Dashboard for monitoring. + +![Aspire AppHost Resource Topology](aspire-apphost-topology.png) + +## Aspire Dashboard + +The Aspire Dashboard provides real-time tracking of your application's state. It enables you to monitor logs, traces, metrics, and environment configurations in an intuitive UI. + +![Aspire Dashboard Resources](aspire-dashboard-resources.png) + +### Key Dashboard Features + +#### Console Logs + +Display console logs from all resources in real-time. Filter by resource and log level to quickly find relevant information during development and debugging. + +![Aspire Dashboard Console](aspire-dashboard-console.png) + +#### Structured Logs + +View structured logs from all resources with advanced filtering capabilities. Search and filter logs by resource, log level, timestamp, and custom properties. + +![Aspire Dashboard Structured Logs](aspire-dashboard-structured-logs.png) + +#### Distributed Traces + +Explore distributed traces across your microservices to understand request flows and identify performance bottlenecks. + +![Aspire Dashboard Traces](aspire-dashboard-traces.png) + +#### Metrics + +Monitor real-time metrics including HTTP requests, response times, garbage collection, memory usage, and custom metrics. + +![Aspire Dashboard Metrics](aspire-dashboard-metrics.png) + +## Pre-Configured Observability Tools + +AppHost comes with pre-configured observability and management tools: + +### Grafana + +Visualization and analytics platform for monitoring metrics with interactive dashboards. + +![Grafana Dashboard](aspire-grafana-dashboard.png) + +### Jaeger + +Distributed tracing system to monitor and troubleshoot problems across microservices. + +![Jaeger Traces](aspire-jaeger-traces.png) + +### Kibana + +Visualization tool for Elasticsearch data with search and data visualization capabilities for logs. + +![Kibana Dashboard](aspire-kibana-dashboard.png) + +### Prometheus + +Monitoring and alerting toolkit that collects and stores metrics as time series data. + +![Prometheus Dashboard](aspire-prometheus-dashboard.png) + +### RabbitMQ Management + +Web-based interface for managing and monitoring the RabbitMQ message broker. + +![RabbitMQ Management](aspire-rabbitmq-management.png) + +### Redis Insight + +Visual tool for Redis that allows you to browse data, run commands, and monitor performance. + +![Redis Insight](aspire-redis-insight.png) + +### Database Admin Tools + +The database management admin tool varies by database type: + +| Database | Tool | +|----------|------| +| SQL Server | DBeaver CloudBeaver | +| MySQL | phpMyAdmin | +| PostgreSQL | pgAdmin | +| MongoDB | Mongo Express | + +![pgAdmin Dashboard](aspire-database-postgre-pgadmin.png) + +## Get Started Today + +Ready to experience the power of .NET Aspire with ABP? Create a new microservice solution in ABP Studio and enable the .NET Aspire integration option. For detailed documentation, visit our [.NET Aspire Integration documentation](https://abp.io/docs/latest/solution-templates/microservice/aspire-integration). + +To learn more about .NET Aspire, visit: [https://aspire.dev](https://aspire.dev/get-started/what-is-aspire/) + +We are excited to bring this integration to you and can't wait to hear your feedback. If you have any questions or suggestions, please drop a comment below. + +Happy coding! + +**The Volosoft Team** diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-apphost-topology.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-apphost-topology.png new file mode 100644 index 0000000000..a7622cff63 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-apphost-topology.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-configuration.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-configuration.png new file mode 100644 index 0000000000..74cd5066bb Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-configuration.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-console.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-console.png new file mode 100644 index 0000000000..fce1ca9355 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-console.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-metrics.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-metrics.png new file mode 100644 index 0000000000..690c3a910e Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-metrics.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-resources.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-resources.png new file mode 100644 index 0000000000..7b6777a8b9 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-resources.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-structured-logs.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-structured-logs.png new file mode 100644 index 0000000000..4c26e1fe48 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-structured-logs.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-traces.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-traces.png new file mode 100644 index 0000000000..9e5d761582 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-dashboard-traces.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-database-postgre-pgadmin.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-database-postgre-pgadmin.png new file mode 100644 index 0000000000..a11107ddd4 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-database-postgre-pgadmin.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-grafana-dashboard.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-grafana-dashboard.png new file mode 100644 index 0000000000..6c1eb3999e Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-grafana-dashboard.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-jaeger-traces.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-jaeger-traces.png new file mode 100644 index 0000000000..e9409465b1 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-jaeger-traces.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-kibana-dashboard.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-kibana-dashboard.png new file mode 100644 index 0000000000..90bcbf14b5 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-kibana-dashboard.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-prometheus-dashboard.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-prometheus-dashboard.png new file mode 100644 index 0000000000..764f6cfb38 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-prometheus-dashboard.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-rabbitmq-management.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-rabbitmq-management.png new file mode 100644 index 0000000000..362af7aac3 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-rabbitmq-management.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-redis-insight.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-redis-insight.png new file mode 100644 index 0000000000..429cbefae7 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-redis-insight.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-solution-structure.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-solution-structure.png new file mode 100644 index 0000000000..3379892b69 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/aspire-solution-structure.png differ diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/solution-runner-aspire-profile.png b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/solution-runner-aspire-profile.png new file mode 100644 index 0000000000..d11edfe584 Binary files /dev/null and b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/solution-runner-aspire-profile.png differ diff --git a/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/cover.png b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/cover.png new file mode 100644 index 0000000000..3739cbb97a Binary files /dev/null and b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/cover.png differ diff --git a/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/abp-studio-ai-management.png b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/abp-studio-ai-management.png new file mode 100644 index 0000000000..5577fb0b33 Binary files /dev/null and b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/abp-studio-ai-management.png differ diff --git a/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/ai-management-workspace-playground.png b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/ai-management-workspace-playground.png new file mode 100644 index 0000000000..7051772489 Binary files /dev/null and b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/ai-management-workspace-playground.png differ diff --git a/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/ai-management-workspace-widget.png b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/ai-management-workspace-widget.png new file mode 100644 index 0000000000..bb3a75d8cd Binary files /dev/null and b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/ai-management-workspace-widget.png differ diff --git a/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/aimanagement-workspace-geminiasopenai.png b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/aimanagement-workspace-geminiasopenai.png new file mode 100644 index 0000000000..a221b3ed7d Binary files /dev/null and b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/images/aimanagement-workspace-geminiasopenai.png differ diff --git a/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/post.md b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/post.md new file mode 100644 index 0000000000..80c4a8fbeb --- /dev/null +++ b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/post.md @@ -0,0 +1,106 @@ +# Introducing the AI Management Module: Manage AI Integration Dynamically + +We are excited to announce the **AI Management Module**, a powerful new module to the ABP Platform that makes managing AI capabilities in your applications easier. No need to redeploy your application, now you can configure, test, and manage your AI integrations on the fly through an intuitive user interface! + +## What is the AI Management Module? + +Built on top of the [ABP Framework's AI infrastructure](https://abp.io/docs/latest/framework/infrastructure/artificial-intelligence), the AI Management Module allows you to manage AI workspaces dynamically without touching your code. Whether you're building a customer support chatbot, adding AI-powered search, or creating intelligent automation workflows, this module provides everything you need to manage AI integrations through a user-friendly interface. + +> **Note**: The AI Management Module is currently in **preview** and available to ABP Team or higher license holders. + +## What it offers? + +### Manage AI Without Redeployment + +Create, configure, and update AI workspaces directly from the UI. Switch between different AI providers (OpenAI, Azure OpenAI, Ollama, etc.), change models, adjust prompts, and test configurations, all without restarting your application or deploying new code. + +### Built-In Chat Interface + +Test your AI workspaces immediately with the included chat interface in playground pages. Verify your configurations work correctly before using them in production. Perfect for experimenting with different models, prompts, and settings. + + ![AI Management Playground](./images/ai-management-workspace-playground.png) + +### Flexible for Any Architecture + +Whether you're building a monolith, microservices, or something in between, the module adapts to your needs: +- Host AI management directly in your application with full UI and database +- Deploy a centralized AI service that multiple applications can consume +- Use it as an API gateway pattern for your microservices + +### Works with Any AI Provider + +Even AI Management module doesn't implement all the providers by default, it provides extensibility options with a good abstraction for other providers like Azure, Anthropic Claude, Google Gemini, and more. Or you can directly use the OpenAI adapter with LLMs that support OpenAI API. + +- Example of using Gemini as an OpenAI provider: + + ![Using Gemini as an OpenAI provider](./images/aimanagement-workspace-geminiasopenai.png) + + +You can even add your own custom AI providers: [learn how to implement a custom AI provider factory in the documentation](https://abp.io/docs/latest/modules/ai-management#implementing-custom-ai-provider-factories). + +### Ready to Use Chat Widget + +Drop a compact, pre-built chat widget into any page with minimal code. It includes streaming support, conversation history, and API integration for customization. + +- Simple to use with minimal code + ```cs + @await Component.InvokeAsync(typeof(ChatClientChatViewComponent), new ChatClientChatViewModel + { + WorkspaceName = "StoryTeller", + }) + ``` + +- And result is a working, pre-integrated widget + + ![AI Management Chat Widget](./images/ai-management-workspace-widget.png) + +- [See the widget documentation](https://abp.io/docs/latest/modules/ai-management#client-usage-mvc-ui) for details and all parameters for customization. + +### Security + +Control who can manage and use AI workspaces with permission-based access control. Isolate your AI configurations by using workspaces with different permissions. Also, resource based authorization on workspaces is on the way and will be available in the next versions. It'll allow you to manage access to specific workspaces by a user or role. + +## Getting Started + +Installation is straightforward using the [ABP Studio](https://abp.io/studio). You can just enable **AI Management** module while creating a new project with ABP Studio and configure your preferred AI provider and model in the solution creation wizard. + +![ABP Studio AI Management Solution Creation Wizard](./images/abp-studio-ai-management.png) + +## Roadmap + +### v10.0 ✅ +- Workspace Management +- MVC UI +- Playground + - Chat History _(Client-Side)_ +- Client Components +- Integration to Startup Templates + +### v10.1 +- Blazor UI +- Angular UI +- Resource based authorization on Workspaces +- Agent-Framework compatibility examples + +### Future Goals +- Microservice templates +- MCP Support +- RAG with file upload _(md, pdf, txt)_ +- Chat History _(Server-Side Conversations)_ +- OpenAI Compatible Endpoints +- Tenant-Based Configuration +- Extended RAG capabilities, _(ie. providing application data as tools)_ + + +## Ready to Get Started? + +The AI Management Module is available now for ABP Team and higher license holders. + +**Learn More:** +- [AI Management Module Documentation](https://abp.io/docs/latest/modules/ai-management) - All features, scenarios, and technical details. +- [AI Infrastructure Documentation](https://abp.io/docs/latest/framework/infrastructure/artificial-intelligence) - Understanding AI workspaces in the framework. +- [Usage Scenarios](https://abp.io/docs/latest/modules/ai-management#usage-scenarios) - Examples for different architectures. + +--- + +*The AI Management Module is currently in preview. We're excited to hear your feedback as we continue to improve and add new features!* \ No newline at end of file diff --git a/docs/en/Community-Articles/2025-12-23-Referral-Program-Announcement/post.md b/docs/en/Community-Articles/2025-12-23-Referral-Program-Announcement/post.md new file mode 100644 index 0000000000..77621a1be2 --- /dev/null +++ b/docs/en/Community-Articles/2025-12-23-Referral-Program-Announcement/post.md @@ -0,0 +1,38 @@ +We are happy to share some exciting news. We launched **ABP.IO Referral Program** as a way to thank our customers and community members who help introduce ABP.IO to new professionals and organizations\! + +If you already use ABP.IO and believe in it, you can now get benefits by recommending it to others. + +## **What is ABP.IO Referral Program?** +Referral_Program_-3 + +ABP.IO Referral Program rewards people who bring new customers to ABP.IO. + +When someone you refer purchases an ABP.IO license, you earn a commission as a thank-you for your contribution. + +*\*This referral program is available to users who have an organization.* + +## **What Benefits Do You Get?** + +* Earn **5% commission** on the total sales price of each new license you refer + +* Get rewarded for sharing a platform you already know and trust + +## **Who Can Join?** + +You can participate if: + +* You are an existing ABP.IO customer who has purchased a license before + +* You are a license owner or a developer + +* Your license is active or expired + +* The purchase is not made by your own company + +## **Start Referring Today** + +If you are interested in joining the program, you can get started right away. + +👉 [**Start Referring Now**](https://abp.io/my-referrals) + +Thank you for being part of our community. Your support helps us grow and now it pays back. diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 08b4553d64..1cce28fa3f 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -563,7 +563,11 @@ { "text": "Microsoft.Extensions.AI", "path": "framework/infrastructure/artificial-intelligence/microsoft-extensions-ai.md" - }, + }, + { + "text": "Agent Framework", + "path": "framework/infrastructure/artificial-intelligence/microsoft-agent-framework.md" + }, { "text": "Semantic Kernel", "path": "framework/infrastructure/artificial-intelligence/microsoft-semantic-kernel.md" @@ -1561,6 +1565,10 @@ "text": "SSR Configuration", "path": "framework/ui/angular/ssr-configuration.md" }, + { + "text": "AI Tools Configuration", + "path": "framework/ui/angular/ai-config.md" + }, { "text": "PWA Configuration", "path": "framework/ui/angular/pwa-configuration.md" @@ -1861,6 +1869,10 @@ "text": "Overriding the User Interface", "path": "framework/architecture/modularity/extending/overriding-user-interface.md" }, + { + "text": "How to Override LeptonX CSS Variables", + "path": "framework/ui/common/leptonx-css-variables.md" + }, { "text": "Utilities", "items": [ @@ -2294,6 +2306,10 @@ "text": "Helm Charts and Kubernetes", "path": "solution-templates/microservice/helm-charts-and-kubernetes.md" }, + { + "text": ".NET Aspire Integration", + "path": "solution-templates/microservice/aspire-integration.md" + }, { "text": "Guides", "items": [ @@ -2355,13 +2371,17 @@ "path": "modules/account-pro.md", "isIndex": true }, + { + "text": "Idle Session Timeout", + "path": "modules/account/idle-session-timeout.md" + }, { "text": "Tenant impersonation & User impersonation", "path": "modules/account/impersonation.md" }, { - "text": "Idle Session Timeout", - "path": "modules/account/idle-session-timeout.md" + "text": "Web Authentication API (WebAuthn) passkeys", + "path": "modules/account/passkey.md" } ] }, diff --git a/docs/en/framework/architecture/multi-tenancy/index.md b/docs/en/framework/architecture/multi-tenancy/index.md index c58769e57e..11ac3f7af1 100644 --- a/docs/en/framework/architecture/multi-tenancy/index.md +++ b/docs/en/framework/architecture/multi-tenancy/index.md @@ -47,7 +47,7 @@ ABP supports all the following approaches to store the tenant data in the databa - **Database per Tenant**: Every tenant has a separate, dedicated database to store the data related to that tenant. - **Hybrid**: Some tenants share a single database while some tenants may have their own databases. -[Saas module (PRO)](../../../modules/saas.md) allows you to set a connection string for any tenant (as optional), so you can achieve any of the approaches. +[SaaS module (PRO)](../../../modules/saas.md) allows you to set a connection string for any tenant (as optional), so you can achieve any of the approaches. > You can see the community article *[Multi-Tenancy with Separate Databases in .NET and ABP Framework](https://abp.io/community/articles/multitenancy-with-separate-databases-in-dotnet-and-abp-51nvl4u9)* for more details about different database architectures with practical implementation details. @@ -466,7 +466,7 @@ The [Tenant Management module](../../../modules/tenant-management.md) provides a ### A note about separate database per tenant approach in open source version -While ABP fully supports this option, managing connection strings of tenants from the UI is not available in open source version. You need to have [Saas module (PRO)](../../../modules/saas.md). +While ABP fully supports this option, managing connection strings of tenants from the UI is not available in open source version. You need to have [SaaS module (PRO)](../../../modules/saas.md). Alternatively, you can implement this feature yourself by customizing the tenant management module and tenant application service to create and migrate the database on the fly. ## See Also diff --git a/docs/en/framework/fundamentals/dependency-injection.md b/docs/en/framework/fundamentals/dependency-injection.md index a1eef66761..2e2e3e377a 100644 --- a/docs/en/framework/fundamentals/dependency-injection.md +++ b/docs/en/framework/fundamentals/dependency-injection.md @@ -264,7 +264,7 @@ public class TaxAppService : ApplicationService ``TaxAppService`` gets ``ITaxCalculator`` in its constructor. The dependency injection system automatically provides the requested service at runtime. -Constructor injection is preffered way of injecting dependencies to a class. In that way, the class can not be constructed unless all constructor-injected dependencies are provided. Thus, the class explicitly declares it's required services. +Constructor injection is preferred way of injecting dependencies to a class. In that way, the class can not be constructed unless all constructor-injected dependencies are provided. Thus, the class explicitly declares it's required services. ### Property Injection diff --git a/docs/en/framework/fundamentals/exception-handling.md b/docs/en/framework/fundamentals/exception-handling.md index 73e5d055fe..85b1c3b9c4 100644 --- a/docs/en/framework/fundamentals/exception-handling.md +++ b/docs/en/framework/fundamentals/exception-handling.md @@ -88,7 +88,7 @@ Error **details** in an optional field of the JSON error message. Thrown `Except } ```` -`AbpValidationException` implements the `IHasValidationErrors` interface and it is automatically thrown by the framework when a request input is not valid. So, usually you don't need to deal with validation errors unless you have higly customised validation logic. +`AbpValidationException` implements the `IHasValidationErrors` interface and it is automatically thrown by the framework when a request input is not valid. So, usually you don't need to deal with validation errors unless you have highly customized validation logic. ### Logging @@ -289,7 +289,7 @@ The `IHttpExceptionStatusCodeFinder` is used to automatically determine the HTTP ### Custom Mappings -Automatic HTTP status code determination can be overrided by custom mappings. For example: +Automatic HTTP status code determination can be overridden by custom mappings. For example: ````C# services.Configure(options => diff --git a/docs/en/framework/fundamentals/validation.md b/docs/en/framework/fundamentals/validation.md index 50540b5625..78e93e59f5 100644 --- a/docs/en/framework/fundamentals/validation.md +++ b/docs/en/framework/fundamentals/validation.md @@ -121,7 +121,7 @@ namespace Acme.BookStore #### Enabling/Disabling Validation -You can use the `[DisableValidation]` to disable it for methods, classs and properties. +You can use the `[DisableValidation]` to disable it for methods, classes and properties. ````csharp [DisableValidation] diff --git a/docs/en/framework/infrastructure/artificial-intelligence/index.md b/docs/en/framework/infrastructure/artificial-intelligence/index.md index bdd1125e9d..ddf9ad4b07 100644 --- a/docs/en/framework/infrastructure/artificial-intelligence/index.md +++ b/docs/en/framework/infrastructure/artificial-intelligence/index.md @@ -27,12 +27,14 @@ abp add-package Volo.Abp.AI The `Volo.Abp.AI` package provides integration with the following libraries: * [Microsoft.Extensions.AI](https://learn.microsoft.com/en-us/dotnet/ai/microsoft-extensions-ai) +* [Microsoft.Agents.AI (Agent Framework)](https://learn.microsoft.com/en-us/agent-framework/overview/agent-framework-overview) * [Microsoft.SemanticKernel](https://learn.microsoft.com/en-us/semantic-kernel/overview/) -The Microsoft.Extensions.AI library is suggested for library developers to keep the library dependency minimum and simple (since it provides basic abstractions and fundamental AI provider integrations), while Semantic Kernel is suggested for applications that need rich and advanced AI integration features. +The **Microsoft.Extensions.AI** library is suggested for library developers to keep the library dependency minimum and simple (since it provides basic abstractions and fundamental AI provider integrations). For applications, **Microsoft Agent Framework** is the recommended choice as it combines the best of both AutoGen and Semantic Kernel (it's direct successor of these two frameworks), offering simple abstractions for single- and multi-agent patterns along with advanced features like thread-based state management, type safety, filters, and telemetry. **Semantic Kernel** can still be used if you need its specific AI integration features. Check the following documentation to learn how to use these libraries with the ABP integration: - [ABP Microsoft.Extensions.AI integration](./microsoft-extensions-ai.md) +- [ABP Microsoft.Agents.AI (Agent Framework) integration](./microsoft-agent-framework.md) - [ABP Microsoft.SemanticKernel integration](./microsoft-semantic-kernel.md) diff --git a/docs/en/framework/infrastructure/artificial-intelligence/microsoft-agent-framework.md b/docs/en/framework/infrastructure/artificial-intelligence/microsoft-agent-framework.md new file mode 100644 index 0000000000..d3e7d128fc --- /dev/null +++ b/docs/en/framework/infrastructure/artificial-intelligence/microsoft-agent-framework.md @@ -0,0 +1,218 @@ +# Microsoft.Agents.AI (Agent Framework) + +[Microsoft Agent Framework](https://learn.microsoft.com/en-us/agent-framework/overview/agent-framework-overview) is an open-source development kit for **building AI agents** and **multi-agent workflows**. It is the direct successor to both *AutoGen* and [*Semantic Kernel*](./microsoft-semantic-kernel.md), combining their strengths while adding new capabilities, and is the suggested framework for building AI agent applications. This documentation is about the usage of this library with ABP Framework. Make sure you have read the [Artificial Intelligence](./index.md) documentation before reading this documentation. + +## Usage + +**Microsoft Agent Framework** works on top of `IChatClient` from **Microsoft.Extensions.AI**. After obtaining an `IChatClient` instance, you can create an AI agent using the `CreateAIAgent` extension method: + +```csharp +using Microsoft.Agents.AI; +using Microsoft.Extensions.AI; + +public class MyService +{ + private readonly IChatClient _chatClient; + + public MyService(IChatClient chatClient) + { + _chatClient = chatClient; + } + + public async Task GetResponseAsync(string userMessage) + { + AIAgent agent = _chatClient.CreateAIAgent( + instructions: "You are a helpful assistant that provides concise answers." + ); + + AgentRunResponse response = await agent.RunAsync(userMessage); + + return response.Text; + } +} +``` + +You can also use `IChatClientAccessor` to access the `IChatClient` in scenarios where AI capabilities are **optional**, such as when developing a module or a service that may use AI capabilities optionally: + +```csharp +using Microsoft.Agents.AI; +using Microsoft.Extensions.AI; +using Volo.Abp.AI; + +public class MyService +{ + private readonly IChatClientAccessor _chatClientAccessor; + + public MyService(IChatClientAccessor chatClientAccessor) + { + _chatClientAccessor = chatClientAccessor; + } + + public async Task GetResponseAsync(string userMessage) + { + var chatClient = _chatClientAccessor.ChatClient; + if (chatClient is null) + { + return "No chat client configured"; + } + + AIAgent agent = chatClient.CreateAIAgent( + instructions: "You are a helpful assistant that provides concise answers." + ); + + var response = await agent.RunAsync(userMessage); + + return response.Text; + } +} +``` + +### Workspaces + +Workspaces are a way to configure isolated AI configurations for a named scope. You can define a workspace by decorating a class with the `WorkspaceNameAttribute` attribute that carries the workspace name. +- Workspace names must be unique. +- Workspace names cannot contain spaces _(use underscores or camelCase)_. +- Workspace names are case-sensitive. + +```csharp +using Volo.Abp.AI; + +[WorkspaceName("CommentSummarization")] +public class CommentSummarization +{ +} +``` + +> [!NOTE] +> If you don't specify the workspace name, the full name of the class will be used as the workspace name. + +You can resolve generic versions of `IChatClient` and `IChatClientAccessor` services for a specific workspace as generic arguments. If Chat Client is not configured for a workspace, you will get `null` from the accessor services. You should check the accessor before using it. This applies only for specified workspaces. Another workspace may have a configured Chat Client. + +`IChatClient` or `IChatClientAccessor` can be resolved to access a specific workspace's chat client. This is a typed chat client and can be configured separately from the default chat client. + +Example of resolving a typed chat client for a workspace: + +```csharp +using Microsoft.Agents.AI; +using Microsoft.Extensions.AI; +using Volo.Abp.AI; + +public class MyService +{ + private readonly IChatClient _chatClient; + + public MyService(IChatClient chatClient) + { + _chatClient = chatClient; + } + + public async Task GetResponseAsync(string userMessage) + { + AIAgent agent = _chatClient.CreateAIAgent( + instructions: "You are a customer support assistant. Be polite and helpful." + ); + + var response = await agent.RunAsync(userMessage); + return response.Text; + } +} +``` + +Example of resolving a typed chat client accessor for a workspace: + +```csharp +using Microsoft.Agents.AI; +using Microsoft.Extensions.AI; +using Volo.Abp.AI; + +public class MyService +{ + private readonly IChatClientAccessor _chatClientAccessor; + + public MyService(IChatClientAccessor chatClientAccessor) + { + _chatClientAccessor = chatClientAccessor; + } + + public async Task GetResponseAsync(string userMessage) + { + var chatClient = _chatClientAccessor.ChatClient; + if (chatClient is null) + { + return "No chat client configured"; + } + + AIAgent agent = chatClient.CreateAIAgent( + instructions: "You are a customer support assistant. Be polite and helpful." + ); + + var response = await agent.RunAsync(userMessage); + return response.Text; + } +} +``` + +## Configuration + +**Microsoft Agent Framework** uses `IChatClient` from **Microsoft.Extensions.AI** as its foundation. Therefore, the configuration process for workspaces is the same as described in the [Microsoft.Extensions.AI documentation](./microsoft-extensions-ai.md#configuration). + +You need to configure the Chat Client for your workspace using `AbpAIWorkspaceOptions`, and then you can use the `CreateAIAgent` extension method to create AI agents from the configured chat client. + +To configure a chat client, you'll need a LLM provider package such as [Microsoft.Extensions.AI.OpenAI](https://www.nuget.org/packages/Microsoft.Extensions.AI.OpenAI) or [OllamaSharp](https://www.nuget.org/packages/OllamaSharp/). + +_The following example requires [OllamaSharp](https://www.nuget.org/packages/OllamaSharp/) package to be installed._ + +Demonstration of the default workspace configuration: + +```csharp +[DependsOn(typeof(AbpAIModule))] +public class MyProjectModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(options => + { + options.Workspaces.ConfigureDefault(configuration => + { + configuration.ConfigureChatClient(chatClientConfiguration => + { + chatClientConfiguration.Builder = new ChatClientBuilder( + sp => new OllamaApiClient("http://localhost:11434", "mistral") + ); + }); + }); + }); + } +} +``` + +Demonstration of the isolated workspace configuration: + +```csharp +[DependsOn(typeof(AbpAIModule))] +public class MyProjectModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(options => + { + options.Workspaces.Configure(configuration => + { + configuration.ConfigureChatClient(chatClientConfiguration => + { + chatClientConfiguration.Builder = new ChatClientBuilder( + sp => new OllamaApiClient("http://localhost:11434", "mistral") + ); + }); + }); + }); + } +} +``` + +## See Also + +- [Usage of Microsoft.Extensions.AI](./microsoft-extensions-ai.md) +- [Usage of Semantic Kernel](./microsoft-semantic-kernel.md) +- [Microsoft Agent Framework Overview](https://learn.microsoft.com/en-us/agent-framework/overview/agent-framework-overview) +- [AI Samples for .NET](https://learn.microsoft.com/en-us/samples/dotnet/ai-samples/ai-samples/) \ No newline at end of file diff --git a/docs/en/framework/infrastructure/artificial-intelligence/microsoft-extensions-ai.md b/docs/en/framework/infrastructure/artificial-intelligence/microsoft-extensions-ai.md index 35b370585e..b44572838a 100644 --- a/docs/en/framework/infrastructure/artificial-intelligence/microsoft-extensions-ai.md +++ b/docs/en/framework/infrastructure/artificial-intelligence/microsoft-extensions-ai.md @@ -172,5 +172,6 @@ public class MyProjectModule : AbpModule ## See Also +- [Usage of Agent Framework](./microsoft-agent-framework.md) - [Usage of Semantic Kernel](./microsoft-semantic-kernel.md) - [AI Samples for .NET](https://learn.microsoft.com/en-us/samples/dotnet/ai-samples/ai-samples/) \ No newline at end of file diff --git a/docs/en/framework/infrastructure/audit-logging.md b/docs/en/framework/infrastructure/audit-logging.md index e559e5ed22..9811e542ab 100644 --- a/docs/en/framework/infrastructure/audit-logging.md +++ b/docs/en/framework/infrastructure/audit-logging.md @@ -215,7 +215,7 @@ public class MyUser : Entity public string Email { get; set; } - [DisableAuditing] //Ignore the Passoword on audit logging + [DisableAuditing] //Ignore the Password on audit logging public string Password { get; set; } } ```` diff --git a/docs/en/framework/infrastructure/background-workers/hangfire.md b/docs/en/framework/infrastructure/background-workers/hangfire.md index 832084de4c..9b65a488a9 100644 --- a/docs/en/framework/infrastructure/background-workers/hangfire.md +++ b/docs/en/framework/infrastructure/background-workers/hangfire.md @@ -61,7 +61,7 @@ After you have installed these NuGet packages, you need to configure your projec var configuration = context.Services.GetConfiguration(); var hostingEnvironment = context.Services.GetHostingEnvironment(); - //... other configarations. + //... other configurations. ConfigureHangfire(context, configuration); } diff --git a/docs/en/framework/infrastructure/background-workers/quartz.md b/docs/en/framework/infrastructure/background-workers/quartz.md index 7f591e0aeb..9693e4795f 100644 --- a/docs/en/framework/infrastructure/background-workers/quartz.md +++ b/docs/en/framework/infrastructure/background-workers/quartz.md @@ -43,7 +43,7 @@ public class YourModule : AbpModule } ```` -> Quartz background worker integration provided `QuartzPeriodicBackgroundWorkerAdapter` to adapt `PeriodicBackgroundWorkerBase` and `AsyncPeriodicBackgroundWorkerBase` derived class. So, you can still fllow the [background workers document](../background-workers) to define the background worker. +> Quartz background worker integration provided `QuartzPeriodicBackgroundWorkerAdapter` to adapt `PeriodicBackgroundWorkerBase` and `AsyncPeriodicBackgroundWorkerBase` derived class. So, you can still follow the [background workers document](../background-workers) to define the background worker. ## Configuration diff --git a/docs/en/framework/infrastructure/current-user.md b/docs/en/framework/infrastructure/current-user.md index a411d1f4d5..cb5954a778 100644 --- a/docs/en/framework/infrastructure/current-user.md +++ b/docs/en/framework/infrastructure/current-user.md @@ -101,7 +101,7 @@ For a web application, it gets the `User` property of the current `HttpContext`. ### Basic Usage -You can inject `ICurrentPrincipalAccessor` and use the `Principal` property to the the current principal: +You can inject `ICurrentPrincipalAccessor` and use the `Principal` property to get the current principal: ````csharp public class MyService : ITransientDependency diff --git a/docs/en/framework/infrastructure/emailing.md b/docs/en/framework/infrastructure/emailing.md index 7c240a9d75..a9304b2e57 100644 --- a/docs/en/framework/infrastructure/emailing.md +++ b/docs/en/framework/infrastructure/emailing.md @@ -235,7 +235,7 @@ The final rendered message was shown above. You typically want to replace the standard templates with your own ones, so you can prepare a branded email messages. To do that, you can use the power of the [virtual file system](../infrastructure/virtual-file-system.md) (VFS) or replace them in your own template definition provider. -Pathes of the templates in the virtual file system are shown below: +Paths of the templates in the virtual file system are shown below: * `/Volo/Abp/Emailing/Templates/Layout.tpl` * `/Volo/Abp/Emailing/Templates/Message.tpl` @@ -250,7 +250,7 @@ See the [text templating system](./text-templating) document for details. ## NullEmailSender -`NullEmailSender` is a built-in class that implements the `IEmailSender`, but writes email contents to the [standard log system](../fundamentals/logging.md), rathen than actually sending the emails. +`NullEmailSender` is a built-in class that implements the `IEmailSender`, but writes email contents to the [standard log system](../fundamentals/logging.md), rather than actually sending the emails. This class can be useful especially in development time where you generally don't want to send real emails. The [application startup template](../../solution-templates/layered-web-application) already uses this class in the **DEBUG mode** with the following configuration in the domain layer: diff --git a/docs/en/framework/infrastructure/features.md b/docs/en/framework/infrastructure/features.md index 2d135b822b..e450dc2068 100644 --- a/docs/en/framework/infrastructure/features.md +++ b/docs/en/framework/infrastructure/features.md @@ -395,8 +395,31 @@ There are three pre-defined value providers, executed by the given order: * `TenantFeatureValueProvider` tries to get if the feature value is explicitly set for the **current tenant**. * `EditionFeatureValueProvider` tries to get the feature value for the current edition. Edition Id is obtained from the current principal identity (`ICurrentPrincipalAccessor`) with the claim name `editionid` (a constant defined as`AbpClaimTypes.EditionId`). Editions are not implemented for the [tenant management](../../modules/tenant-management.md) module. You can implement it yourself or consider to use the [SaaS module](https://abp.io/modules/Volo.Saas) of the ABP Commercial. +* `ConfigurationFeatureValueProvider`: Gets the value from the [IConfiguration service](../fundamentals/configuration.md). * `DefaultValueFeatureValueProvider` gets the default value of the feature. +#### Feature Values in the Application Configuration + +The `ConfigurationFeatureValueProvider` reads the feature values from the `IConfiguration` service, which can read values from the `appsettings.json` by default. So, the easiest way to configure feature values is to define them in the `appsettings.json` file. + +For example, you can configure feature values as shown below: + +````json +{ + "Features": { + "MyApp.Reporting": "true", + "MyApp.PdfReporting": "true", + "MyApp.MaxProductCount": "50" + } +} +```` + +Feature values should be configured under the `Features` section as like in this example. + +> `IConfiguration` is an .NET Core service and it can read values not only from the `appsettings.json`, but also from the environment, user secrets... etc. See [Microsoft's documentation](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/) for more. + +#### Custom Feature Value Providers + You can write your own provider by inheriting the `FeatureValueProvider`. **Example: Enable all features for a user with "SystemAdmin" as a "User_Type" claim value** diff --git a/docs/en/framework/infrastructure/settings.md b/docs/en/framework/infrastructure/settings.md index b48b1c84dc..38c9528d86 100644 --- a/docs/en/framework/infrastructure/settings.md +++ b/docs/en/framework/infrastructure/settings.md @@ -43,7 +43,7 @@ ABP automatically discovers this class and registers the setting definitions. * **DefaultValue**: A setting may have a default value. * **DisplayName**: A localizable string that can be used to show the setting name on the UI. * **Description**: A localizable string that can be used to show the setting description on the UI. -* **IsVisibleToClients**: A boolean value indicates that whether this setting value is available in the client side or not. Default value is false to prevent accidently publishing an internal critical setting value. +* **IsVisibleToClients**: A boolean value indicates that whether this setting value is available in the client side or not. Default value is false to prevent accidentally publishing an internal critical setting value. * **IsInherited**: A boolean value indicates that whether this setting value is inherited from other providers or not. Default value is true and fallbacks to the next provider if the setting value was not set for the requested provider (see the setting value providers section for more). * **IsEncrypted**: A boolean value indicates that whether this setting value should be encrypted on save and decrypted on read. It makes possible to secure the setting value in the database. * **Providers**: Can be used to restrict providers available for a particular setting (see the setting value providers section for more). diff --git a/docs/en/framework/ui/angular/ai-config.md b/docs/en/framework/ui/angular/ai-config.md new file mode 100644 index 0000000000..06f690016a --- /dev/null +++ b/docs/en/framework/ui/angular/ai-config.md @@ -0,0 +1,262 @@ +```json +//[doc-seo] +{ + "Description": "Learn how to configure AI-powered development tools for ABP Framework Angular applications with automatic setup for Claude, Cursor, Copilot, Gemini, Junie, and Windsurf." +} +``` + +# AI Configuration + +ABP Framework provides an **AI Configuration Generator** that helps developers set up AI-powered coding assistants for their Angular applications. This schematic automatically generates configuration files for popular AI tools with pre-configured ABP best practices and guidelines. + +## Overview + +The AI Configuration Generator is an Angular schematic that creates standardized configuration files for various AI development tools. These configurations include: + +- ABP Framework coding standards and best practices +- Angular development guidelines +- Project-specific rules and conventions +- Full-stack development patterns (ABP .NET + Angular) + +## Supported AI Tools + +The generator supports the following AI coding assistants: + +- **Claude** - Creates `.claude/CLAUDE.md` configuration file +- **Copilot** - Creates `.github/copilot-instructions.md` configuration file +- **Cursor** - Creates `.cursor/rules/cursor.mdc` configuration file +- **Gemini** - Creates `.gemini/GEMINI.md` configuration file +- **Junie** - Creates `.junie/guidelines.md` configuration file +- **Windsurf** - Creates `.windsurf/rules/guidelines.md` configuration file + +## Usage + +### Basic Usage + +Generate AI configuration for a single tool: + +```bash +ng g @abp/ng.schematics:ai-config --tool=claude +``` + +### Multiple Tools + +Generate configurations for multiple AI tools at once: + +```bash +# Comma-separated +ng g @abp/ng.schematics:ai-config --tool=claude,cursor,copilot + +# Space-separated (with quotes) +ng g @abp/ng.schematics:ai-config --tool="claude cursor gemini" + +# Multiple --tool flags +ng g @abp/ng.schematics:ai-config --tool=claude --tool=cursor --tool=gemini +``` + +### Target Specific Project + +By default, configurations are generated at the workspace root. To target a specific project: + +```bash +ng g @abp/ng.schematics:ai-config --tool=claude --target-project=my-app +``` + +This creates the configuration files in the `my-app` project root directory. + +### Overwrite Existing Files + +If configuration files already exist, use the `--overwrite` flag to replace them: + +```bash +ng g @abp/ng.schematics:ai-config --tool=cursor --overwrite +``` + +## Schema Options + +The AI Configuration Generator accepts the following options: + +### tool + +- **Type:** `string` +- **Required:** Yes +- **Description:** Comma-separated list of AI tools to generate configurations for +- **Valid values:** `claude`, `copilot`, `cursor`, `gemini`, `junie`, `windsurf` +- **Example:** `"claude,cursor,copilot"` + +### targetProject + +- **Type:** `string` +- **Required:** No +- **Description:** The name of the target project in your workspace +- **Default:** Workspace root (`/`) +- **Example:** `"my-angular-app"` + +### overwrite + +- **Type:** `boolean` +- **Required:** No +- **Default:** `false` +- **Description:** Whether to overwrite existing configuration files + +## Configuration Content + +All generated configuration files include comprehensive guidelines for: + +### General Principles +- Clear separation between backend (ABP/.NET) and frontend (Angular) layers +- Modular architecture patterns +- Official ABP documentation references +- Readability, maintainability, and performance standards + +### ABP / .NET Development Rules +- Standard folder structure (`*.Application`, `*.Domain`, `*.EntityFrameworkCore`, `*.HttpApi`) +- C# coding conventions and naming patterns +- Modern C# features (records, pattern matching, null-coalescing) +- ABP module integration (Permissions, Settings, Audit Logging) +- Error handling and validation patterns + +### Angular Development Rules +- Angular coding style and best practices +- Component architecture patterns +- Reactive programming with RxJS +- ABP Angular package usage (`@abp/ng.core`, `@abp/ng.theme.shared`) +- State management and service patterns + +### Performance and Testing +- Performance optimization techniques +- Unit testing and integration testing guidelines +- Best practices for both backend and frontend + +## Examples + +### Example 1: Setup Claude for Development + +```bash +ng g @abp/ng.schematics:ai-config --tool=claude +``` + +Output: +``` +🚀 Generating AI configuration files... +📁 Target path: / +🤖 Selected tools: claude +✅ AI configuration files generated successfully! + +📝 Generated files: + - .claude/CLAUDE.md + +💡 Tip: Restart your IDE or AI tool to apply the new configurations. +``` + +### Example 2: Setup Multiple Tools for a Project + +```bash +ng g @abp/ng.schematics:ai-config --tool="cursor,copilot,gemini" --target-project=acme-app +``` + +Output: +``` +🚀 Generating AI configuration files... +📁 Target path: /acme-app +🤖 Selected tools: cursor, copilot, gemini +✅ AI configuration files generated successfully! + +📝 Generated files: + - /acme-app/.cursor/rules/cursor.mdc + - /acme-app/.github/copilot-instructions.md + - /acme-app/.gemini/GEMINI.md + +💡 Tip: Restart your IDE or AI tool to apply the new configurations. +``` + +### Example 3: Update Existing Configuration + +```bash +ng g @abp/ng.schematics:ai-config --tool=windsurf --overwrite +``` + +This will regenerate the Windsurf configuration file even if it already exists. + +## File Structure + +After running the generator, your project will have configuration files in their respective directories: + +``` +your-project/ +├── .claude/ +│ └── CLAUDE.md # Claude AI configuration +├── .cursor/ +│ └── rules/ +│ └── cursor.mdc # Cursor AI configuration +├── .github/ +│ └── copilot-instructions.md # GitHub Copilot configuration +├── .gemini/ +│ └── GEMINI.md # Gemini AI configuration +├── .junie/ +│ └── guidelines.md # Junie AI configuration +└── .windsurf/ + └── rules/ + └── guidelines.md # Windsurf AI configuration +``` + +## Best Practices + +1. **Generate Early**: Set up AI configurations at the beginning of your project to ensure consistent code quality from the start. + +2. **Multiple Tools**: If your team uses different AI assistants, generate configurations for all of them to maintain consistency across the team. + +3. **Version Control**: Commit the generated configuration files to your repository so all team members benefit from the same AI guidelines. + +4. **Keep Updated**: When ABP releases new best practices or your project evolves, regenerate configurations with the `--overwrite` flag. + +5. **Project-Specific**: For monorepos or multi-project workspaces, use `--target-project` to create project-specific configurations. + +## Troubleshooting + +### Configuration File Already Exists + +If you see a warning that a configuration file already exists: + +``` +⚠️ Configuration file already exists: .claude/CLAUDE.md + Use --overwrite flag to replace existing files. +``` + +Add the `--overwrite` flag to replace it: + +```bash +ng g @abp/ng.schematics:ai-config --tool=claude --overwrite +``` + +### Invalid Tool Name + +If you specify an invalid tool name: + +``` +Invalid AI tool(s): chatgpt. Valid options are: claude, copilot, cursor, gemini, junie, windsurf +``` + +Make sure to use only the supported tool names listed above. + +### No Tools Selected + +If you run the command without specifying any tools: + +```bash +ng g @abp/ng.schematics:ai-config +``` + +You'll see usage examples and available tools: + +``` +ℹ️ No AI tools selected. Skipping configuration generation. + +💡 Usage examples: + ng g @abp/ng.schematics:ai-config --tool=claude,cursor + ng g @abp/ng.schematics:ai-config --tool="claude, cursor" + ng g @abp/ng.schematics:ai-config --tool=gemini --tool=cursor + ng g @abp/ng.schematics:ai-config --tool=gemini --target-project=my-app + +Available tools: claude, copilot, cursor, gemini, junie, windsurf +``` \ No newline at end of file diff --git a/docs/en/framework/ui/angular/ssr-configuration.md b/docs/en/framework/ui/angular/ssr-configuration.md index 258fce99b4..e058beb861 100644 --- a/docs/en/framework/ui/angular/ssr-configuration.md +++ b/docs/en/framework/ui/angular/ssr-configuration.md @@ -1,13 +1,13 @@ ```json //[doc-seo] { - "Description": "Learn how to configure Server-Side Rendering (SSR) for your Angular application in the ABP Framework to improve performance and SEO." + "Description": "Learn how to configure Server-Side Rendering (SSR) for your Angular application in the ABP Framework to improve performance and SEO." } ``` # SSR Configuration -[Server-Side Rendering (SSR)](https://angular.io/guide/ssr) is a process that involves rendering pages on the server, resulting in initial HTML content that contains the page state. This allows the browser to show the page to the user immediately, before the JavaScript bundles are downloaded and executed. +[Server-Side Rendering (SSR)](https://angular.dev/guide/ssr) is a process that involves rendering pages on the server, resulting in initial HTML content that contains the page state. This allows the browser to show the page to the user immediately, before the JavaScript bundles are downloaded and executed. SSR improves the **performance** (First Contentful Paint) and **SEO** (Search Engine Optimization) of your application. @@ -105,10 +105,10 @@ If your project uses the **Webpack Builder** (`@angular-devkit/build-angular:bro ```typescript import { - AngularNodeAppEngine, - createNodeRequestHandler, - isMainModule, - writeResponseToNodeResponse, + AngularNodeAppEngine, + createNodeRequestHandler, + isMainModule, + writeResponseToNodeResponse, } from '@angular/ssr/node'; import express from 'express'; import { dirname, resolve } from 'node:path'; @@ -128,28 +128,28 @@ const angularApp = new AngularNodeAppEngine(); * Serve static files from /browser */ app.use( - express.static(browserDistFolder, { - maxAge: '1y', - index: false, - redirect: false, - }), + express.static(browserDistFolder, { + maxAge: '1y', + index: false, + redirect: false, + }), ); /** * Handle all other requests by rendering the Angular application. */ app.use((req, res, next) => { - angularApp - .handle(req) - .then(response => { - if (response) { - res.cookie('ssr-init', 'true', {...secureCookie, httpOnly: false}); - return writeResponseToNodeResponse(response, res); - } else { - return next() - } - }) - .catch(next); + angularApp + .handle(req) + .then(response => { + if (response) { + res.cookie('ssr-init', 'true', {...secureCookie, httpOnly: false}); + return writeResponseToNodeResponse(response, res); + } else { + return next() + } + }) + .catch(next); }); // ... (Start server logic) @@ -162,10 +162,10 @@ export const reqHandler = createNodeRequestHandler(app); import { RenderMode, ServerRoute } from '@angular/ssr'; export const serverRoutes: ServerRoute[] = [ - { - path: '**', - renderMode: RenderMode.Server - } + { + path: '**', + renderMode: RenderMode.Server + } ]; ``` @@ -180,16 +180,16 @@ import { serverRoutes } from './app.routes.server'; import { SSR_FLAG } from '@abp/ng.core'; const serverConfig: ApplicationConfig = { - providers: [ - provideAppInitializer(() => { - const platformId = inject(PLATFORM_ID); - const transferState = inject(TransferState); - if (isPlatformServer(platformId)) { - transferState.set(SSR_FLAG, true); - } - }), - provideServerRendering(withRoutes(serverRoutes)), - ], + providers: [ + provideAppInitializer(() => { + const platformId = inject(PLATFORM_ID); + const transferState = inject(TransferState); + if (isPlatformServer(platformId)) { + transferState.set(SSR_FLAG, true); + } + }), + provideServerRendering(withRoutes(serverRoutes)), + ], }; export const config = mergeApplicationConfig(appConfig, serverConfig); @@ -237,13 +237,177 @@ The schematic installs `openid-client` to handle authentication on the server si > Ensure your OpenID Connect configuration (in `environment.ts` or `app.config.ts`) is compatible with the server environment. -## 5. Deployment +## 5. Render Modes & Hybrid Rendering -To deploy your Angular SSR application to a production server, follow these steps: +Angular 20 provides different rendering modes that you can configure per route in the `app.routes.server.ts` file to optimize performance and SEO. -### 5.1. Build the Application +### 5.1. Available Render Modes + +```typescript +import { RenderMode, ServerRoute } from '@angular/ssr'; + +export const serverRoutes: ServerRoute[] = [ + // Server-Side Rendering - renders on every request + { + path: 'dashboard', + renderMode: RenderMode.Server + }, + + // Prerender (SSG) - renders at build time + { + path: 'about', + renderMode: RenderMode.Prerender + }, + + // Client-Side Rendering - renders only in browser + { + path: 'admin/**', + renderMode: RenderMode.Client + }, + + // Default fallback + { + path: '**', + renderMode: RenderMode.Server + } +]; +``` + +#### RenderMode.Server (SSR) +Renders HTML on every request. Best for dynamic content, personalized pages, and pages requiring authentication. + +#### RenderMode.Prerender (SSG) +Generates static HTML at build time. Best for marketing pages, blog posts, and content that doesn't change frequently. + +For dynamic routes, use `getPrerenderParams`: + +```typescript +{ + path: 'blog/:slug', + renderMode: RenderMode.Prerender, + getPrerenderParams: async () => { + const posts = await fetchBlogPosts(); + return posts.map(post => ({ slug: post.slug })); + } +} +``` + +#### RenderMode.Client (CSR) +Traditional client-side rendering. Best for highly interactive applications and admin panels that don't need SEO. + +### 5.2. Hybrid Rendering + +Combine different modes in one application for optimal results: + +```typescript +export const serverRoutes: ServerRoute[] = [ + // Static pages + { path: '', renderMode: RenderMode.Prerender }, + { path: 'about', renderMode: RenderMode.Prerender }, -Run the build command to generate the production artifacts: + // Dynamic pages + { path: 'account', renderMode: RenderMode.Server }, + { path: 'orders', renderMode: RenderMode.Server }, + + // Admin area + { path: 'admin/**', renderMode: RenderMode.Client }, +]; +``` + +## 6. Hydration + +Hydration is the process where Angular attaches to server-rendered HTML and makes it interactive. The ABP schematic automatically configures hydration for your application. + +### 6.1. Common Hydration Issues + +**Problem: Browser APIs on Server** + +```typescript +// ❌ Bad - will fail on server +const width = window.innerWidth; + +// ✅ Good - check platform +import { isPlatformBrowser } from '@angular/common'; +import { PLATFORM_ID, inject } from '@angular/core'; + +export class MyComponent { + platformId = inject(PLATFORM_ID); + + getWidth() { + if (isPlatformBrowser(this.platformId)) { + return window.innerWidth; + } + return 0; + } +} +``` + +**Problem: Random or Time-Based Values** + +```typescript +// ❌ Bad - generates different values on server and client +id = Math.random(); +currentTime = new Date(); + +// ✅ Good - use TransferState for consistent data +import { TransferState, makeStateKey } from '@angular/core'; + +const TIME_KEY = makeStateKey('time'); + +constructor(private transferState: TransferState) { + if (isPlatformServer(this.platformId)) { + this.transferState.set(TIME_KEY, new Date().toISOString()); + } else { + this.time = this.transferState.get(TIME_KEY, new Date().toISOString()); + } +} +``` + +**Enable Debug Tracing:** + +```typescript +// app.config.ts +import { provideClientHydration, withDebugTracing } from '@angular/platform-browser'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideClientHydration(withDebugTracing()), + ] +}; +``` + +## 7. Environment Variables + +Configure your SSR application using environment variables in `server.ts`: + +```typescript +// server.ts +const PORT = process.env['PORT'] || 4000; +const HOST = process.env['HOST'] || 'localhost'; + +// Start the server +if (isMainModule(import.meta.url)) { + app.listen(PORT, () => { + console.log(`Server running on http://${HOST}:${PORT}`); + }); +} +``` + +For production, set environment variables: + +```bash +# .env file or environment configuration +NODE_ENV=production +PORT=4000 +HOST=0.0.0.0 +API_URL=https://api.yourdomain.com +``` + +## 8. Deployment + +To deploy your Angular SSR application to a production server: + +### 8.1. Build the Application ```shell yarn build @@ -251,30 +415,152 @@ yarn build yarn run build:ssr ``` -### 5.2. Prepare Artifacts +### 8.2. Prepare Artifacts -After the build is complete, you will find the output in the `dist` folder. -For the **Application Builder**, the output structure typically looks like this: +Copy the `dist/MyProjectName` folder to your server: ``` dist/MyProjectName/ ├── browser/ # Client-side bundles -└── server/ # Server-side bundles and entry point (server.mjs) +└── server/ # Server-side bundles (server.mjs) ``` -You need to copy the entire `dist/MyProjectName` folder to your server. +### 8.3. Install Production Dependencies + +On your server, install only the required dependencies (schematic already added them to package.json): + +```shell +npm install --production +``` -### 5.3. Run the Server +Required dependencies: +- `express`: Web server framework +- `openid-client`: Authentication support -On your server, navigate to the folder where you copied the artifacts and run the server using Node.js: +### 8.4. Run the Server +**Development/Testing:** ```shell node server/server.mjs ``` -> [!TIP] -> It is recommended to use a process manager like [PM2](https://pm2.keymetrics.io/) to keep your application alive and handle restarts. +**Production (with PM2):** + +Use [PM2](https://pm2.keymetrics.io/) to keep your application alive and manage restarts: ```shell +npm install -g pm2 pm2 start server/server.mjs --name "my-app" +pm2 startup # Configure PM2 to start on boot +pm2 save # Save current process list +``` + +## 9. Troubleshooting + +### 9.1. "Window/Document is not defined" + +Browser APIs don't exist on the server. Always check the platform: + +```typescript +import { isPlatformBrowser } from '@angular/common'; + +if (isPlatformBrowser(this.platformId)) { + // Safe to use window, document, localStorage, etc. +} +``` + +### 9.2. "LocalStorage is not defined" + +ABP Core provides `AbpLocalStorageService` that implements the `Storage` interface and works safely on both server and client: + +```typescript +import { AbpLocalStorageService } from '@abp/ng.core'; + +@Injectable({ providedIn: 'root' }) +export class MyService { + private storage = inject(AbpLocalStorageService); + + saveData(key: string, value: string): void { + // Safe on both server and client + this.storage.setItem(key, value); + } + + getData(key: string): string | null { + // Returns null on server, actual value on client + return this.storage.getItem(key); + } +} +``` + +`AbpLocalStorageService` implements all `Storage` methods: +- `getItem(key: string): string | null` +- `setItem(key: string, value: string): void` +- `removeItem(key: string): void` +- `clear(): void` +- `key(index: number): string | null` +- `length: number` + +### 9.3. Hydration Mismatch Errors + +If you see "NG0500" errors in the console: + +1. Enable debug tracing (see section 6.1) +2. Check for dynamic content (dates, random IDs) +3. Ensure server and client render the same HTML +4. Use `TransferState` for data consistency + +### 9.4. Avoiding Duplicate API Calls + +ABP Core provides a `transferStateInterceptor` that automatically prevents duplicate HTTP GET requests during hydration. When you use `provideAbpCore()`, this interceptor is already active. + +**How it works:** +- Server: Stores HTTP GET responses in `TransferState` +- Client: Reuses stored responses during hydration +- Automatically cleans up stored data after use + +```typescript +// app.config.ts +import { provideAbpCore } from '@abp/ng.core'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideAbpCore(), + // transferStateInterceptor is automatically included + ] +}; ``` + +The interceptor works with all HTTP GET requests made through `HttpClient`: + +```typescript +// This service automatically benefits from the interceptor +@Injectable({ providedIn: 'root' }) +export class UserService { + private http = inject(HttpClient); + + getUsers() { + // On server: Response is cached in TransferState + // On client: Cached response is used (no duplicate request) + return this.http.get('/api/users'); + } +} +``` + +> [!NOTE] +> The interceptor only works with GET requests. POST, PUT, DELETE, and PATCH requests are not cached. + +## Additional Resources + +- [Angular SSR Official Guide](https://angular.dev/guide/ssr) +- [Angular Hydration Documentation](https://angular.dev/guide/hydration) +- [PM2 Process Manager](https://pm2.keymetrics.io/) + +## Summary + +The ABP Angular SSR schematic provides: +- ✅ Automatic SSR setup with necessary dependencies +- ✅ Server-side authentication with OpenID Connect +- ✅ Multiple render modes (Server, Prerender, Client, Hybrid) +- ✅ Hydration support for better performance + +Configure render modes based on your needs, handle platform differences properly, and use environment variables for deployment configuration. diff --git a/docs/en/framework/ui/common/leptonx-css-variables.md b/docs/en/framework/ui/common/leptonx-css-variables.md new file mode 100644 index 0000000000..938bc92304 --- /dev/null +++ b/docs/en/framework/ui/common/leptonx-css-variables.md @@ -0,0 +1,126 @@ +```json +//[doc-seo] +{ + "Description": "Explore LeptonX CSS Variables to customize theming with ease, controlling colors, spacing, and styles for a cohesive application design." +} +``` + +# LeptonX CSS Variables Documentation + +LeptonX uses CSS custom properties (variables) prefixed with `--lpx-*` to provide a flexible theming system. These variables control colors, spacing, shadows, and component-specific styles throughout the application. + +## Brand & Semantic Colors + +| Variable | Description | +|----------|-------------| +| `--lpx-brand` | Brand-specific accent color | +| `--lpx-brand-text` | Text color used on brand-colored backgrounds | + +## Base Colors + +| Variable | Description | +|----------|-------------| +| `--lpx-light` | Light shade for subtle backgrounds or text | +| `--lpx-dark` | Dark shade for contrasting elements | + +## Layout & Surface Colors + +| Variable | Description | +|----------|-------------| +| `--lpx-content-bg` | Main content area background color | +| `--lpx-content-text` | Default text color for content areas | +| `--lpx-card-bg` | Card component background color | +| `--lpx-card-title-text-color` | Card title text color | +| `--lpx-border-color` | Default border color for dividers and outlines | +| `--lpx-shadow` | Box shadow definition for elevated elements | + +## Navigation + +| Variable | Description | +|----------|-------------| +| `--lpx-navbar-color` | Navbar background color | +| `--lpx-navbar-text-color` | Navbar default text/icon color | +| `--lpx-navbar-active-text-color` | Navbar active/hover text color | +| `--lpx-navbar-active-bg-color` | Navbar active item background color | + +## Utility + +| Variable | Description | +|----------|-------------| +| `--lpx-radius` | Global border-radius value for rounded corners | + +## Global Override + +Applies to all themes and pages: + +```css +:root { + /* Brand & Semantic */ + --lpx-brand: #f72585; + + /* Base Colors */ + --lpx-light: #f5f7fb; + --lpx-dark: #0b0f19; + + /* Layout & Surface */ + --lpx-content-bg: #101018; + --lpx-content-text: #cfd6e4; + --lpx-card-bg: #151a2b; + --lpx-card-title-text-color: #ffffff; + --lpx-border-color: #242836; + --lpx-shadow: 0 10px 30px rgba(0, 0, 0, 0.25); + + /* Navigation */ + --lpx-navbar-color: #0d1020; + --lpx-navbar-text-color: #aab2c8; + --lpx-navbar-active-text-color: #ffffff; + --lpx-navbar-active-bg-color: rgba(247, 37, 133, 0.15); + + /* Utility */ + --lpx-radius: 10px; +} + +``` + +## Theme-Scoped Override + +Applies only when a specific theme class is active (e.g., `.lpx-theme-dark` on `` or ``): + +```css +:root .lpx-theme-dark { + /* Brand & Semantic */ + --lpx-brand: #4dd0e1; + + /* Base Colors */ + --lpx-light: #e0f7fa; + --lpx-dark: #020617; + + /* Layout & Surface */ + --lpx-content-bg: #0b1118; + --lpx-content-text: #c7d0e0; + --lpx-card-bg: #111a24; + --lpx-card-title-text-color: #e6f1ff; + --lpx-border-color: #1e2a3a; + --lpx-shadow: 0 12px 32px rgba(0, 0, 0, 0.45); + + /* Navigation */ + --lpx-navbar-color: #0f1a22; + --lpx-navbar-text-color: #9fb3c8; + --lpx-navbar-active-text-color: #ffffff; + --lpx-navbar-active-bg-color: rgba(77, 208, 225, 0.18); + + /* Utility */ + --lpx-radius: 12px; +} +``` + +## Component/Page-Specific Override + +For targeted customizations that should only affect a specific section: + +```css +.my-custom-page { + --lpx-brand: #e91e63; + --lpx-card-bg: #1a1a2e; +} +``` \ No newline at end of file diff --git a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png index a268e4cde5..3b1a4abe68 100644 Binary files a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png and b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png differ diff --git a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png index fd811125c7..5f2a9b7938 100644 Binary files a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png and b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png index da7a5f22ea..cb85c3a2b8 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png index f7f088804b..6bbf3fb22a 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-aspire-configuration-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-aspire-configuration-microservice.png new file mode 100644 index 0000000000..74cd5066bb Binary files /dev/null and b/docs/en/get-started/images/abp-studio-new-solution-dialog-aspire-configuration-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png index 910b522dd3..e41580ad1e 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png index 4b8965456c..ed52bac62c 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png index 3dedb0aba0..455a6bd574 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-languages-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-languages-microservice.png new file mode 100644 index 0000000000..705fee9325 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-new-solution-dialog-languages-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-microservice.png index e98c96ac07..9b9210b269 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png index f883555e4a..04e1af7ebe 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png index 2bc29805ee..3c06ae001d 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png index 3dff0567fd..40325a5358 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png index 4a6fbf2d40..27e39f3776 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png index 553f0ca395..53692d03de 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png differ diff --git a/docs/en/get-started/microservice.md b/docs/en/get-started/microservice.md index d57c652b8e..ee7e31bf85 100644 --- a/docs/en/get-started/microservice.md +++ b/docs/en/get-started/microservice.md @@ -94,6 +94,25 @@ Once you select the desired modules, click the *Next* button for the *UI Theme* LeptonX is the suggested UI theme that is proper for production usage. Select one of the themes and configure the additional options if you want. +Click the Next button to see *Language Selection* selection: + +![abp-studio-new-solution-dialog-languages](images/abp-studio-new-solution-dialog-languages-microservice.png) + +In this step, you can choose which languages your application will support. + +* Default Language: Select the main language for your app. + +* Localizable User Interface: Turn this on to support multiple languages. + +* Available Languages: Check the languages you want to include. + +* Click Add Custom Language if you want to add a language that is not listed. + +Click the Next button to see *.NET Aspire* configuration selection: + +![abp-studio-new-solution-dialog-aspire-configuration](images/abp-studio-new-solution-dialog-aspire-configuration-microservice.png) + +In this step, you can enable or disable the .NET Aspire integration for your solution. If you enable it, the solution will be pre-configured to work with .NET Aspire for easier microservice development and deployment. See the [Aspire Integration](../solution-templates/microservice/aspire-integration.md) document for more information about this feature. Click the Next button to see *Additional Options* selection: diff --git a/docs/en/images/add-passkey.png b/docs/en/images/add-passkey.png new file mode 100644 index 0000000000..345cdd644d Binary files /dev/null and b/docs/en/images/add-passkey.png differ diff --git a/docs/en/images/my-passkey.png b/docs/en/images/my-passkey.png new file mode 100644 index 0000000000..2b40045165 Binary files /dev/null and b/docs/en/images/my-passkey.png differ diff --git a/docs/en/images/passkey-login.png b/docs/en/images/passkey-login.png new file mode 100644 index 0000000000..dabf324e7f Binary files /dev/null and b/docs/en/images/passkey-login.png differ diff --git a/docs/en/images/passkey-login2.png b/docs/en/images/passkey-login2.png new file mode 100644 index 0000000000..349d8a2dca Binary files /dev/null and b/docs/en/images/passkey-login2.png differ diff --git a/docs/en/images/passkey-setting.png b/docs/en/images/passkey-setting.png new file mode 100644 index 0000000000..6211e91d9c Binary files /dev/null and b/docs/en/images/passkey-setting.png differ diff --git a/docs/en/images/pen-test-alert-list-10.1.png b/docs/en/images/pen-test-alert-list-10.1.png new file mode 100644 index 0000000000..3a9d10feff Binary files /dev/null and b/docs/en/images/pen-test-alert-list-10.1.png differ diff --git a/docs/en/modules/account-pro.md b/docs/en/modules/account-pro.md index 81e1177e33..7944c7448a 100644 --- a/docs/en/modules/account-pro.md +++ b/docs/en/modules/account-pro.md @@ -424,3 +424,4 @@ This module doesn't define any additional distributed event. See the [standard d * [Linked Accounts](./account/linkedaccounts.md) * [Session Management](./account/session-management.md) * [Idle Session Timeout](./account/idle-session-timeout.md) +* [Web Authentication API (WebAuthn) passkeys](./account/passkey.md) diff --git a/docs/en/modules/account/impersonation.md b/docs/en/modules/account/impersonation.md index c6fdae0ebf..3335ea50e5 100644 --- a/docs/en/modules/account/impersonation.md +++ b/docs/en/modules/account/impersonation.md @@ -7,7 +7,7 @@ # Tenant impersonation & User impersonation -User impersonation allows you to temporarily sign in as a different user in your tenant's users. This article introduces how to enable impersonation in ABP. Impersonation is enabled by defautl in ABP v5.0 and above. +User impersonation allows you to temporarily sign in as a different user in your tenant's users. This article introduces how to enable impersonation in ABP. Impersonation is enabled by default in ABP v5.0 and above. ## Introduction diff --git a/docs/en/modules/account/passkey.md b/docs/en/modules/account/passkey.md new file mode 100644 index 0000000000..b8f00ee576 --- /dev/null +++ b/docs/en/modules/account/passkey.md @@ -0,0 +1,63 @@ +# Web Authentication API (WebAuthn) passkeys + +The `Web Authentication API (WebAuthn) passkeys` feature allows users to authenticate using passkeys, which are more secure and user-friendly alternatives to traditional passwords. Passkeys leverage public key cryptography to provide strong authentication without the need for users to remember complex passwords. + +## Enabling Passkeys + +You can enable/disable the `Web Authentication API (WebAuthn) passkeys` feature in the `Setting > Account > Passkeys` page. Also, there is an option to allow how many passkeys a user can register: + +![passkey-setting](../../images/passkey-setting.png) + +## Manage Passkeys + +You can add/rename/delete your passkeys in the `Account/Manage` page: + +![my-passkey](../../images/my-passkey.png) + +Click the `Add Passkey` button to register a new passkey. You will be prompted to use your device's built-in biometric authentication (such as fingerprint or facial recognition) or an external security key to complete the registration process: + +![add-passkey](../../images/add-passkey.png) + +## Using Passkey for Login + +Once you enable the passkey feature and register at least one passkey, you can use it to log in to your account. On the login page, select the `Passkey login` option and follow the prompts to authenticate using your registered passkey: + +![passkey-login](../../images/passkey-login.png) + +![passkey-login2](../../images/passkey-login2.png) + +## Configure passkey options + +ASP.NET Core Identity provides various options to configure passkey behavior through the `IdentityPasskeyOptions` class, which include: + +- **AuthenticatorTimeout**: Gets or sets the time that the browser should wait for the authenticator to provide a passkey as a TimeSpan. This option applies to both creating a new passkey and requesting an existing passkey. This option is treated as a hint to the browser, and the browser may ignore the option. The default value is 5 minutes. +- **ChallengeSize**: Gets or sets the size of the challenge in bytes sent to the client during attestation and assertion. This option applies to both creating a new passkey and requesting an existing passkey. The default value is 32 bytes. +- **ServerDomain**: Gets or sets the effective Relying Party ID (domain) of the server. This should be unique and will be used as the identity for the server. This option applies to both creating a new passkey and requesting an existing passkey. If null, which is the default value, the server's origin is used. For more information, see Relying Party Identifier RP ID. + +**Example configuration:** + +```csharp +builder.Services.Configure(options => +{ + options.ServerDomain = "abp.io"; + options.AuthenticatorTimeout = TimeSpan.FromMinutes(3); + options.ChallengeSize = 64; +}); +``` + +For a complete list of configuration options, see [IdentityPasskeyOptions](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.identity.identitypasskeyoptions). For the most up-to-date browser defaults, see the [W3C WebAuthn specification](https://www.w3.org/TR/webauthn-3/). + +## HTTPS requirement + +All passkey operations require HTTPS. The implementation stores authentication data in encrypted and signed cookies that could be intercepted over unencrypted connections. + +## Browser Support + +Passkeys are supported in most modern browsers, including: Chrome, Edge, Firefox, and Safari. Ensure that you are using the latest version of your browser to take advantage of passkey functionality. + +## Additional resources + +For more information on WebAuthn and passkeys, refer to the following resources: + +- [Enable Web Authentication API (WebAuthn) passkeys](https://learn.microsoft.com/en-us/aspnet/core/security/authentication/passkeys) +- [Web Authentication API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API) diff --git a/docs/en/modules/ai-management/index.md b/docs/en/modules/ai-management/index.md index 0b36d0e539..e50253c22c 100644 --- a/docs/en/modules/ai-management/index.md +++ b/docs/en/modules/ai-management/index.md @@ -606,7 +606,7 @@ chatComponent.off('messageSent', callbackFunction); ## Using Dynamic Workspace Configurations for custom requirements The AI Management module allows you to access only configuration of a workspace without resolving pre-constructed chat client. This is useful when you want to use a workspace for your own purposes and you don't need to use the chat client. -The `IWorkspaceConfigurationStore` service is used to access the configuration of a workspace. It has multiple implementaations according to the usage scenario. +The `IWorkspaceConfigurationStore` service is used to access the configuration of a workspace. It has multiple implementations according to the usage scenario. ```csharp public class MyService @@ -832,4 +832,5 @@ The cache is automatically invalidated when workspaces are created, updated, or - [Artificial Intelligence Infrastructure](../../framework/infrastructure/artificial-intelligence/index.md): Learn about the underlying AI workspace infrastructure - [Microsoft.Extensions.AI](https://learn.microsoft.com/en-us/dotnet/ai/): Microsoft's unified AI abstractions +- [Microsoft Agent Framework](https://learn.microsoft.com/en-us/agent-framework/overview/agent-framework-overview): Microsoft's Agent Framework - [Semantic Kernel](https://learn.microsoft.com/en-us/semantic-kernel/): Microsoft's Semantic Kernel integration diff --git a/docs/en/modules/feature-management.md b/docs/en/modules/feature-management.md index 300b232f93..e80098a04d 100644 --- a/docs/en/modules/feature-management.md +++ b/docs/en/modules/feature-management.md @@ -72,9 +72,10 @@ namespace Demo ## Feature Management Providers -Features Management Module is extensible, just like the [features system](../framework/infrastructure/features.md). You can extend it by defining feature management providers. There are 3 pre-built feature management providers registered it the following order: +Features Management Module is extensible, just like the [features system](../framework/infrastructure/features.md). You can extend it by defining feature management providers. There are 4 pre-built feature management providers registered in the following order: * `DefaultValueFeatureManagementProvider`: Gets the value from the default value of the feature definition. It can not set the default value since default values are hard-coded on the feature definition. +* `ConfigurationFeatureManagementProvider`: Gets the value from the [IConfiguration service](../framework/fundamentals/configuration.md). * `EditionFeatureManagementProvider`: Gets or sets the feature values for an edition. Edition is a group of features assigned to tenants. Edition system has not implemented by the Tenant Management module. You can implement it yourself or purchase the ABP [SaaS Module](https://abp.io/modules/Volo.Saas) which implements it and also provides more SaaS features, like subscription and payment. * `TenantFeatureManagementProvider`: Gets or sets the features values for tenants. diff --git a/docs/en/modules/saas.md b/docs/en/modules/saas.md index cf88cf716a..7d78a4e9df 100644 --- a/docs/en/modules/saas.md +++ b/docs/en/modules/saas.md @@ -40,7 +40,7 @@ Firstly, Payment module must be configured properly: ```bash abp add-module Volo.Payment ``` - _Or you can install via using ABP Suite._ + _Or you can install via using ABP Studio._ - Configure Saas module to use Payment. diff --git a/docs/en/others/penetration-test-report.md b/docs/en/others/penetration-test-report.md index 13086fb2a0..cc80d39b8e 100644 --- a/docs/en/others/penetration-test-report.md +++ b/docs/en/others/penetration-test-report.md @@ -7,7 +7,7 @@ # ABP Penetration Test Report -The ABP Commercial MVC `v9.1.0` application template has been tested against security vulnerabilities by the [OWASP ZAP v2.14.0](https://www.zaproxy.org/) tool. The demo web application was started on the `https://localhost:44349` address. The below alerts have been reported by the pentest tool. These alerts are sorted by the risk level as high, medium, and low. The informational alerts are not mentioned in this document. +The ABP Commercial MVC `v10.0.1` application template has been tested against security vulnerabilities by the [OWASP ZAP v2.14.0](https://www.zaproxy.org/) tool. The demo web application was started on the `https://localhost:44349` address. The below alerts have been reported by the pentest tool. These alerts are sorted by the risk level as high, medium, and low. The informational alerts are not mentioned in this document. Many of these alerts are **false-positive**, meaning the vulnerability scanner detected these issues, but they are not exploitable. It's clearly explained for each false-positive alert why this alert is a false-positive. @@ -17,53 +17,75 @@ In the next sections, you will find the affected URLs, attack parameters (reques There are high _(red flag)_, medium _(orange flag)_, low _(yellow flag)_, and informational _(blue flag)_ alerts. -![penetration-test-9.1.0](../images/pen-test-alert-list-9.1.png) +![penetration-test-10.0.1](../images/pen-test-alert-list-10.1.png) -> The informational alerts are not mentioned in this document. These alerts are not raising any risks on your application and they are optional. +> The informational alerts are not mentioned in this document. These alerts don't raise any risks for your application and they are optional. -### Spring4Shell [Risk: High] - False Positive +### Cross Site Scripting (Reflected) [Risk: High] - Positive -- *[POST] - https://localhost:44349/Account/ForgotPassword* (attack: **class.module.classLoader.DefaultAssertionStatus=nonsense**) -- *[POST] - https://localhost:44349/Account/Login* (attack: **class.module.classLoader.DefaultAssertionStatus=nonsense**) -- *[POST] - https://localhost:44349/Account/Login?ReturnUrl=%2FSettingManagement* (attack: **class.module.classLoader.DefaultAssertionStatus=nonsense**) +- *[GET] - https://localhost:44349/Identity/OrganizationUnits/AddMemberModal?title=SelectAUser&organizationUnitId=...&OrganizationUnitName=%3C%2Fh5%3E%3CscrIpt%3Ealert%281%29%3B%3C%2FscRipt%3E%3Ch5%3E* +- *[GET] - https://localhost:44349/Identity/OrganizationUnits/AddRoleModal?organizationUnitId=...&OrganizationUnitName=%3C%2Fh5%3E%3CscrIpt%3Ealert%281%29%3B%3C%2FscRipt%3E%3Ch5%3E* +- *[GET] - https://localhost:44349/Saas/Host/Tenants/ImpersonateTenantModal?tenantId=...&tenantName=%3C%2Fh5%3E%3CscrIpt%3Ealert%281%29%3B%3C%2FscRipt%3E%3Ch5%3E* **Description**: -The application appears to be vulnerable to CVE-2022-22965 (otherwise known as Spring4Shell) - remote code execution (RCE) via data binding. +Cross-site Scripting (XSS) is an attack technique that involves echoing attacker-supplied code into a user's browser instance. **Explanation**: -ABP Framework is built on top of ASP.NET Core and does not use the Spring Framework. This application does not rely on Java-based technologies, making it immune to vulnerabilities like Spring4Shell. The detection is a false positive as there are no Spring dependencies in the project. +This is a **Positive** alert. The application reflects the `OrganizationUnitName` and `tenantName` parameters without proper encoding in the modal headers, allowing for the execution of arbitrary JavaScript. We have created an **internal issue** to track this vulnerability, and it will be fixed in the next release. -### Absence of Anti-CSRF Tokens [Risk: Medium] — False Positive +### PII Disclosure [Risk: High] - False Positive -* *[GET] - https://localhost:44349/Account/LinkUsers/LinkUsersModal?returnUrl=/SettingManagement* -* *[GET] — https://localhost:44349/Account/Manage* (same URL with different query parameters) -* *[GET] - https://localhost:44349/HostDashboard* -* *[GET] - https://localhost:44349/SettingManagement?handler=RenderView&id=Volo.Abp.Account* (other several URLs) +- *[GET] - https://localhost:44349/* (Evidence: 639002492030480000) +- *[GET] - https://localhost:44349/?page=...* -**Description**: +**Description**: -No Anti-CSRF tokens were found in an HTML submission form. -A cross-site request forgery is an attack that involves forcing a victim to send an HTTP request to a target destination without their knowledge or intent in order to perform an action as the victim. The underlying cause is application functionality using predictable URL/form actions in a repeatable way. The nature of the attack is that CSRF exploits the trust that a website has for a user. By contrast, cross-site scripting (XSS) exploits the trust that a user has in a website. Like XSS, CSRF attacks are not necessarily cross-site, but they can be. Cross-site request forgery is also known as CSRF, XSRF, one-click attack, session riding, confused deputy, and sea surf. +The response contains Personally Identifiable Information, such as CC number, SSN and similar sensitive data. -**Explanation:** +**Explanation**: -This is a **false-positive** alert because ABP provides the Anti-CSRF token via a cookie as seen on the following screenshot: +This is a **false-positive** alert. The detected numbers (e.g., `639002492030480000`) are cache-busting timestamps (`_v` parameter) generated by the framework for static assets. They coincidentally match the pattern of Credit Card numbers (pattern matching) but are not sensitive data. -![Absence of Anti-CSRF Token](../images/pen-test-alert-remote-os-command-injection.png) +### Path Traversal [Risk: High] - False Positive -### Application Error Disclosure [Risk: Medium] - False Positive +- *[GET] - https://localhost:44349/Account/Login?returnUrl=Login* +- *[GET] - https://localhost:44349/api/account/security-logs?action=\security-logs* -- *[GET] — https://localhost:44349/AuditLogs* +**Description**: -**Description**: +The Path Traversal attack technique allows an attacker access to files, directories, and commands that potentially reside outside the web document root directory. + +**Explanation**: + +This is a **false-positive** alert. ABP Framework automatically validates `returnUrl` parameters and ensures they are local to the application or within a whitelist. The application does not return file contents based on these parameters. + +### SQL Injection [Risk: High] - False Positive + +- *[GET] - https://localhost:44349/AbpPermissionManagement/PermissionManagementModal?providerKey=AbpSolution16711_Swagger+AND+1%3D1+--+* +- *[GET] - https://localhost:44349/Account/Manage?CurrentPassword=ZAP%27+AND+%271%27%3D%271%27+--+* + +**Description**: + +SQL injection may be possible. -This page contains an error/warning message that may disclose sensitive information like the location of the file that produced the unhandled exception. This information can be used to launch further attacks against the web application. The alert could be a false positive if the error message is found inside a documentation page. +**Explanation**: + +This is a **false-positive** alert. ABP Framework uses Entity Framework Core, which inherently uses parameterized queries, preventing standard SQL injection attacks. Manual verification showed that injecting SQL syntax into parameters like `providerKey` results in the input being treated as a literal string (resulting in no match or default behavior) rather than altering the query structure. + +### SQL Injection - SQLite [Risk: High] - False Positive + +- *[POST] - https://localhost:44349/Account/ForgotPassword?returnUrl=%2FAccount%2FManage* (Attack: `case randomblob(100000) ...`) +- *[POST] - https://localhost:44349/FeatureManagement/FeatureManagementModal* + +**Description**: + +SQL injection may be possible. **Explanation**: -There are only one URL that is reported as exposing error messages. This is a **false-positive** alert. The [Audit Logging Module](../modules/audit-logging.md), shows request & response details and exception information, these are not sensitive information and only can be seen by the users whose related permissions are granted. +This is a **false-positive** alert. Similar to the standard SQL Injection alert, the application uses parameterized queries. The detected delays are likely due to application processing variations or network latency rather than successful SQL injection. ### Content Security Policy (CSP) Header Not Set [Risk: Medium] — Positive (Fixed) @@ -238,23 +260,7 @@ A cookie has been set with its `SameSite` attribute set to `none`, which means t Ensure that the `SameSite` attribute is set to either `lax` or ideally `strict` for all cookies. We discussed setting the **SameSite** attribute to `strict` in the following issue [github.com/abpframework/abp/issues/14215](https://github.com/abpframework/abp/issues/14215) and decided to leave this change to the final developer. -### Information Disclosure - Debug Error Messages [Risk: Low] — False Positive - -* *[GET] - https://localhost:44349/AuditLogs* - -**Description:** - -The response appeared to contain common error messages returned by platforms such as ASP.NET, and Web-servers such as IIS and Apache. You can configure the list of common debug messages. - -**Solution:** - -Disable debugging messages before pushing them to production. - -**Explanation:** - -The response of the endpoints above return localization texts which are not real error messages. As there is no real error in the backend side, this vulnerability is a **false-positive** alert. -![Information Disclosure - Debug Error Messages](../images/pen-test-information-disclosure.png) ### Strict-Transport-Security Header Not Set [Risk: Low] - False Positive diff --git a/docs/en/solution-templates/microservice/aspire-integration.md b/docs/en/solution-templates/microservice/aspire-integration.md new file mode 100644 index 0000000000..2da2706b34 --- /dev/null +++ b/docs/en/solution-templates/microservice/aspire-integration.md @@ -0,0 +1,372 @@ +```json +//[doc-seo] +{ + "Description": "Learn how to integrate .NET Aspire into your ABP-based solution for streamlined development, orchestration, and observability of distributed applications." +} +``` + +# .NET Aspire Integration + +````json +//[doc-nav] +{ + "Next": { + "Name": "Miscellaneous guides in the Microservice solution", + "Path": "solution-templates/microservice/guides" + } +} +```` + +> You must have an ABP Business or a higher license to be able to create a microservice solution. + +## .NET Aspire Overview + +[Aspire](https://aspire.dev/get-started/what-is-aspire/) streamlines building, running, debugging, and deploying distributed apps. Picture your app as a set of services, databases, and frontends—when they’re deployed, they all work together seamlessly, but every time you develop them they need to be individually started and connected. With Aspire, you get a unified toolchain that eliminates complex configs and makes local debugging effortless. Instantly launch and debug your entire app with a single command. Ready to deploy? Aspire lets you publish anywhere—Kubernetes, the cloud, or your own servers. It’s also fully extensible, so you can integrate your favorite tools and services with ease. It provides: + +- **Orchestration**: A code-first approach to defining and running distributed applications, managing dependencies, and launch order. +- **Integrations**: Pre-built components for common services (databases, caches, message brokers) with automatic configuration. +- **Tooling**: A developer dashboard for real-time monitoring of logs, traces, metrics, and resource health. +- **Service Discovery**: Automatic service-to-service communication without hardcoded endpoints. +- **Observability**: Built-in OpenTelemetry support for distributed tracing, metrics, and structured logging. + +## ABP Integration + +When you enable .NET Aspire in an ABP microservice solution, you get a fully integrated development experience where: + +- All microservices, gateways, and applications are orchestrated through a single entry point (AppHost). +- Infrastructure containers (databases, Redis, RabbitMQ, Elasticsearch, etc.) are managed as code. +- OpenTelemetry, health checks, and service discovery are automatically configured for all projects via the shared ServiceDefaults project. + +## Enabling Aspire + +When creating a new microservice solution via ABP Studio: + +1. In the solution creation wizard, look for the **".NET Aspire Integration"** step. +2. Toggle the option to **enable .NET Aspire**. +3. Complete the wizard—Aspire projects will be generated along with your solution. + +![Enable Aspire in ABP Studio](images/aspire-configuration.png) + +## Solution Structure Changes + +When Aspire is enabled, two additional projects are added to your solution: + +![Aspire Solution Structure](images/aspire-solution-structure.png) + +### AppHost (Orchestrator) + +[`AppHost`](https://aspire.dev/get-started/app-host/) is the .NET Aspire orchestrator project that declares all resources (services, databases, containers, applications) and their dependencies in C# code. All services, gateways, and applications in the solution have their project references added to `AppHost`. + +**Why is it added?** + +- Centralized orchestration: Start your entire microservice ecosystem with a single command. +- Code-first infrastructure: Databases, Redis, RabbitMQ, Elasticsearch, and observability tools are defined programmatically. +- Dependency management: `AppHost` ensures services start in the correct order using `WaitFor()` declarations. +- Automatic configuration: Connection strings, endpoints, and environment variables are injected automatically. + +**Key files in AppHost:** +| File | Purpose | +|--------|------------| +| `AppHost.cs` | Entry point—creates the distributed application builder and adds all resources | +| `AppHostExtensions.cs` | Extension methods for adding infrastructures, databases, microservices, gateways, and applications | + +**What it manages:** + +- Database servers (SQL Server, PostgreSQL, MySQL, or MongoDB) +- Per-service databases +- Redis (caching) +- RabbitMQ (messaging) +- Elasticsearch + Kibana (logging) +- Prometheus + Grafana (metrics) +- Jaeger (tracing) +- OpenTelemetry Collector +- All microservices, gateways, and web applications + +![Aspire AppHost Resource Topology](images/aspire-apphost-topology.png) + +### ServiceDefaults + +[`ServiceDefaults`](https://aspire.dev/fundamentals/service-defaults/) is a shared library that provides common cloud-native configuration for all projects in the solution. The `ServiceDefaults` project reference is added to all services, gateways, and applications in the solution. + +**Why is it added?** + +- Consistency: Every service uses the same observability, health check, and resilience patterns. +- Less boilerplate: Add `builder.AddServiceDefaults()` once, get all defaults automatically. +- Production-ready: OpenTelemetry, health endpoints, and HTTP resilience are preconfigured. + +**What it provides:** + +| Feature | Description | +|---------|-------------| +| OpenTelemetry | Tracing, metrics, and structured logging with automatic instrumentation | +| Health Checks | `/health` and `/alive` endpoints for Kubernetes-style probes | +| Service Discovery | Automatic resolution of service endpoints | +| HTTP Resilience | Retry policies, timeouts, and circuit breakers for HTTP clients | + +**Usage example:** + +```csharp +var builder = WebApplication.CreateBuilder(args); +builder.AddServiceDefaults(); // Adds all cloud-native defaults +// ... rest of configuration +``` + +## Running the Solution + +### Without Aspire + +1. Open **Solution Runner** in ABP Studio. +2. Start all resources in Solution Runner (services, gateways, applications, and tools such as databases, Redis, RabbitMQ, etc.) individually or collectively using the `Default` profile. + +![Solution Runner without Aspire](images/solution-runner-default-profile.png) + +### With Aspire +1. Open **Solution Runner** in ABP Studio. +2. Select the **Aspire** profile. +3. Run `MyCompanyName.MyProjectName.AppHost`. +4. AppHost automatically: + - Starts all infrastructure containers (database, Redis, RabbitMQ, Elasticsearch, etc.). + - Launches all microservices, gateways, and applications in dependency order. + - Injects connection strings and environment variables. + - Opens the Aspire Dashboard for monitoring. + +![Solution Runner with Aspire](images/solution-runner-aspire-profile.png) + +## Aspire Dashboard + +The dashboard enables real-time tracking of key aspects of your app, including logs, traces, and environment configurations. It's designed to enhance the development experience by providing a clear and insightful view of your app's state and structure. + +Key features of the dashboard include: + +- Real-time tracking of logs, traces, and environment configurations. +- User interface to stop, start, and restart resources. +- Collects and displays logs and telemetry; view structured logs, traces, and metrics in an intuitive UI. +- Enhanced debugging with GitHub Copilot, your AI-powered assistant built into the dashboard. + +### Opening the Dashboard + +When AppHost starts, the Aspire Dashboard opens automatically in ABP Studio's built-in browser at `https://localhost:15105`. Alternatively, you can right-click on AppHost in Solution Runner and select **Browse** to open it manually. + +![Aspire Dashboard Login](images/aspire-dashboard-login.png) + +**Dashboard login token**: `1q2w3E*` (default, configurable via launch settings) + +### Dashboard Features + +The dashboard includes several tabs, each offering different insights into your application: + +#### Resources + +View the status of all resources in your application, including projects, containers, and executables. Monitor health checks, view environment variables, and access endpoints for each resource. + +![Aspire Dashboard Resources Tab](images/aspire-dashboard-resources.png) + +#### Console + +Display console logs from all resources in real-time. Filter by resource and log level to quickly find relevant information during development and debugging. + +![Aspire Dashboard Console Tab](images/aspire-dashboard-console.png) + +#### Structured Logs + +View structured logs from all resources with advanced filtering capabilities. Search and filter logs by resource, log level, timestamp, and custom properties to diagnose issues efficiently. + +![Aspire Dashboard Structured Logs Tab](images/aspire-dashboard-structured-logs.png) + +#### Traces + +Explore distributed traces across your microservices to understand request flows and identify performance bottlenecks. Visualize how requests propagate through different services and examine timing information. + +![Aspire Dashboard Traces Tab](images/aspire-dashboard-traces.png) + +#### Metrics + +Monitor real-time metrics including HTTP requests, response times, garbage collection, memory usage, and custom metrics. Visualize metric trends with interactive charts to understand application performance. + +![Aspire Dashboard Metrics Tab](images/aspire-dashboard-metrics.png) + +## Tools and Their Management UIs + +AppHost pre-configures the following observability and tools. The URLs below are for their **management/dashboard interfaces** (these tools may expose additional internal endpoints for service communication). + +All URLs and configurations are defined in the `AppHost` project. If you need to change ports or other settings, you can modify them in the `AppHost` project. + +After running AppHost, you can access these tools either by opening the URLs directly in your browser or via Solution Runner **Tools** tab. + +### Database Management System Admin Tool + +The database management admin tool varies by database type: + +| Database | Tool | URL | +|----------|------|-----| +| SQL Server | DBeaver CloudBeaver | `http://localhost:8081` | +| MySQL | phpMyAdmin | `http://localhost:8082` | +| PostgreSQL | pgAdmin | `http://localhost:8083` | +| MongoDB | Mongo Express | `http://localhost:8084` | + +For example, if using PostgreSQL, access **pgAdmin** at `http://localhost:8083` or via Solution Runner Tools tab: + +![pgAdmin Dashboard](images/aspire-database-postgre-pgadmin.png) + + +### Grafana + +**URL**: `http://localhost:3001` +**Credentials**: `admin` / `admin` + +Grafana is a visualization and analytics platform for monitoring metrics. It provides interactive dashboards with charts and graphs for tracking application performance. + +![Grafana Dashboard](images/aspire-grafana-dashboard.png) + +### Jaeger + +**URL**: `http://localhost:16686` +**Credentials**: No authentication required + +Jaeger is a distributed tracing system to monitor and troubleshoot problems on interconnected software components called microservices. + +![Jaeger Traces](images/aspire-jaeger-traces.png) + +### Kibana + +**URL**: `http://localhost:5601` +**Credentials**: No authentication required + +Kibana is a visualization tool for Elasticsearch data. It provides search and data visualization capabilities for logs stored in Elasticsearch. + +![Kibana Dashboard](images/aspire-kibana-dashboard.png) + +### Prometheus + +**URL**: `http://localhost:9090` +**Credentials**: No authentication required + +Prometheus is a monitoring and alerting toolkit. It collects and stores metrics as time series data, allowing you to query and analyze application performance. + +![Prometheus Dashboard](images/aspire-prometheus-dashboard.png) + +### RabbitMQ Management + +**URL**: `http://localhost:15672` +**Credentials**: `guest` / `guest` + +RabbitMQ Management UI provides a web-based interface for managing and monitoring RabbitMQ message broker, including queues, exchanges, and message flows. + +![RabbitMQ Management](images/aspire-rabbitmq-management.png) + +### Redis Insight + +**URL**: `http://localhost:5540` +**Credentials**: No authentication required + +Redis Insight is a visual tool for Redis that allows you to browse data, run commands, and monitor Redis performance. + +![Redis Insight](images/aspire-redis-insight.png) + +## Adding New Services, Gateways, or Applications + +When you add a new microservice, gateway, or application via **ABP Studio**: + +1. `AppHost` is updated automatically - the new project is registered as a resource with appropriate configurations. +2. `ServiceDefaults` is referenced - the new project gets cloud-native defaults. + +> You don't need to manually edit `AppHost` in most cases. + +## Adding a Resource Manually + +If you need to add a resource manually (not via **ABP Studio**), follow these steps: + +### 1. Reference ServiceDefaults in your new project + +```xml + +``` + +> Adjust the path as necessary based on your solution structure. + +### 2. Add ServiceDefaults in Program.cs + +```csharp +var builder = WebApplication.CreateBuilder(args); +builder.AddServiceDefaults(); +// ... your configuration +``` + +### 3. Add Project Reference to AppHost + +Add a reference to your resource project in `MySolutionName.MyProjectName.AppHost/MySolutionName.MyProjectName.AppHost.csproj`: + +```xml + +``` + +### 4. Register Resource in AppHost + +Edit `AppHostExtensions.cs` and add your resource in the `AddAdditionalResources` method: + +```csharp +var myResource = builder + .AddProject("myresource", "MySolutionName.MyProjectName.MyResource") + .WaitFor(databases.AdministrationDb) + .WaitFor(databases.IdentityDb) + .WaitFor(databases.MyResourceDb) + .WaitFor(databases.AuditLoggingDb) + .WaitFor(databases.SaasDb) + .WaitFor(databases.LanguageManagementDb) + .WaitFor(redis) + .WaitFor(rabbitMq) + .WithReference(databases.AdministrationDb) + .WithReference(databases.IdentityDb) + .WithReference(databases.BlobStoringDb) + .WithReference(databases.MyResourceDb) + .WithReference(databases.AuditLoggingDb) + .WithReference(databases.SaasDb) + .WithReference(databases.LanguageManagementDb) + .ConfigureRabbitMq(rabbitMq, infrastructureDefaultUser, infrastructureDefaultUserPassword) + .ConfigureRedis(redis) + .ConfigureElasticSearch(elasticsearch); +applicationResources["MyResource"] = myResource; +``` +> Adjust the dependencies and configurations as necessary. + +### 5. Configure Gateway (if needed) + +If your resource should be accessible through a gateway, add the gateway configuration in the `AddAdditionalResources` method: + +```csharp +var webgateway = applicationResources.FirstOrDefault(x => x.Key == "WebGateway").Value; +if (webgateway != null) +{ + webgateway + .WaitFor(applicationResources["MyResource"]) + .WithReference(applicationResources["MyResource"]) + .WithEnvironment("ReverseProxy__Clusters__MyResource__Destinations__MyResource__Address", "http://MyResource"); +} +``` + +### 6. Configure Authentication Server (if needed) + +If your resource needs to be added to `CORS` and `RedirectAllowedUrls` configuration for the authentication server, update the `allowedUrls` variable in the `ConfigureAuthServer` method: + +```csharp +var allowedUrls = ReferenceExpression.Create($"{applicationResources["MyResource"].GetEndpoint("http")},..."); +``` + +### 7. Add Database (if needed) + +If your resource requires a dedicated database, add it in the `AddDatabases` method: + +```csharp +var myResourceDb = databaseServers.Postgres.AddDatabase("MyResource", "MySolutionName.MyProjectName_MyResource"); +``` +> Adjust the database management system as necessary. + +### 8. Add to Solution Runner Profiles (optional) + +To run your resource in **Solution Runner** profiles(Default or Aspire), add it following the instructions in the [Studio running applications documentation](../../studio/running-applications.md#add). + +## Deploying the Application + +.NET Aspire supports deployment to Azure Container Apps, Kubernetes, and other cloud platforms. For detailed deployment guidance, see the official documentation: [.NET Aspire Deployment](https://aspire.dev/deployment/overview/) + +To learn more about .NET Aspire, visit: https://aspire.dev/get-started/what-is-aspire/ diff --git a/docs/en/solution-templates/microservice/helm-charts-and-kubernetes.md b/docs/en/solution-templates/microservice/helm-charts-and-kubernetes.md index 46da70e88c..041ac00712 100644 --- a/docs/en/solution-templates/microservice/helm-charts-and-kubernetes.md +++ b/docs/en/solution-templates/microservice/helm-charts-and-kubernetes.md @@ -11,8 +11,8 @@ //[doc-nav] { "Next": { - "Name": "Miscellaneous guides in the Microservice solution", - "Path": "solution-templates/microservice/guides" + "Name": "Aspire Integration in the Microservice solution", + "Path": "solution-templates/microservice/aspire-integration" } } ```` diff --git a/docs/en/solution-templates/microservice/images/aspire-apphost-topology.png b/docs/en/solution-templates/microservice/images/aspire-apphost-topology.png new file mode 100644 index 0000000000..ae571b64e7 Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-apphost-topology.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-configuration.png b/docs/en/solution-templates/microservice/images/aspire-configuration.png new file mode 100644 index 0000000000..74cd5066bb Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-configuration.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-console.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-console.png new file mode 100644 index 0000000000..8d9d088511 Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-console.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-login.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-login.png new file mode 100644 index 0000000000..a3c6ead56b Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-login.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-metrics.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-metrics.png new file mode 100644 index 0000000000..b49ea441b4 Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-metrics.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-resources.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-resources.png new file mode 100644 index 0000000000..ea8c3bf017 Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-resources.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-structured-logs.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-structured-logs.png new file mode 100644 index 0000000000..2e732f462b Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-structured-logs.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-traces.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-traces.png new file mode 100644 index 0000000000..d099f8659a Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-traces.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-database-postgre-pgadmin.png b/docs/en/solution-templates/microservice/images/aspire-database-postgre-pgadmin.png new file mode 100644 index 0000000000..de857c876d Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-database-postgre-pgadmin.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-grafana-dashboard.png b/docs/en/solution-templates/microservice/images/aspire-grafana-dashboard.png new file mode 100644 index 0000000000..42072e3337 Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-grafana-dashboard.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-jaeger-traces.png b/docs/en/solution-templates/microservice/images/aspire-jaeger-traces.png new file mode 100644 index 0000000000..da6b87412c Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-jaeger-traces.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-kibana-dashboard.png b/docs/en/solution-templates/microservice/images/aspire-kibana-dashboard.png new file mode 100644 index 0000000000..7a31ff4fac Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-kibana-dashboard.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-prometheus-dashboard.png b/docs/en/solution-templates/microservice/images/aspire-prometheus-dashboard.png new file mode 100644 index 0000000000..c1f4de5b5c Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-prometheus-dashboard.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-rabbitmq-management.png b/docs/en/solution-templates/microservice/images/aspire-rabbitmq-management.png new file mode 100644 index 0000000000..77438c9b08 Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-rabbitmq-management.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-redis-insight.png b/docs/en/solution-templates/microservice/images/aspire-redis-insight.png new file mode 100644 index 0000000000..37780b38b0 Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-redis-insight.png differ diff --git a/docs/en/solution-templates/microservice/images/aspire-solution-structure.png b/docs/en/solution-templates/microservice/images/aspire-solution-structure.png new file mode 100644 index 0000000000..3379892b69 Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-solution-structure.png differ diff --git a/docs/en/solution-templates/microservice/images/solution-runner-aspire-profile.png b/docs/en/solution-templates/microservice/images/solution-runner-aspire-profile.png new file mode 100644 index 0000000000..d11edfe584 Binary files /dev/null and b/docs/en/solution-templates/microservice/images/solution-runner-aspire-profile.png differ diff --git a/docs/en/solution-templates/microservice/images/solution-runner-default-profile.png b/docs/en/solution-templates/microservice/images/solution-runner-default-profile.png new file mode 100644 index 0000000000..6867a43872 Binary files /dev/null and b/docs/en/solution-templates/microservice/images/solution-runner-default-profile.png differ diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionChangedEvent.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionChangedEvent.cs new file mode 100644 index 0000000000..6bc7b5f165 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionChangedEvent.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Abp.Authorization.Permissions; + +[Serializable] +public class StaticPermissionDefinitionChangedEvent +{ + +} diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs index 5ac2257060..2f95f3fef6 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs @@ -6,76 +6,72 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; +using Volo.Abp.StaticDefinitions; namespace Volo.Abp.Authorization.Permissions; public class StaticPermissionDefinitionStore : IStaticPermissionDefinitionStore, ISingletonDependency { - protected IDictionary PermissionGroupDefinitions => _lazyPermissionGroupDefinitions.Value.Item1; - private readonly Lazy<(Dictionary, List)> _lazyPermissionGroupDefinitions; - - protected IDictionary PermissionDefinitions => _lazyPermissionDefinitions.Value; - private readonly Lazy> _lazyPermissionDefinitions; - - protected IList ResourcePermissionDefinitions => _lazyPermissionGroupDefinitions.Value.Item2; - + protected IServiceProvider ServiceProvider { get; } protected AbpPermissionOptions Options { get; } - - private readonly IServiceProvider _serviceProvider; + protected IStaticDefinitionCache, List)> GroupCache { get; } + protected IStaticDefinitionCache> DefinitionCache { get; } public StaticPermissionDefinitionStore( IServiceProvider serviceProvider, - IOptions options) + IOptions options, + IStaticDefinitionCache, List)> groupCache, + IStaticDefinitionCache> definitionCache) { - _serviceProvider = serviceProvider; + ServiceProvider = serviceProvider; Options = options.Value; + GroupCache = groupCache; + DefinitionCache = definitionCache; + } - _lazyPermissionDefinitions = new Lazy>( - CreatePermissionDefinitions, - isThreadSafe: true - ); - - _lazyPermissionGroupDefinitions = new Lazy<(Dictionary, List)>( - CreatePermissionGroupDefinitions, - isThreadSafe: true - ); + public async Task GetOrNullAsync(string name) + { + var defs = await GetPermissionDefinitionsAsync(); + return defs.GetOrDefault(name); } - protected virtual Dictionary CreatePermissionDefinitions() + public virtual async Task> GetPermissionsAsync() { - var permissions = new Dictionary(); + var defs = await GetPermissionDefinitionsAsync(); + return defs.Values.ToImmutableList(); + } - foreach (var groupDefinition in PermissionGroupDefinitions.Values) - { - foreach (var permission in groupDefinition.Permissions) - { - AddPermissionToDictionaryRecursively(permissions, permission); - } - } + public virtual async Task GetResourcePermissionOrNullAsync(string resourceName, string name) + { + var (_, resourcePermissions) = await GetPermissionGroupDefinitionsAsync(); + return resourcePermissions.FirstOrDefault(p => p.ResourceName == resourceName && p.Name == name); + } - return permissions; + public virtual async Task> GetResourcePermissionsAsync() + { + var (_, resourcePermissions) = await GetPermissionGroupDefinitionsAsync(); + return resourcePermissions.ToImmutableList(); } - protected virtual void AddPermissionToDictionaryRecursively( - Dictionary permissions, - PermissionDefinition permission) + public async Task> GetGroupsAsync() { - if (permissions.ContainsKey(permission.Name)) - { - throw new AbpException("Duplicate permission name: " + permission.Name); - } + var (groups, _) = await GetPermissionGroupDefinitionsAsync(); + return groups.Values.ToImmutableList(); + } - permissions[permission.Name] = permission; + protected virtual async Task<(Dictionary, List)> GetPermissionGroupDefinitionsAsync() + { + return await GroupCache.GetOrCreateAsync(CreatePermissionGroupDefinitionsAsync); + } - foreach (var child in permission.Children) - { - AddPermissionToDictionaryRecursively(permissions, child); - } + protected virtual async Task> GetPermissionDefinitionsAsync() + { + return await DefinitionCache.GetOrCreateAsync(CreatePermissionDefinitionsAsync); } - protected virtual (Dictionary, List) CreatePermissionGroupDefinitions() + protected virtual Task<(Dictionary, List)> CreatePermissionGroupDefinitionsAsync() { - using (var scope = _serviceProvider.CreateScope()) + using (var scope = ServiceProvider.CreateScope()) { var context = new PermissionDefinitionContext(scope.ServiceProvider); @@ -104,38 +100,40 @@ public class StaticPermissionDefinitionStore : IStaticPermissionDefinitionStore, context.CurrentProvider = null; - return (context.Groups, context.ResourcePermissions); + return Task.FromResult((context.Groups, context.ResourcePermissions)); } } - public Task GetOrNullAsync(string name) + protected virtual async Task> CreatePermissionDefinitionsAsync() { - return Task.FromResult(PermissionDefinitions.GetOrDefault(name)); - } + var permissions = new Dictionary(); - public virtual Task> GetPermissionsAsync() - { - return Task.FromResult>( - PermissionDefinitions.Values.ToImmutableList() - ); - } + var (groups, _) = await GetPermissionGroupDefinitionsAsync(); + foreach (var groupDefinition in groups.Values) + { + foreach (var permission in groupDefinition.Permissions) + { + AddPermissionToDictionaryRecursively(permissions, permission); + } + } - public virtual Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - return Task.FromResult(ResourcePermissionDefinitions.FirstOrDefault(p => p.ResourceName == resourceName && p.Name == name)); + return permissions; } - public virtual Task> GetResourcePermissionsAsync() + protected virtual void AddPermissionToDictionaryRecursively( + Dictionary permissions, + PermissionDefinition permission) { - return Task.FromResult>( - ResourcePermissionDefinitions.ToImmutableList() - ); - } + if (permissions.ContainsKey(permission.Name)) + { + throw new AbpException("Duplicate permission name: " + permission.Name); + } - public Task> GetGroupsAsync() - { - return Task.FromResult>( - PermissionGroupDefinitions.Values.ToImmutableList() - ); + permissions[permission.Name] = permission; + + foreach (var child in permission.Children) + { + AddPermissionToDictionaryRecursively(permissions, child); + } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs index 0f2b287d67..5814ac4a71 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs @@ -18,8 +18,9 @@ public static class ProjectNameValidator private static readonly string[] IllegalKeywords = new[] { + "MauiBlazor", "Blazor" - }; + }; private static void ValidateParentDirectoryString(string projectName) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs index be28f569ea..5ed5561e0e 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs @@ -5,6 +5,7 @@ using Volo.Abp.Logging; using Volo.Abp.Modularity; using Volo.Abp.Reflection; using Volo.Abp.SimpleStateChecking; +using Volo.Abp.StaticDefinitions; namespace Volo.Abp.Internal; @@ -42,7 +43,7 @@ internal static class InternalServiceCollectionExtensions services.AddAssemblyOf(); services.AddTransient(typeof(ISimpleStateCheckerManager<>), typeof(SimpleStateCheckerManager<>)); - + services.AddSingleton(typeof(IStaticDefinitionCache<,>), typeof(StaticDefinitionCache<,>)); services.Configure(options => { options.Contributors.Add(); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/StaticDefinitions/IStaticDefinitionCache.cs b/framework/src/Volo.Abp.Core/Volo/Abp/StaticDefinitions/IStaticDefinitionCache.cs new file mode 100644 index 0000000000..0f4bb5b5a8 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/StaticDefinitions/IStaticDefinitionCache.cs @@ -0,0 +1,11 @@ +using System; +using System.Threading.Tasks; + +namespace Volo.Abp.StaticDefinitions; + +public interface IStaticDefinitionCache +{ + Task GetOrCreateAsync(Func> factory); + + Task ClearAsync(); +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/StaticDefinitions/StaticDefinitionCache.cs b/framework/src/Volo.Abp.Core/Volo/Abp/StaticDefinitions/StaticDefinitionCache.cs new file mode 100644 index 0000000000..4f6a9bebe4 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/StaticDefinitions/StaticDefinitionCache.cs @@ -0,0 +1,30 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.StaticDefinitions; + +public class StaticDefinitionCache : IStaticDefinitionCache +{ + private Lazy>? _lazy; + + public virtual async Task GetOrCreateAsync(Func> factory) + { + var lazy = _lazy; + if (lazy != null) + { + return await lazy.Value; + } + + var newLazy = new Lazy>(factory, LazyThreadSafetyMode.ExecutionAndPublication); + lazy = Interlocked.CompareExchange(ref _lazy, newLazy, null) ?? newLazy; + + return await lazy.Value; + } + + public virtual Task ClearAsync() + { + Interlocked.Exchange(ref _lazy, null); + return Task.CompletedTask; + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpEntityFrameworkCoreSqliteModule.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpEntityFrameworkCoreSqliteModule.cs index 6b767ceee4..87d58f2a82 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpEntityFrameworkCoreSqliteModule.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpEntityFrameworkCoreSqliteModule.cs @@ -1,3 +1,5 @@ +using System.Linq; +using Microsoft.EntityFrameworkCore.Sqlite.Infrastructure.Internal; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.EntityFrameworkCore.GlobalFilters; using Volo.Abp.EntityFrameworkCore.Interceptors; @@ -32,7 +34,10 @@ public class AbpEntityFrameworkCoreSqliteModule : AbpModule { options.ConfigureDefaultOnConfiguring((dbContext, dbContextOptionsBuilder) => { - dbContextOptionsBuilder.AddInterceptors(new SqliteBusyTimeoutSaveChangesInterceptor(sqliteOptions.BusyTimeout.Value)); + if (dbContextOptionsBuilder.Options.Extensions.Any(extension => extension is SqliteOptionsExtension)) + { + dbContextOptionsBuilder.AddInterceptors(new SqliteBusyTimeoutSaveChangesInterceptor(sqliteOptions.BusyTimeout.Value)); + } }, overrideExisting: false); }); } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index f99d9130bd..6a5b608c76 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -686,6 +686,12 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, return; } + string? concurrencyStamp = null; + if (entry.Entity is IHasConcurrencyStamp hasConcurrencyStamp) + { + concurrencyStamp = hasConcurrencyStamp.ConcurrencyStamp; + } + ExtraPropertyDictionary? originalExtraProperties = null; if (entry.Entity is IHasExtraProperties) { @@ -694,6 +700,11 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, entry.Reload(); + if (concurrencyStamp != null && entry.Entity is IHasConcurrencyStamp) + { + ObjectHelper.TrySetProperty(entry.Entity.As(), x => x.ConcurrencyStamp, () => concurrencyStamp); + } + if (entry.Entity is IHasExtraProperties) { ObjectHelper.TrySetProperty(entry.Entity.As(), x => x.ExtraProperties, () => originalExtraProperties); diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs index d50e6b89f6..f87a05e4a9 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs @@ -198,6 +198,13 @@ public class EntityHistoryHelper : IEntityHistoryHelper, ITransientDependency { foreach (var (navigationEntry, index) in entityEntry.Navigations.Select((value, i) => ( value, i ))) { + var propertyInfo = navigationEntry.Metadata.PropertyInfo; + if (propertyInfo != null && + propertyInfo.IsDefined(typeof(DisableAuditingAttribute), true)) + { + continue; + } + if (AbpEfCoreNavigationHelper.IsNavigationEntryModified(entityEntry, index)) { var abpNavigationEntry = AbpEfCoreNavigationHelper.GetNavigationEntry(entityEntry, index); diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs index cde88956b5..ab39c1aba7 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs @@ -31,6 +31,7 @@ public class AbpFeaturesModule : AbpModule context.Services.Configure(options => { options.ValueProviders.Add(); + options.ValueProviders.Add(); options.ValueProviders.Add(); options.ValueProviders.Add(); }); diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/ConfigurationFeatureValueProvider.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/ConfigurationFeatureValueProvider.cs new file mode 100644 index 0000000000..7309e99b6f --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/ConfigurationFeatureValueProvider.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; + +namespace Volo.Abp.Features; + +public class ConfigurationFeatureValueProvider : FeatureValueProvider +{ + public const string ConfigurationNamePrefix = "Features:"; + + public const string ProviderName = "C"; + + public override string Name => ProviderName; + + protected IConfiguration Configuration { get; } + + public ConfigurationFeatureValueProvider(IFeatureStore featureStore, IConfiguration configuration) + : base(featureStore) + { + Configuration = configuration; + } + + public override Task GetOrNullAsync(FeatureDefinition feature) + { + return Task.FromResult(Configuration[ConfigurationNamePrefix + feature.Name]); + } +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/StaticFeatureDefinitionChangedEvent.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/StaticFeatureDefinitionChangedEvent.cs new file mode 100644 index 0000000000..e654516d98 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/StaticFeatureDefinitionChangedEvent.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Abp.Features; + +[Serializable] +public class StaticFeatureDefinitionChangedEvent +{ + +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/StaticFeatureDefinitionStore.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/StaticFeatureDefinitionStore.cs index d0647168d3..12c21b3987 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/StaticFeatureDefinitionStore.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/StaticFeatureDefinitionStore.cs @@ -5,37 +5,27 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; +using Volo.Abp.StaticDefinitions; namespace Volo.Abp.Features; public class StaticFeatureDefinitionStore: IStaticFeatureDefinitionStore, ISingletonDependency { - protected IDictionary FeatureGroupDefinitions => _lazyFeatureGroupDefinitions.Value; - private readonly Lazy> _lazyFeatureGroupDefinitions; - - protected IDictionary FeatureDefinitions => _lazyFeatureDefinitions.Value; - private readonly Lazy> _lazyFeatureDefinitions; - + protected IServiceProvider ServiceProvider { get; } protected AbpFeatureOptions Options { get; } - - private readonly IServiceProvider _serviceProvider; + protected IStaticDefinitionCache> GroupCache { get; } + protected IStaticDefinitionCache> DefinitionCache { get; } public StaticFeatureDefinitionStore( + IServiceProvider serviceProvider, IOptions options, - IServiceProvider serviceProvider) + IStaticDefinitionCache> groupCache, + IStaticDefinitionCache> definitionCache) { - _serviceProvider = serviceProvider; + ServiceProvider = serviceProvider; Options = options.Value; - - _lazyFeatureDefinitions = new Lazy>( - CreateFeatureDefinitions, - isThreadSafe: true - ); - - _lazyFeatureGroupDefinitions = new Lazy>( - CreateFeatureGroupDefinitions, - isThreadSafe: true - ); + GroupCache = groupCache; + DefinitionCache = definitionCache; } public virtual async Task GetAsync(string name) @@ -52,43 +42,39 @@ public class StaticFeatureDefinitionStore: IStaticFeatureDefinitionStore, ISingl return feature; } - protected virtual Dictionary CreateFeatureDefinitions() + public virtual async Task GetOrNullAsync(string name) { - var features = new Dictionary(); - - foreach (var groupDefinition in FeatureGroupDefinitions.Values) - { - foreach (var feature in groupDefinition.Features) - { - AddFeatureToDictionaryRecursively(features, feature); - } - } + var defs = await GetFeatureDefinitionsAsync(); + return defs.GetOrDefault(name); + } - return features; + public virtual async Task> GetFeaturesAsync() + { + var defs = await GetFeatureDefinitionsAsync(); + return defs.Values.ToList(); } - protected virtual void AddFeatureToDictionaryRecursively( - Dictionary features, - FeatureDefinition feature) + public virtual async Task> GetGroupsAsync() { - if (features.ContainsKey(feature.Name)) - { - throw new AbpException("Duplicate feature name: " + feature.Name); - } + var groups = await GetFeatureGroupDefinitionsAsync(); + return groups.Values.ToList(); + } - features[feature.Name] = feature; + protected virtual async Task> GetFeatureGroupDefinitionsAsync() + { + return await GroupCache.GetOrCreateAsync(CreateFeatureGroupDefinitionsAsync); + } - foreach (var child in feature.Children) - { - AddFeatureToDictionaryRecursively(features, child); - } + protected virtual async Task> GetFeatureDefinitionsAsync() + { + return await DefinitionCache.GetOrCreateAsync(CreateFeatureDefinitionsAsync); } - protected virtual Dictionary CreateFeatureGroupDefinitions() + protected virtual Task> CreateFeatureGroupDefinitionsAsync() { var context = new FeatureDefinitionContext(); - using (var scope = _serviceProvider.CreateScope()) + using (var scope = ServiceProvider.CreateScope()) { var providers = Options .DefinitionProviders @@ -101,21 +87,39 @@ public class StaticFeatureDefinitionStore: IStaticFeatureDefinitionStore, ISingl } } - return context.Groups; + return Task.FromResult(context.Groups); } - public virtual Task GetOrNullAsync(string name) + protected virtual async Task> CreateFeatureDefinitionsAsync() { - return Task.FromResult(FeatureDefinitions.GetOrDefault(name)); - } + var features = new Dictionary(); - public virtual Task> GetFeaturesAsync() - { - return Task.FromResult>(FeatureDefinitions.Values.ToList()); + var groups = await GetFeatureGroupDefinitionsAsync(); + foreach (var groupDefinition in groups.Values) + { + foreach (var feature in groupDefinition.Features) + { + AddFeatureToDictionaryRecursively(features, feature); + } + } + + return features; } - public virtual Task> GetGroupsAsync() + protected virtual void AddFeatureToDictionaryRecursively( + Dictionary features, + FeatureDefinition feature) { - return Task.FromResult>(FeatureGroupDefinitions.Values.ToList()); + if (features.ContainsKey(feature.Name)) + { + throw new AbpException("Duplicate feature name: " + feature.Name); + } + + features[feature.Name] = feature; + + foreach (var child in feature.Children) + { + AddFeatureToDictionaryRecursively(features, child); + } } } diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabaseCollection.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabaseCollection.cs index 3e08c63417..484d627cb4 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabaseCollection.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabaseCollection.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using Volo.Abp.Data; using Volo.Abp.Domain.Entities; namespace Volo.Abp.Domain.Repositories.MemoryDb; @@ -37,10 +38,21 @@ public class MemoryDatabaseCollection : IMemoryDatabaseCollection(); + if (entity is IHasConcurrencyStamp hasConcurrencyStamp && originalEntity is IHasConcurrencyStamp originalHasConcurrencyStamp) + { + if (hasConcurrencyStamp.ConcurrencyStamp != originalHasConcurrencyStamp.ConcurrencyStamp) + { + throw new AbpDbConcurrencyException("Database operation expected to affect 1 row but actually affected 0 row. Data may have been modified or deleted since entities were loaded. This exception has been thrown on optimistic concurrency check."); + } + } + + _dictionary[GetEntityKey(entity)] = _memoryDbSerializer.Serialize(entity); } public void Remove(TEntity entity) diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/StaticSettingDefinitionChangedEvent.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/StaticSettingDefinitionChangedEvent.cs new file mode 100644 index 0000000000..591ff88890 --- /dev/null +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/StaticSettingDefinitionChangedEvent.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Abp.Settings; + +[Serializable] +public class StaticSettingDefinitionChangedEvent +{ + +} diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/StaticSettingDefinitionStore.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/StaticSettingDefinitionStore.cs index 653ee935f7..a35ed31b75 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/StaticSettingDefinitionStore.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/StaticSettingDefinitionStore.cs @@ -6,23 +6,24 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; +using Volo.Abp.StaticDefinitions; namespace Volo.Abp.Settings; public class StaticSettingDefinitionStore : IStaticSettingDefinitionStore, ISingletonDependency { - protected Lazy> SettingDefinitions { get; } - - protected AbpSettingOptions Options { get; } - protected IServiceProvider ServiceProvider { get; } + protected AbpSettingOptions Options { get; } + protected IStaticDefinitionCache> DefinitionCache { get; } - public StaticSettingDefinitionStore(IOptions options, IServiceProvider serviceProvider) + public StaticSettingDefinitionStore( + IServiceProvider serviceProvider, + IOptions options, + IStaticDefinitionCache> definitionCache) { ServiceProvider = serviceProvider; Options = options.Value; - - SettingDefinitions = new Lazy>(CreateSettingDefinitions, true); + DefinitionCache = definitionCache; } public virtual async Task GetAsync(string name) @@ -39,17 +40,24 @@ public class StaticSettingDefinitionStore : IStaticSettingDefinitionStore, ISing return setting; } - public virtual Task> GetAllAsync() + public virtual async Task> GetAllAsync() + { + var defs = await GetSettingDefinitionsAsync(); + return defs.Values.ToImmutableList(); + } + + public virtual async Task GetOrNullAsync(string name) { - return Task.FromResult>(SettingDefinitions.Value.Values.ToImmutableList()); + var defs = await GetSettingDefinitionsAsync(); + return defs.GetOrDefault(name); } - public virtual Task GetOrNullAsync(string name) + protected virtual async Task> GetSettingDefinitionsAsync() { - return Task.FromResult(SettingDefinitions.Value.GetOrDefault(name)); + return await DefinitionCache.GetOrCreateAsync(CreateSettingDefinitionsAsync); } - protected virtual IDictionary CreateSettingDefinitions() + protected virtual Task> CreateSettingDefinitionsAsync() { var settings = new Dictionary(); @@ -66,6 +74,6 @@ public class StaticSettingDefinitionStore : IStaticSettingDefinitionStore, ISing } } - return settings; + return Task.FromResult(settings); } } diff --git a/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/StaticTemplateDefinitionChangedEvent.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/StaticTemplateDefinitionChangedEvent.cs new file mode 100644 index 0000000000..dd862b9c69 --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/StaticTemplateDefinitionChangedEvent.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Abp.TextTemplating; + +[Serializable] +public class StaticTemplateDefinitionChangedEvent +{ + +} diff --git a/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/StaticTemplateDefinitionStore.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/StaticTemplateDefinitionStore.cs index 4231f39b4d..083a111f87 100644 --- a/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/StaticTemplateDefinitionStore.cs +++ b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/StaticTemplateDefinitionStore.cs @@ -6,50 +6,58 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; +using Volo.Abp.StaticDefinitions; namespace Volo.Abp.TextTemplating; public class StaticTemplateDefinitionStore : IStaticTemplateDefinitionStore, ISingletonDependency { - protected Lazy> TemplateDefinitions { get; } - - protected AbpTextTemplatingOptions Options { get; } - protected IServiceProvider ServiceProvider { get; } + protected AbpTextTemplatingOptions Options { get; } + protected IStaticDefinitionCache> DefinitionCache { get; } - public StaticTemplateDefinitionStore(IOptions options, IServiceProvider serviceProvider) + public StaticTemplateDefinitionStore( + IServiceProvider serviceProvider, + IOptions options, + IStaticDefinitionCache> definitionCache) { ServiceProvider = serviceProvider; Options = options.Value; - - TemplateDefinitions = new Lazy>(CreateTextTemplateDefinitions, true); + DefinitionCache = definitionCache; } - public virtual Task GetAsync(string name) + public virtual async Task GetAsync(string name) { Check.NotNull(name, nameof(name)); - var template = GetOrNullAsync(name); + var template = await GetOrNullAsync(name); if (template == null) { throw new AbpException("Undefined template: " + name); } - return template!; + return template; + } + + public virtual async Task> GetAllAsync() + { + var defs = await GetTemplateDefinitionsAsync(); + return defs.Values.ToImmutableList(); } - public virtual Task> GetAllAsync() + public virtual async Task GetOrNullAsync(string name) { - return Task.FromResult>(TemplateDefinitions.Value.Values.ToImmutableList()); + var defs = await GetTemplateDefinitionsAsync(); + return defs.GetOrDefault(name); } - public virtual Task GetOrNullAsync(string name) + protected virtual async Task> GetTemplateDefinitionsAsync() { - return Task.FromResult(TemplateDefinitions.Value.GetOrDefault(name)); + return await DefinitionCache.GetOrCreateAsync(CreateTextTemplateDefinitionsAsync); } - protected virtual IDictionary CreateTextTemplateDefinitions() + protected virtual Task> CreateTextTemplateDefinitionsAsync() { var templates = new Dictionary(); @@ -78,6 +86,6 @@ public class StaticTemplateDefinitionStore : IStaticTemplateDefinitionStore, ISi } } - return templates; + return Task.FromResult(templates); } } diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithNavigationsAndDisableAuditing.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithNavigationsAndDisableAuditing.cs new file mode 100644 index 0000000000..573328387f --- /dev/null +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithNavigationsAndDisableAuditing.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.Auditing.App.Entities; + +[Audited] +public class AppEntityWithNavigationsAndDisableAuditing : AggregateRoot +{ + protected AppEntityWithNavigationsAndDisableAuditing() + { + + } + + public AppEntityWithNavigationsAndDisableAuditing(Guid id, string name) + : base(id) + { + Name = name; + } + + public string Name { get; set; } + + [DisableAuditing] + public virtual List OneToMany { get; set; } +} + + +public class AppEntityWithNavigationsAndDisableAuditingChildOneToMany : Entity +{ + public Guid AppEntityWithNavigationsAndDisableAuditingId { get; set; } + + public string ChildName { get; set; } +} diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs index 8aeeb2cfac..91698ea5ec 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs @@ -29,6 +29,8 @@ public class AbpAuditingTestDbContext : AbpDbContext public DbSet AppEntityWithNavigations { get; set; } public DbSet AppEntityWithNavigationChildOneToMany { get; set; } + public DbSet AppEntityWithNavigationsAndDisableAuditing { get; set; } + public AbpAuditingTestDbContext(DbContextOptions options) : base(options) { diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs index aa11d7ffde..a88cf70292 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs @@ -1025,6 +1025,40 @@ public class Auditing_SaveEntityHistoryWhenNavigationChanges_Tests : AbpAuditing x.EntityChanges[0].PropertyChanges[0].PropertyName == nameof(AppEntityWithNavigationChildManyToMany.ChildName) && x.EntityChanges[0].PropertyChanges[0].PropertyTypeFullName == typeof(string).FullName)); +#pragma warning restore 4014 + } + + [Fact] + public virtual async Task Should_Not_Write_AuditLog_For_Navigation_Changes_With_DisableAuditing() + { + using (var scope = _auditingManager.BeginScope()) + { + var repository = ServiceProvider.GetRequiredService>(); + var entity = new AppEntityWithNavigationsAndDisableAuditing(Guid.NewGuid(), "test name"); + entity.OneToMany = new List + { + new AppEntityWithNavigationsAndDisableAuditingChildOneToMany + { + AppEntityWithNavigationsAndDisableAuditingId = entity.Id, + ChildName = "ChildName1" + } + }; + await repository.InsertAsync(entity); + await scope.SaveAsync(); + } + +#pragma warning disable 4014 + AuditingStore.Received().SaveAsync(Arg.Any()); +#pragma warning restore 4014 + +#pragma warning disable 4014 + AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 1 && + x.EntityChanges[0].ChangeType == EntityChangeType.Created && + x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithNavigationsAndDisableAuditing).FullName && + x.EntityChanges[0].PropertyChanges.Count == 1 && + x.EntityChanges[0].PropertyChanges[0].PropertyName == nameof(AppEntityWithNavigationsAndDisableAuditing.Name) && + x.EntityChanges[0].PropertyChanges[0].PropertyTypeFullName == typeof(string).FullName)); + #pragma warning restore 4014 } } diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/StaticDefinitions/StaticDefinitionCache_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/StaticDefinitions/StaticDefinitionCache_Tests.cs new file mode 100644 index 0000000000..21ab9b8c59 --- /dev/null +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/StaticDefinitions/StaticDefinitionCache_Tests.cs @@ -0,0 +1,122 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Testing; +using Xunit; + +namespace Volo.Abp.StaticDefinitions; + +public class StaticDefinitionCache_Tests : AbpIntegratedTest +{ + protected readonly IStaticDefinitionCache> _staticDefinitionCache1; + protected readonly IStaticDefinitionCache> _staticDefinitionCache2; + + public StaticDefinitionCache_Tests() + { + _staticDefinitionCache1 = GetRequiredService>>(); + _staticDefinitionCache2 = GetRequiredService>>(); + } + + [Fact] + public async Task GetOrCreate_Test() + { + var definition1 = new StaticDefinition1 { Name = "Definition1", Value = 1 }; + var definition2 = new StaticDefinition1 { Name = "Definition2", Value = 2 }; + + var definitionsFirstRetrieval = await _staticDefinitionCache1.GetOrCreateAsync(() => + { + return Task.FromResult(new List { definition1, definition2 }); + }); + + var definitionsSecondRetrieval = await _staticDefinitionCache1.GetOrCreateAsync(() => + { + throw new AbpException("Factory should not be called on second retrieval"); + }); + + definitionsFirstRetrieval.ShouldBe(definitionsSecondRetrieval); + + definitionsSecondRetrieval.Count.ShouldBe(2); + + definitionsSecondRetrieval[0].Name.ShouldBe("Definition1"); + definitionsSecondRetrieval[0].Value.ShouldBe(1); + + definitionsSecondRetrieval[1].Name.ShouldBe("Definition2"); + definitionsSecondRetrieval[1].Value.ShouldBe(2); + } + + [Fact] + public async Task Separate_Caches_For_Different_Types_Test() + { + var definitions1 = await _staticDefinitionCache1.GetOrCreateAsync(() => + { + return Task.FromResult(new List { new StaticDefinition1 {Name = "Definition1", Value = 1} }); + }); + var definitions2 = await _staticDefinitionCache2.GetOrCreateAsync(() => + { + return Task.FromResult(new List { new StaticDefinition2 {Name = "DefinitionA", Value = 100} }); + }); + + definitions1.Count.ShouldBe(1); + definitions1[0].Name.ShouldBe("Definition1"); + definitions1[0].Value.ShouldBe(1); + + definitions2.Count.ShouldBe(1); + definitions2[0].Name.ShouldBe("DefinitionA"); + definitions2[0].Value.ShouldBe(100); + } + + [Fact] + public async Task Clear_Test() + { + var definitions1 = await _staticDefinitionCache1.GetOrCreateAsync(() => + { + return Task.FromResult(new List { new StaticDefinition1 {Name = "Definition1", Value = 1} }); + }); + var definitions2 = await _staticDefinitionCache2.GetOrCreateAsync(() => + { + return Task.FromResult(new List { new StaticDefinition2 {Name = "DefinitionA", Value = 100} }); + }); + + definitions1.Count.ShouldBe(1); + definitions1[0].Name.ShouldBe("Definition1"); + definitions1[0].Value.ShouldBe(1); + + definitions2.Count.ShouldBe(1); + definitions2[0].Name.ShouldBe("DefinitionA"); + definitions2[0].Value.ShouldBe(100); + + await _staticDefinitionCache1.ClearAsync(); + await _staticDefinitionCache2.ClearAsync(); + + var definitions1AfterClear = await _staticDefinitionCache1.GetOrCreateAsync(() => + { + return Task.FromResult(new List { new StaticDefinition1 {Name = "DefinitionNew", Value = 10} }); + }); + var definitions2AfterClear = await _staticDefinitionCache2.GetOrCreateAsync(() => + { + return Task.FromResult(new List {new StaticDefinition2 {Name = "DefinitionNewA", Value = 200}}); + }); + + definitions1AfterClear.Count.ShouldBe(1); + definitions1AfterClear[0].Name.ShouldBe("DefinitionNew"); + definitions1AfterClear[0].Value.ShouldBe(10); + + definitions2AfterClear.Count.ShouldBe(1); + definitions2AfterClear[0].Name.ShouldBe("DefinitionNewA"); + definitions2AfterClear[0].Value.ShouldBe(200); + } + + public class StaticDefinition1 + { + public string Name { get; set; } + + public int Value { get; set; } + } + + public class StaticDefinition2 + { + public string Name { get; set; } + + public int Value { get; set; } + } +} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/SoftDelete_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/SoftDelete_Tests.cs index 1f403ade62..bc1b28357b 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/SoftDelete_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/SoftDelete_Tests.cs @@ -139,4 +139,26 @@ public abstract class SoftDelete_Tests : TestAppTestBase(async () => + { + await PersonRepository.DeleteAsync(douglas); + }); + + douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId); + douglas.ConcurrencyStamp.ShouldNotBeNull(); + // Modify the entity to verify that a changed entity with a correct ConcurrencyStamp + // can still be soft deleted without raising a concurrency exception. + douglas.ChangeName("Changed Name"); + + // Try again with the correct ConcurrencyStamp - this will not throw an exception + await PersonRepository.DeleteAsync(douglas); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml index 133e868a3f..7d568c4b0b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml @@ -6,26 +6,22 @@
@if (Model.Tags != null) { -
    +
    @foreach (var tag in Model.Tags) { if (Model.UrlFormat.IsNullOrWhiteSpace()) { -
  • - + @tag.Name -
  • } else { var formattedUrl = Model.UrlFormat.Replace("{TagId}", tag.Id.ToString()).Replace("{TagName}", tag.Name); -
  • - @tag.Name -
  • + @tag.Name } } -
+
} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml index e3f8fa1677..d94c8e199e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml @@ -60,13 +60,13 @@ -
+

@Model.ViewModel.Title

- - @@@Model.ViewModel.Author?.UserName + + @@@Model.ViewModel.Author?.UserName - @Model.ViewModel.CreationTime + @Model.ViewModel.CreationTime

@(await Component.InvokeAsync(typeof(ContentFragmentViewComponent), new DefaultContentDto { @@ -96,35 +96,41 @@ }
+ + +
+
+ + + @if (GlobalFeatureManager.Instance.IsEnabled()) + { + if (Model.RatingsFeature?.IsEnabled == true) + { + @await Component.InvokeAsync(typeof(RatingViewComponent), new + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.ViewModel.Id.ToString() + }) + } + } + + + @if (GlobalFeatureManager.Instance.IsEnabled()) + { + if (Model.ReactionsFeature?.IsEnabled == true) + { + @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.ViewModel.Id.ToString() + }) + } + } + + +
- - - @if (GlobalFeatureManager.Instance.IsEnabled()) - { - if (Model.ReactionsFeature?.IsEnabled == true) - { - @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new - { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.ViewModel.Id.ToString() - }) - } - } - - - @if (GlobalFeatureManager.Instance.IsEnabled()) - { - if (Model.RatingsFeature?.IsEnabled == true) - { - @await Component.InvokeAsync(typeof(RatingViewComponent), new - { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.ViewModel.Id.ToString() - }) - } - } - - +
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogPost.css b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogPost.css index 03ed4523e4..96e4520d9a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogPost.css +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogPost.css @@ -42,4 +42,22 @@ span.area-title { color: #aaa; text-decoration: none; padding-left: 18px; +} + +.blockquote, blockquote{ + display: block; + padding: 1em 1.5em; + border-radius: 8px; + background: rgba(58, 130, 246, 0.1); + font-size: 1.125rem; +} + +code.hljs{ + border-radius: 8px; + background: rgba(247, 37, 133, 0.1); +} + +pre code.hljs{ + background: rgba(0, 0, 0, 0.1); + padding: 1em 1.5em; } \ No newline at end of file diff --git a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/CmsKitMongoDbTestModule.cs b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/CmsKitMongoDbTestModule.cs index 80ae993732..480d055cec 100644 --- a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/CmsKitMongoDbTestModule.cs +++ b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/CmsKitMongoDbTestModule.cs @@ -1,13 +1,15 @@ using System; using Volo.Abp.Data; using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement.MongoDB; using Volo.Abp.Uow; namespace Volo.CmsKit.MongoDB; [DependsOn( typeof(CmsKitTestBaseModule), - typeof(CmsKitMongoDbModule) + typeof(CmsKitMongoDbModule), + typeof(AbpSettingManagementMongoDbModule) )] public class CmsKitMongoDbTestModule : AbpModule { diff --git a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj index dfa0e199b5..15222835c2 100644 --- a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj @@ -11,6 +11,7 @@ + diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs index 42ad413f3f..95d892692e 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs @@ -24,11 +24,15 @@ namespace Volo.Abp.FeatureManagement; )] public class AbpFeatureManagementDomainModule : AbpModule { + private readonly CancellationTokenSource _cancellationTokenSource = new(); + private Task _initializeDynamicFeaturesTask; + public override void ConfigureServices(ServiceConfigurationContext context) { Configure(options => { options.Providers.Add(); + options.Providers.Add(); options.Providers.Add(); //TODO: Should be moved to the Tenant Management module @@ -51,18 +55,17 @@ public class AbpFeatureManagementDomainModule : AbpModule } } - private readonly CancellationTokenSource _cancellationTokenSource = new(); - private Task _initializeDynamicFeaturesTask; - public override void OnApplicationInitialization(ApplicationInitializationContext context) { AsyncHelper.RunSync(() => OnApplicationInitializationAsync(context)); } - public override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { - InitializeDynamicFeatures(context); - return Task.CompletedTask; + var rootServiceProvider = context.ServiceProvider.GetRequiredService(); + var initializer = rootServiceProvider.GetRequiredService(); + await initializer.InitializeAsync(true, _cancellationTokenSource.Token); + _initializeDynamicFeaturesTask = initializer.GetInitializationTask(); } public override Task OnApplicationShutdownAsync(ApplicationShutdownContext context) @@ -75,118 +78,4 @@ public class AbpFeatureManagementDomainModule : AbpModule { return _initializeDynamicFeaturesTask ?? Task.CompletedTask; } - - private void InitializeDynamicFeatures(ApplicationInitializationContext context) - { - var options = context - .ServiceProvider - .GetRequiredService>() - .Value; - - if (!options.SaveStaticFeaturesToDatabase && !options.IsDynamicFeatureStoreEnabled) - { - return; - } - - var rootServiceProvider = context.ServiceProvider.GetRequiredService(); - - _initializeDynamicFeaturesTask = Task.Run(async () => - { - using var scope = rootServiceProvider.CreateScope(); - var applicationLifetime = scope.ServiceProvider.GetService(); - var cancellationTokenProvider = scope.ServiceProvider.GetRequiredService(); - var cancellationToken = applicationLifetime?.ApplicationStopping ?? _cancellationTokenSource.Token; - - try - { - using (cancellationTokenProvider.Use(cancellationToken)) - { - if (cancellationTokenProvider.Token.IsCancellationRequested) - { - return; - } - - await SaveStaticFeaturesToDatabaseAsync(options, scope, cancellationTokenProvider); - - if (cancellationTokenProvider.Token.IsCancellationRequested) - { - return; - } - - await PreCacheDynamicFeaturesAsync(options, scope); - } - } - // ReSharper disable once EmptyGeneralCatchClause (No need to log since it is logged above) - catch { } - }); - } - - private static async Task SaveStaticFeaturesToDatabaseAsync( - FeatureManagementOptions options, - IServiceScope scope, - ICancellationTokenProvider cancellationTokenProvider) - { - if (!options.SaveStaticFeaturesToDatabase) - { - return; - } - - await Policy - .Handle() - .WaitAndRetryAsync( - 8, - retryAttempt => TimeSpan.FromSeconds( - RandomHelper.GetRandom( - (int)Math.Pow(2, retryAttempt) * 8, - (int)Math.Pow(2, retryAttempt) * 12) - ) - ) - .ExecuteAsync(async _ => - { - try - { - // ReSharper disable once AccessToDisposedClosure - await scope - .ServiceProvider - .GetRequiredService() - .SaveAsync(); - } - catch (Exception ex) - { - // ReSharper disable once AccessToDisposedClosure - scope.ServiceProvider - .GetService>()? - .LogException(ex); - - throw; // Polly will catch it - } - }, cancellationTokenProvider.Token); - } - - private static async Task PreCacheDynamicFeaturesAsync(FeatureManagementOptions options, IServiceScope scope) - { - if (!options.IsDynamicFeatureStoreEnabled) - { - return; - } - - try - { - // Pre-cache features, so first request doesn't wait - await scope - .ServiceProvider - .GetRequiredService() - .GetGroupsAsync(); - } - catch (Exception ex) - { - // ReSharper disable once AccessToDisposedClosure - scope - .ServiceProvider - .GetService>()? - .LogException(ex); - - throw; // It will be cached in InitializeDynamicFeatures - } - } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/ConfigurationFeatureManagementProvider.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/ConfigurationFeatureManagementProvider.cs new file mode 100644 index 0000000000..ac2b2e3e08 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/ConfigurationFeatureManagementProvider.cs @@ -0,0 +1,44 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; + +namespace Volo.Abp.FeatureManagement; + +public class ConfigurationFeatureManagementProvider : IFeatureManagementProvider, ISingletonDependency +{ + public string Name => ConfigurationFeatureValueProvider.ProviderName; + + protected IConfiguration Configuration { get; } + + public ConfigurationFeatureManagementProvider(IConfiguration configuration) + { + Configuration = configuration; + } + + public virtual bool Compatible(string providerName) + { + return providerName == Name; + } + + public virtual Task HandleContextAsync(string providerName, string providerKey) + { + return Task.FromResult(NullAsyncDisposable.Instance); + } + + public virtual Task GetOrNullAsync(FeatureDefinition feature, string providerKey) + { + return Task.FromResult(Configuration[ConfigurationFeatureValueProvider.ConfigurationNamePrefix + feature.Name]); + } + + public virtual Task SetAsync(FeatureDefinition feature, string value, string providerKey) + { + throw new AbpException($"Can not set a feature value to the application configuration."); + } + + public virtual Task ClearAsync(FeatureDefinition feature, string providerKey) + { + throw new AbpException($"Can not set a feature value to the application configuration."); + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/ConfigurationValueFeatureManagerExtensions.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/ConfigurationValueFeatureManagerExtensions.cs new file mode 100644 index 0000000000..726bc4ddbd --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/ConfigurationValueFeatureManagerExtensions.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.Features; + +namespace Volo.Abp.FeatureManagement; + +public static class ConfigurationValueFeatureManagerExtensions +{ + public static Task GetOrNullConfigurationAsync(this IFeatureManager featureManager, [NotNull] string name, bool fallback = true) + { + return featureManager.GetOrNullAsync(name, ConfigurationFeatureValueProvider.ProviderName, null, fallback); + } + + public static Task> GetAllConfigurationAsync(this IFeatureManager featureManager, bool fallback = true) + { + return featureManager.GetAllAsync(ConfigurationFeatureValueProvider.ProviderName, null, fallback); + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureDynamicInitializer.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureDynamicInitializer.cs new file mode 100644 index 0000000000..9f6820274c --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureDynamicInitializer.cs @@ -0,0 +1,157 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using Polly; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; +using Volo.Abp.Threading; + +namespace Volo.Abp.FeatureManagement; + +public class FeatureDynamicInitializer : ITransientDependency +{ + private Task _initializeDynamicFeaturesTask; + + public ILogger Logger { get; set; } + + protected IServiceProvider ServiceProvider { get; } + protected IOptions Options { get; } + [CanBeNull] + protected IHostApplicationLifetime ApplicationLifetime { get; } + protected ICancellationTokenProvider CancellationTokenProvider { get; } + protected IDynamicFeatureDefinitionStore DynamicFeatureDefinitionStore { get; } + protected IStaticFeatureSaver StaticFeatureSaver { get; } + + public FeatureDynamicInitializer( + IServiceProvider serviceProvider, + IOptions options, + ICancellationTokenProvider cancellationTokenProvider, + IDynamicFeatureDefinitionStore dynamicFeatureDefinitionStore, + IStaticFeatureSaver staticFeatureSaver) + { + Logger = NullLogger.Instance; + + ServiceProvider = serviceProvider; + Options = options; + ApplicationLifetime = ServiceProvider.GetService(); + CancellationTokenProvider = cancellationTokenProvider; + DynamicFeatureDefinitionStore = dynamicFeatureDefinitionStore; + StaticFeatureSaver = staticFeatureSaver; + } + + public virtual Task InitializeAsync(bool runInBackground, CancellationToken cancellationToken = default) + { + var options = Options.Value; + + if (!options.SaveStaticFeaturesToDatabase && !options.IsDynamicFeatureStoreEnabled) + { + return Task.CompletedTask; + } + + if (runInBackground) + { + _initializeDynamicFeaturesTask = Task.Run(async () => + { + if (cancellationToken == default && ApplicationLifetime?.ApplicationStopping != null) + { + cancellationToken = ApplicationLifetime.ApplicationStopping; + } + await ExecuteInitializationAsync(options, cancellationToken); + }, cancellationToken); + return Task.CompletedTask; + } + + _initializeDynamicFeaturesTask = ExecuteInitializationAsync(options, cancellationToken); + return _initializeDynamicFeaturesTask; + } + + public virtual Task GetInitializationTask() + { + return _initializeDynamicFeaturesTask ?? Task.CompletedTask; + } + + protected virtual async Task ExecuteInitializationAsync(FeatureManagementOptions options, CancellationToken cancellationToken) + { + try + { + using (CancellationTokenProvider.Use(cancellationToken)) + { + if (CancellationTokenProvider.Token.IsCancellationRequested) + { + return; + } + + await SaveStaticFeaturesToDatabaseAsync(options, cancellationToken); + + if (CancellationTokenProvider.Token.IsCancellationRequested) + { + return; + } + + await PreCacheDynamicFeaturesAsync(options); + } + } + catch + { + // No need to log here since inner calls log + } + } + + protected virtual async Task SaveStaticFeaturesToDatabaseAsync( + FeatureManagementOptions options, + CancellationToken cancellationToken) + { + if (!options.SaveStaticFeaturesToDatabase) + { + return; + } + + await Policy + .Handle() + .WaitAndRetryAsync( + 8, + retryAttempt => TimeSpan.FromSeconds( + Volo.Abp.RandomHelper.GetRandom( + (int)Math.Pow(2, retryAttempt) * 8, + (int)Math.Pow(2, retryAttempt) * 12) + ) + ) + .ExecuteAsync(async _ => + { + try + { + await StaticFeatureSaver.SaveAsync(); + } + catch (Exception ex) + { + Logger.LogException(ex); + throw; // Polly will catch it + } + }, cancellationToken); + } + + protected virtual async Task PreCacheDynamicFeaturesAsync(FeatureManagementOptions options) + { + if (!options.IsDynamicFeatureStoreEnabled) + { + return; + } + + try + { + // Pre-cache features, so first request doesn't wait + await DynamicFeatureDefinitionStore.GetGroupsAsync(); + } + catch (Exception ex) + { + Logger.LogException(ex); + throw; // It will be cached in Initialize() + } + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/StaticFeatureDefinitionChangedEventHandler.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/StaticFeatureDefinitionChangedEventHandler.cs new file mode 100644 index 0000000000..b26b50d9b5 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/StaticFeatureDefinitionChangedEventHandler.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus; +using Volo.Abp.Features; +using Volo.Abp.StaticDefinitions; +using Volo.Abp.Threading; + +namespace Volo.Abp.FeatureManagement; + +public class StaticFeatureDefinitionChangedEventHandler : ILocalEventHandler, ITransientDependency +{ + protected IStaticDefinitionCache> GroupCache { get; } + protected IStaticDefinitionCache> DefinitionCache { get; } + protected FeatureDynamicInitializer FeatureDynamicInitializer { get; } + protected ICancellationTokenProvider CancellationTokenProvider { get; } + + public StaticFeatureDefinitionChangedEventHandler( + IStaticDefinitionCache> groupCache, + IStaticDefinitionCache> definitionCache, + FeatureDynamicInitializer featureDynamicInitializer, + ICancellationTokenProvider cancellationTokenProvider) + { + GroupCache = groupCache; + DefinitionCache = definitionCache; + FeatureDynamicInitializer = featureDynamicInitializer; + CancellationTokenProvider = cancellationTokenProvider; + } + + public virtual async Task HandleEventAsync(StaticFeatureDefinitionChangedEvent eventData) + { + await GroupCache.ClearAsync(); + await DefinitionCache.ClearAsync(); + await FeatureDynamicInitializer.InitializeAsync(false, CancellationTokenProvider.Token); + } +} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ar.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ar.json index f234ef9068..c1a8e40b7b 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ar.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ar.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "تحديث الإذن", "GrantAllResourcePermissions": "منح الكل", "NoResourceProviderKeyLookupServiceFound": "لم يتم العثور على خدمة البحث عن مفتاح المزود", - "NoResourcePermissionFound": "لا توجد أي أذونات محددة." + "NoResourcePermissionFound": "لا توجد أي أذونات محددة.", + "UpdatePermission": "تحديث الإذن", + "NoPermissionsAssigned": "لم يتم تعيين أذونات", + "SelectProvider": "اختر المزود", + "SearchProviderKey": "بحث عن مفتاح المزود", + "Provider": "المزود", + "ErrorLoadingPermissions": "خطأ في تحميل الأذونات", + "PleaseSelectProviderAndPermissions": "يرجى اختيار المزود والأذونات" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/cs.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/cs.json index 2083a51da2..f8f9e642c3 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/cs.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/cs.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Aktualizovat oprávnění", "GrantAllResourcePermissions": "Udělit vše", "NoResourceProviderKeyLookupServiceFound": "Nebyla nalezena služba pro vyhledávání klíče poskytovatele zdrojů", - "NoResourcePermissionFound": "Pro aktuální prostředek není definováno žádné oprávnění." + "NoResourcePermissionFound": "Pro aktuální prostředek není definováno žádné oprávnění.", + "UpdatePermission": "Aktualizovat oprávnění", + "NoPermissionsAssigned": "Nejsou přiřazena žádná oprávnění", + "SelectProvider": "Vybrat poskytovatele", + "SearchProviderKey": "Hledat klíč poskytovatele", + "Provider": "Poskytovatel", + "ErrorLoadingPermissions": "Chyba při načítání oprávnění", + "PleaseSelectProviderAndPermissions": "Vyberte prosím poskytovatele a oprávnění" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/de.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/de.json index 65fb5b83d6..dcf9cf08e9 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/de.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/de.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Berechtigung aktualisieren", "GrantAllResourcePermissions": "Alle gewähren", "NoResourceProviderKeyLookupServiceFound": "Es wurde kein Dienst zum Nachschlagen des Anbieterschlüssels gefunden", - "NoResourcePermissionFound": "Es ist keine Berechtigung definiert." + "NoResourcePermissionFound": "Es ist keine Berechtigung definiert.", + "UpdatePermission": "Berechtigung aktualisieren", + "NoPermissionsAssigned": "Keine Berechtigungen zugewiesen", + "SelectProvider": "Anbieter auswählen", + "SearchProviderKey": "Anbieterschlüssel suchen", + "Provider": "Anbieter", + "ErrorLoadingPermissions": "Fehler beim Laden der Berechtigungen", + "PleaseSelectProviderAndPermissions": "Bitte wählen Sie einen Anbieter und Berechtigungen aus" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/el.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/el.json index 125d64e5dc..926943701c 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/el.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/el.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Ενημέρωση δικαιώματος", "GrantAllResourcePermissions": "Παραχώρηση όλων", "NoResourceProviderKeyLookupServiceFound": "Δεν βρέθηκε υπηρεσία αναζήτησης κλειδιού παρόχου", - "NoResourcePermissionFound": "Δεν έχει οριστεί καμία άδεια." + "NoResourcePermissionFound": "Δεν έχει οριστεί καμία άδεια.", + "UpdatePermission": "Ενημέρωση δικαιώματος", + "NoPermissionsAssigned": "Δεν έχουν εκχωρηθεί δικαιώματα", + "SelectProvider": "Επιλέξτε πάροχο", + "SearchProviderKey": "Αναζήτηση κλειδιού παρόχου", + "Provider": "Πάροχος", + "ErrorLoadingPermissions": "Σφάλμα κατά τη φόρτωση δικαιωμάτων", + "PleaseSelectProviderAndPermissions": "Επιλέξτε πάροχο και δικαιώματα" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en-GB.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en-GB.json index 75d6509523..11370fd6ff 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en-GB.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en-GB.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Update permission", "GrantAllResourcePermissions": "Grant all", "NoResourceProviderKeyLookupServiceFound": "There is no provider key lookup service was found", - "NoResourcePermissionFound": "There is no permission defined." + "NoResourcePermissionFound": "There is no permission defined.", + "UpdatePermission": "Update permission", + "NoPermissionsAssigned": "No permissions assigned", + "SelectProvider": "Select provider", + "SearchProviderKey": "Search provider key", + "Provider": "Provider", + "ErrorLoadingPermissions": "Error loading permissions", + "PleaseSelectProviderAndPermissions": "Please select provider and permissions" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json index f3dde4d6a6..6a4c8d41ab 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Update permission", "GrantAllResourcePermissions": "Grant all", "NoResourceProviderKeyLookupServiceFound": "There is no provider key lookup service was found", - "NoResourcePermissionFound": "There is no permission defined." + "NoResourcePermissionFound": "There is no permission defined.", + "UpdatePermission": "Update permission", + "NoPermissionsAssigned": "No permissions assigned", + "SelectProvider": "Select provider", + "SearchProviderKey": "Search provider key", + "Provider": "Provider", + "ErrorLoadingPermissions": "Error loading permissions", + "PleaseSelectProviderAndPermissions": "Please select provider and permissions" } -} +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/es.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/es.json index 1007ca87ef..c39091d8a6 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/es.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/es.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Actualizar permiso", "GrantAllResourcePermissions": "Conceder todos", "NoResourceProviderKeyLookupServiceFound": "No se encontró ningún servicio de búsqueda de clave de proveedor", - "NoResourcePermissionFound": "No hay ningún permiso definido." + "NoResourcePermissionFound": "No hay ningún permiso definido.", + "UpdatePermission": "Actualizar permiso", + "NoPermissionsAssigned": "No hay permisos asignados", + "SelectProvider": "Seleccionar proveedor", + "SearchProviderKey": "Buscar clave de proveedor", + "Provider": "Proveedor", + "ErrorLoadingPermissions": "Error al cargar permisos", + "PleaseSelectProviderAndPermissions": "Por favor, selecciona proveedor y permisos" } -} +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fa.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fa.json index 4d711f6542..21c00d539f 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fa.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fa.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "به‌روزرسانی مجوز", "GrantAllResourcePermissions": "اعطای همه", "NoResourceProviderKeyLookupServiceFound": "هیچ سرویس جستجوی کلید ارائه‌دهنده یافت نشد", - "NoResourcePermissionFound": "هیچ مجوزی تعریف نشده است." + "NoResourcePermissionFound": "هیچ مجوزی تعریف نشده است.", + "UpdatePermission": "به‌روزرسانی مجوز", + "NoPermissionsAssigned": "هیچ مجوزی اختصاص داده نشده است", + "SelectProvider": "انتخاب کننده‌", + "SearchProviderKey": "جستجوی کلید تامین‌کننده", + "Provider": "تامین‌کننده", + "ErrorLoadingPermissions": "خطا در بارگذاری مجوزها", + "PleaseSelectProviderAndPermissions": "لطفاً تامین‌کننده و مجوزها را انتخاب کنید" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fi.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fi.json index 02bd697c43..43d3ded466 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fi.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fi.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Päivitä käyttöoikeus", "GrantAllResourcePermissions": "Myönnä kaikki", "NoResourceProviderKeyLookupServiceFound": "Palveluntarjoajan avaimen hakupalvelua ei löytynyt", - "NoResourcePermissionFound": "Ei käyttöoikeuksia määritetty." + "NoResourcePermissionFound": "Ei käyttöoikeuksia määritetty.", + "UpdatePermission": "Päivitä lupa", + "NoPermissionsAssigned": "Ei osoitettuja oikeuksia", + "SelectProvider": "Valitse palveluntarjoaja", + "SearchProviderKey": "Hae palveluntarjoajan avainta", + "Provider": "Palveluntarjoaja", + "ErrorLoadingPermissions": "Virhe ladataessa oikeuksia", + "PleaseSelectProviderAndPermissions": "Valitse palveluntarjoaja ja oikeudet" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fr.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fr.json index d019936494..2d184a2714 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fr.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fr.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Mettre à jour l'autorisation", "GrantAllResourcePermissions": "Accorder tout", "NoResourceProviderKeyLookupServiceFound": "Aucun service de recherche de clé de fournisseur n'a été trouvé", - "NoResourcePermissionFound": "Aucune autorisation n'est définie." + "NoResourcePermissionFound": "Aucune autorisation n'est définie.", + "UpdatePermission": "Mettre à jour l'autorisation", + "NoPermissionsAssigned": "Aucune autorisation assignée", + "SelectProvider": "Sélectionner le fournisseur", + "SearchProviderKey": "Rechercher la clé du fournisseur", + "Provider": "Fournisseur", + "ErrorLoadingPermissions": "Erreur lors du chargement des autorisations", + "PleaseSelectProviderAndPermissions": "Veuillez sélectionner le fournisseur et les autorisations" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hi.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hi.json index 141be77ce5..f00d5718b9 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hi.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hi.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "अनुमति अपडेट करें", "GrantAllResourcePermissions": "सभी प्रदान करें", "NoResourceProviderKeyLookupServiceFound": "कोई प्रदाता कुंजी खोज सेवा नहीं मिली", - "NoResourcePermissionFound": "कोई अनुमति परिभाषित नहीं है।" + "NoResourcePermissionFound": "कोई अनुमति परिभाषित नहीं है।", + "UpdatePermission": "अनुमति अपडेट करें", + "NoPermissionsAssigned": "कोई अनुमति असाइन नहीं की गई", + "SelectProvider": "प्रदाता चुनें", + "SearchProviderKey": "प्रदाता कुंजी खोजें", + "Provider": "प्रदाता", + "ErrorLoadingPermissions": "अनुमतियाँ लोड करने में त्रुटि", + "PleaseSelectProviderAndPermissions": "कृपया प्रदाता और अनुमतियाँ चुनें" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hr.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hr.json index fb7129a678..af74766105 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hr.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hr.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Ažuriraj dozvolu", "GrantAllResourcePermissions": "Dodijeli sve", "NoResourceProviderKeyLookupServiceFound": "Nije pronađena usluga za pronalaženje ključa pružatelja", - "NoResourcePermissionFound": "Nijedna dozvola nije definirana." + "NoResourcePermissionFound": "Nijedna dozvola nije definirana.", + "UpdatePermission": "Ažuriraj dopuštenje", + "NoPermissionsAssigned": "Nema dodijeljenih dopuštenja", + "SelectProvider": "Odaberi pružatelja", + "SearchProviderKey": "Traži ključ pružatelja", + "Provider": "Pružatelj", + "ErrorLoadingPermissions": "Pogreška pri učitavanju dopuštenja", + "PleaseSelectProviderAndPermissions": "Molimo odaberite pružatelja i dopuštenja" } -} +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hu.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hu.json index 9ef8822f63..e55d15188c 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hu.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hu.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Engedély frissítése", "GrantAllResourcePermissions": "Összes engedély megadása", "NoResourceProviderKeyLookupServiceFound": "Nem található szolgáltató kulcs kereső szolgáltatás", - "NoResourcePermissionFound": "Nincs meghatározva engedély." + "NoResourcePermissionFound": "Nincs meghatározva engedély.", + "UpdatePermission": "Jogosultság frissítése", + "NoPermissionsAssigned": "Nincsenek jogosultságok hozzárendelve", + "SelectProvider": "Szolgáltató kiválasztása", + "SearchProviderKey": "Szolgáltatói kulcs keresése", + "Provider": "Szolgáltató", + "ErrorLoadingPermissions": "Hiba a jogosultságok betöltésekor", + "PleaseSelectProviderAndPermissions": "Kérjük, válassza ki a szolgáltatót és a jogosultságokat" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/is.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/is.json index 0510d8a1b8..be40ed7020 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/is.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/is.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Uppfæra heimild", "GrantAllResourcePermissions": "Veita allt", "NoResourceProviderKeyLookupServiceFound": "Engin þjónusta fannst til að leita að lykli veitanda", - "NoResourcePermissionFound": "Engin heimild er skilgreind." + "NoResourcePermissionFound": "Engin heimild er skilgreind.", + "UpdatePermission": "Uppfæra leyfi", + "NoPermissionsAssigned": "Engar heimildir skráðar", + "SelectProvider": "Velja þjónustuaðila", + "SearchProviderKey": "Leita að lykli þjónustuaðila", + "Provider": "Þjónustuaðili", + "ErrorLoadingPermissions": "Villa við að hlaða leyfum", + "PleaseSelectProviderAndPermissions": "Vinsamlegast veldu þjónustuaðila og leyfi" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/it.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/it.json index 644eae25ee..af689bad29 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/it.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/it.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Aggiorna autorizzazione", "GrantAllResourcePermissions": "Concedi tutto", "NoResourceProviderKeyLookupServiceFound": "Non è stato trovato alcun servizio di ricerca chiave del provider", - "NoResourcePermissionFound": "Non è definita alcuna autorizzazione." + "NoResourcePermissionFound": "Non è definita alcuna autorizzazione.", + "UpdatePermission": "Aggiorna permesso", + "NoPermissionsAssigned": "Nessun permesso assegnato", + "SelectProvider": "Seleziona fornitore", + "SearchProviderKey": "Cerca chiave fornitore", + "Provider": "Fornitore", + "ErrorLoadingPermissions": "Errore durante il caricamento dei permessi", + "PleaseSelectProviderAndPermissions": "Selezionare fornitore e permessi" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/nl.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/nl.json index b9af1b227b..5c86bd91da 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/nl.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/nl.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Recht bijwerken", "GrantAllResourcePermissions": "Alles toekennen", "NoResourceProviderKeyLookupServiceFound": "Er is geen service gevonden voor het opzoeken van de sleutel van de provider", - "NoResourcePermissionFound": "Er is geen machtiging gedefinieerd." + "NoResourcePermissionFound": "Er is geen machtiging gedefinieerd.", + "UpdatePermission": "Machtiging bijwerken", + "NoPermissionsAssigned": "Geen machtigingen toegewezen", + "SelectProvider": "Selecteer provider", + "SearchProviderKey": "Zoek provider sleutel", + "Provider": "Provider", + "ErrorLoadingPermissions": "Fout bij laden van machtigingen", + "PleaseSelectProviderAndPermissions": "Selecteer provider en machtigingen" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pl-PL.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pl-PL.json index 9ba0bd5690..ce24bc88a0 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pl-PL.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pl-PL.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Zaktualizuj uprawnienie", "GrantAllResourcePermissions": "Przyznaj wszystko", "NoResourceProviderKeyLookupServiceFound": "Nie znaleziono usługi wyszukiwania klucza dostawcy", - "NoResourcePermissionFound": "Nie zdefiniowano żadnych uprawnień." + "NoResourcePermissionFound": "Nie zdefiniowano żadnych uprawnień.", + "UpdatePermission": "Aktualizuj uprawnienie", + "NoPermissionsAssigned": "Brak przypisanych uprawnień", + "SelectProvider": "Wybierz dostawcę", + "SearchProviderKey": "Szukaj klucza dostawcy", + "Provider": "Dostawca", + "ErrorLoadingPermissions": "Błąd podczas ładowania uprawnień", + "PleaseSelectProviderAndPermissions": "Wybierz dostawcę i uprawnienia" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pt-BR.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pt-BR.json index d9ceca3317..50c65d248a 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pt-BR.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pt-BR.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Atualizar permissão", "GrantAllResourcePermissions": "Conceder tudo", "NoResourceProviderKeyLookupServiceFound": "Nenhum serviço de pesquisa de chave do provedor foi encontrado", - "NoResourcePermissionFound": "Nenhuma permissão foi definida." + "NoResourcePermissionFound": "Nenhuma permissão foi definida.", + "UpdatePermission": "Atualizar permissão", + "NoPermissionsAssigned": "Nenhuma permissão atribuída", + "SelectProvider": "Selecionar provedor", + "SearchProviderKey": "Pesquisar chave do provedor", + "Provider": "Provedor", + "ErrorLoadingPermissions": "Erro ao carregar permissões", + "PleaseSelectProviderAndPermissions": "Por favor, selecione o provedor e as permissões" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ro-RO.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ro-RO.json index 25553f693b..8cab09b9d5 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ro-RO.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ro-RO.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Actualizați permisiunea", "GrantAllResourcePermissions": "Acordați toate", "NoResourceProviderKeyLookupServiceFound": "Nu a fost găsit niciun serviciu de căutare a cheii furnizorului", - "NoResourcePermissionFound": "Nu există nicio permisiune definită." + "NoResourcePermissionFound": "Nu există nicio permisiune definită.", + "UpdatePermission": "Actualizează permisiunea", + "NoPermissionsAssigned": "Nicio permisiune atribuită", + "SelectProvider": "Selectează furnizor", + "SearchProviderKey": "Caută cheie furnizor", + "Provider": "Furnizor", + "ErrorLoadingPermissions": "Eroare la încărcarea permisiunilor", + "PleaseSelectProviderAndPermissions": "Vă rugăm să selectați furnizorul și permisiunile" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ru.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ru.json index 409460e2dd..81e0160345 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ru.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ru.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Обновить разрешение", "GrantAllResourcePermissions": "Предоставить все", "NoResourceProviderKeyLookupServiceFound": "Служба поиска ключа поставщика не найдена", - "NoResourcePermissionFound": "Не определено ни одного разрешения." + "NoResourcePermissionFound": "Не определено ни одного разрешения.", + "UpdatePermission": "Обновить разрешение", + "NoPermissionsAssigned": "Нет назначенных разрешений", + "SelectProvider": "Выбрать провайдера", + "SearchProviderKey": "Поиск ключа провайдера", + "Provider": "Провайдер", + "ErrorLoadingPermissions": "Ошибка при загрузке разрешений", + "PleaseSelectProviderAndPermissions": "Пожалуйста, выберите провайдера и разрешения" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sk.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sk.json index 09394f87a9..80e5719fc7 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sk.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sk.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Aktualizovať oprávnenie", "GrantAllResourcePermissions": "Udeľ všetko", "NoResourceProviderKeyLookupServiceFound": "Nebola nájdená služba na vyhľadávanie kľúča poskytovateľa", - "NoResourcePermissionFound": "Nie je definované žiadne povolenie." + "NoResourcePermissionFound": "Nie je definované žiadne povolenie.", + "UpdatePermission": "Aktualizovať oprávnenie", + "NoPermissionsAssigned": "Nie sú priradené žiadne oprávnenia", + "SelectProvider": "Vybrat poskytovateľa", + "SearchProviderKey": "Hľadať kľúč poskytovateľa", + "Provider": "Poskytovateľ", + "ErrorLoadingPermissions": "Chyba pri načítaní oprávnení", + "PleaseSelectProviderAndPermissions": "Vyberte poskytovateľa a oprávnenia" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sl.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sl.json index 60ee9af67a..c5e5c61382 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sl.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sl.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Posodobi dovoljenje", "GrantAllResourcePermissions": "Dodeli vse", "NoResourceProviderKeyLookupServiceFound": "Ni bilo mogoče najti storitve za iskanje ključa ponudnika", - "NoResourcePermissionFound": "Nobeno dovoljenje ni določeno." + "NoResourcePermissionFound": "Nobeno dovoljenje ni določeno.", + "UpdatePermission": "Posodobi dovoljenje", + "NoPermissionsAssigned": "Ni dodeljenih dovoljenj", + "SelectProvider": "Izberi ponudnika", + "SearchProviderKey": "Išči ključ ponudnika", + "Provider": "Ponudnik", + "ErrorLoadingPermissions": "Napaka pri nalaganju dovoljenj", + "PleaseSelectProviderAndPermissions": "Izberite ponudnika in dovoljenja" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sv.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sv.json index a5c1260438..c666cbd8c0 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sv.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sv.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Uppdatera behörighet", "GrantAllResourcePermissions": "Bevilja alla", "NoResourceProviderKeyLookupServiceFound": "Ingen tjänst för att söka efter leverantörsnyckel hittades", - "NoResourcePermissionFound": "Ingen behörighet är definierad." + "NoResourcePermissionFound": "Ingen behörighet är definierad.", + "UpdatePermission": "Uppdatera behörighet", + "NoPermissionsAssigned": "Inga behörigheter tilldelade", + "SelectProvider": "Välj leverantör", + "SearchProviderKey": "Sök leverantörsnyckel", + "Provider": "Leverantör", + "ErrorLoadingPermissions": "Fel vid laddning av behörigheter", + "PleaseSelectProviderAndPermissions": "Välj leverantör och behörigheter" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json index b96baa2383..b6eb5f1c7b 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "İzni güncelle", "GrantAllResourcePermissions": "Tümünü ver", "NoResourceProviderKeyLookupServiceFound": "Herhangi bir sağlayıcı anahtar arama hizmeti bulunamadı", - "NoResourcePermissionFound": "Herhangi bir izin tanımlı değil." + "NoResourcePermissionFound": "Herhangi bir izin tanımlı değil.", + "UpdatePermission": "İzni güncelle", + "NoPermissionsAssigned": "Atanmış izin bulunamadı", + "SelectProvider": "Sağlayıcı seç", + "SearchProviderKey": "Sağlayıcı anahtarını ara", + "Provider": "Sağlayıcı", + "ErrorLoadingPermissions": "İzinler yüklenirken hata oluştu", + "PleaseSelectProviderAndPermissions": "Lütfen sağlayıcı ve izinleri seçin" } -} +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/vi.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/vi.json index 2a5aca86e1..0a26e43253 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/vi.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/vi.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "Cập nhật quyền", "GrantAllResourcePermissions": "Cấp tất cả", "NoResourceProviderKeyLookupServiceFound": "Không tìm thấy dịch vụ tra cứu khóa nhà cung cấp", - "NoResourcePermissionFound": "Không có quyền nào được định nghĩa." + "NoResourcePermissionFound": "Không có quyền nào được định nghĩa.", + "UpdatePermission": "Cập nhật quyền", + "NoPermissionsAssigned": "Chưa được cấp quyền", + "SelectProvider": "Chọn nhà cung cấp", + "SearchProviderKey": "Tìm kiếm khóa nhà cung cấp", + "Provider": "Nhà cung cấp", + "ErrorLoadingPermissions": "Lỗi khi tải quyền", + "PleaseSelectProviderAndPermissions": "Vui lòng chọn nhà cung cấp và quyền" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hans.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hans.json index bbd53f9606..2c84e3462d 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hans.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hans.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "更新权限", "GrantAllResourcePermissions": "授予所有", "NoResourceProviderKeyLookupServiceFound": "未找到提供者键查找服务", - "NoResourcePermissionFound": "未定义任何权限。" + "NoResourcePermissionFound": "未定义任何权限。", + "UpdatePermission": "更新权限", + "NoPermissionsAssigned": "未分配权限", + "SelectProvider": "选择提供程序", + "SearchProviderKey": "搜索提供程序密钥", + "Provider": "提供程序", + "ErrorLoadingPermissions": "加载权限时出错", + "PleaseSelectProviderAndPermissions": "请选择提供程序和权限" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hant.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hant.json index c081c54f20..afd9d65459 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hant.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hant.json @@ -17,6 +17,13 @@ "UpdateResourcePermission": "更新權限", "GrantAllResourcePermissions": "授予所有", "NoResourceProviderKeyLookupServiceFound": "未找到提供者鍵查找服務", - "NoResourcePermissionFound": "未定義任何權限。" + "NoResourcePermissionFound": "未定義任何權限。", + "UpdatePermission": "更新權限", + "NoPermissionsAssigned": "未分配權限", + "SelectProvider": "選擇提供者", + "SearchProviderKey": "搜尋提供者金鑰", + "Provider": "提供者", + "ErrorLoadingPermissions": "載入權限時出錯", + "PleaseSelectProviderAndPermissions": "請選擇提供者和權限" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs index 0f40e3c039..e3825ff397 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs @@ -27,6 +27,7 @@ public class AbpPermissionManagementDomainModule : AbpModule { private readonly CancellationTokenSource _cancellationTokenSource = new(); private Task _initializeDynamicPermissionsTask; + public override void ConfigureServices(ServiceConfigurationContext context) { if (context.Services.IsDataMigrationEnvironment()) @@ -44,10 +45,12 @@ public class AbpPermissionManagementDomainModule : AbpModule AsyncHelper.RunSync(() => OnApplicationInitializationAsync(context)); } - public override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { - InitializeDynamicPermissions(context); - return Task.CompletedTask; + var rootServiceProvider = context.ServiceProvider.GetRequiredService(); + var initializer = rootServiceProvider.GetRequiredService(); + await initializer.InitializeAsync(true, _cancellationTokenSource.Token); + _initializeDynamicPermissionsTask = initializer.GetInitializationTask(); } public override Task OnApplicationShutdownAsync(ApplicationShutdownContext context) @@ -60,118 +63,4 @@ public class AbpPermissionManagementDomainModule : AbpModule { return _initializeDynamicPermissionsTask ?? Task.CompletedTask; } - - private void InitializeDynamicPermissions(ApplicationInitializationContext context) - { - var options = context - .ServiceProvider - .GetRequiredService>() - .Value; - - if (!options.SaveStaticPermissionsToDatabase && !options.IsDynamicPermissionStoreEnabled) - { - return; - } - - var rootServiceProvider = context.ServiceProvider.GetRequiredService(); - - _initializeDynamicPermissionsTask = Task.Run(async () => - { - using var scope = rootServiceProvider.CreateScope(); - var applicationLifetime = scope.ServiceProvider.GetService(); - var cancellationTokenProvider = scope.ServiceProvider.GetRequiredService(); - var cancellationToken = applicationLifetime?.ApplicationStopping ?? _cancellationTokenSource.Token; - - try - { - using (cancellationTokenProvider.Use(cancellationToken)) - { - if (cancellationTokenProvider.Token.IsCancellationRequested) - { - return; - } - - await SaveStaticPermissionsToDatabaseAsync(options, scope, cancellationTokenProvider); - - if (cancellationTokenProvider.Token.IsCancellationRequested) - { - return; - } - - await PreCacheDynamicPermissionsAsync(options, scope); - } - } - // ReSharper disable once EmptyGeneralCatchClause (No need to log since it is logged above) - catch { } - }); - } - - private async static Task SaveStaticPermissionsToDatabaseAsync( - PermissionManagementOptions options, - IServiceScope scope, - ICancellationTokenProvider cancellationTokenProvider) - { - if (!options.SaveStaticPermissionsToDatabase) - { - return; - } - - await Policy - .Handle() - .WaitAndRetryAsync( - 8, - retryAttempt => TimeSpan.FromSeconds( - RandomHelper.GetRandom( - (int)Math.Pow(2, retryAttempt) * 8, - (int)Math.Pow(2, retryAttempt) * 12) - ) - ) - .ExecuteAsync(async _ => - { - try - { - // ReSharper disable once AccessToDisposedClosure - await scope - .ServiceProvider - .GetRequiredService() - .SaveAsync(); - } - catch (Exception ex) - { - // ReSharper disable once AccessToDisposedClosure - scope.ServiceProvider - .GetService>()? - .LogException(ex); - - throw; // Polly will catch it - } - }, cancellationTokenProvider.Token); - } - - private async static Task PreCacheDynamicPermissionsAsync(PermissionManagementOptions options, IServiceScope scope) - { - if (!options.IsDynamicPermissionStoreEnabled) - { - return; - } - - try - { - // Pre-cache permissions, so first request doesn't wait - await scope - .ServiceProvider - .GetRequiredService() - .GetGroupsAsync(); - } - catch (Exception ex) - { - // ReSharper disable once AccessToDisposedClosure - scope - .ServiceProvider - .GetService>()? - .LogException(ex); - - throw; // It will be cached in InitializeDynamicPermissions - } - } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDynamicInitializer.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDynamicInitializer.cs new file mode 100644 index 0000000000..e78885c07f --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDynamicInitializer.cs @@ -0,0 +1,159 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using Polly; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; + +namespace Volo.Abp.PermissionManagement; + +public class PermissionDynamicInitializer : ITransientDependency +{ + private Task _initializeDynamicPermissionsTask; + + public ILogger Logger { get; set; } + + protected IServiceProvider ServiceProvider { get; } + protected IOptions Options { get; } + [CanBeNull] + protected IHostApplicationLifetime ApplicationLifetime { get; } + protected ICancellationTokenProvider CancellationTokenProvider { get; } + protected IDynamicPermissionDefinitionStore DynamicPermissionDefinitionStore { get; } + protected IStaticPermissionSaver StaticPermissionSaver { get; } + + public PermissionDynamicInitializer( + IServiceProvider serviceProvider, + IOptions options, + ICancellationTokenProvider cancellationTokenProvider, + IDynamicPermissionDefinitionStore dynamicPermissionDefinitionStore, + IStaticPermissionSaver staticPermissionSaver) + { + Logger = NullLogger.Instance; + + ServiceProvider = serviceProvider; + Options = options; + ApplicationLifetime = ServiceProvider.GetService(); + CancellationTokenProvider = cancellationTokenProvider; + DynamicPermissionDefinitionStore = dynamicPermissionDefinitionStore; + StaticPermissionSaver = staticPermissionSaver; + } + + public virtual Task InitializeAsync(bool runInBackground, CancellationToken cancellationToken = default) + { + var options = Options.Value; + + if (!options.SaveStaticPermissionsToDatabase && !options.IsDynamicPermissionStoreEnabled) + { + return Task.CompletedTask; + } + + if (runInBackground) + { + _initializeDynamicPermissionsTask = Task.Run(async () => + { + if (cancellationToken == default && ApplicationLifetime?.ApplicationStopping != null) + { + cancellationToken = ApplicationLifetime.ApplicationStopping; + } + await ExecuteInitializationAsync(options, cancellationToken); + }, cancellationToken); + return Task.CompletedTask; + } + + _initializeDynamicPermissionsTask = ExecuteInitializationAsync(options, cancellationToken); + return _initializeDynamicPermissionsTask; + } + + public virtual Task GetInitializationTask() + { + return _initializeDynamicPermissionsTask ?? Task.CompletedTask; + } + + protected virtual async Task ExecuteInitializationAsync(PermissionManagementOptions options, CancellationToken cancellationToken) + { + try + { + using (CancellationTokenProvider.Use(cancellationToken)) + { + if (CancellationTokenProvider.Token.IsCancellationRequested) + { + return; + } + + await SaveStaticPermissionsToDatabaseAsync(options, cancellationToken); + + if (CancellationTokenProvider.Token.IsCancellationRequested) + { + return; + } + + await PreCacheDynamicPermissionsAsync(options); + } + } + catch + { + // No need to log here since inner calls log + } + } + + protected virtual async Task SaveStaticPermissionsToDatabaseAsync( + PermissionManagementOptions options, + CancellationToken cancellationToken) + { + if (!options.SaveStaticPermissionsToDatabase) + { + return; + } + + await Policy + .Handle() + .WaitAndRetryAsync( + 8, + retryAttempt => TimeSpan.FromSeconds( + Volo.Abp.RandomHelper.GetRandom( + (int)Math.Pow(2, retryAttempt) * 8, + (int)Math.Pow(2, retryAttempt) * 12) + ) + ) + .ExecuteAsync(async _ => + { + try + { + await StaticPermissionSaver.SaveAsync(); + } + catch (Exception ex) + { + Logger.LogException(ex); + + throw; // Polly will catch it + } + }, cancellationToken); + } + + protected virtual async Task PreCacheDynamicPermissionsAsync(PermissionManagementOptions options) + { + if (!options.IsDynamicPermissionStoreEnabled) + { + return; + } + + try + { + // Pre-cache permissions, so first request doesn't wait + await DynamicPermissionDefinitionStore.GetGroupsAsync(); + } + catch (Exception ex) + { + Logger.LogException(ex); + + throw; // It will be cached in Initialize() + } + } +} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionDefinitionChangedEventHandler.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionDefinitionChangedEventHandler.cs new file mode 100644 index 0000000000..5f6dd1e700 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionDefinitionChangedEventHandler.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.StaticDefinitions; +using Volo.Abp.Threading; + +namespace Volo.Abp.PermissionManagement; + +public class StaticPermissionDefinitionChangedEventHandler : ILocalEventHandler, ITransientDependency +{ + protected IStaticDefinitionCache, List)> GroupCache { get; } + protected IStaticDefinitionCache> DefinitionCache { get; } + protected PermissionDynamicInitializer PermissionDynamicInitializer { get; } + protected ICancellationTokenProvider CancellationTokenProvider { get; } + + public StaticPermissionDefinitionChangedEventHandler( + IStaticDefinitionCache, List)> groupCache, + IStaticDefinitionCache> definitionCache, + PermissionDynamicInitializer permissionDynamicInitializer, + ICancellationTokenProvider cancellationTokenProvider) + { + GroupCache = groupCache; + DefinitionCache = definitionCache; + PermissionDynamicInitializer = permissionDynamicInitializer; + CancellationTokenProvider = cancellationTokenProvider; + } + + public virtual async Task HandleEventAsync(StaticPermissionDefinitionChangedEvent eventData) + { + await GroupCache.ClearAsync(); + await DefinitionCache.ClearAsync(); + await PermissionDynamicInitializer.InitializeAsync(false, CancellationTokenProvider.Token); + } +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs index 3f73342d0a..c3cd35daef 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs @@ -53,10 +53,12 @@ public class AbpSettingManagementDomainModule : AbpModule AsyncHelper.RunSync(() => OnApplicationInitializationAsync(context)); } - public override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { - InitializeDynamicSettings(context); - return Task.CompletedTask; + var rootServiceProvider = context.ServiceProvider.GetRequiredService(); + var initializer = rootServiceProvider.GetRequiredService(); + await initializer.InitializeAsync(true, _cancellationTokenSource.Token); + _initializeDynamicSettingsTask = initializer.GetInitializationTask(); } public override Task OnApplicationShutdownAsync(ApplicationShutdownContext context) @@ -69,111 +71,4 @@ public class AbpSettingManagementDomainModule : AbpModule { return _initializeDynamicSettingsTask ?? Task.CompletedTask; } - - private void InitializeDynamicSettings(ApplicationInitializationContext context) - { - var options = context - .ServiceProvider - .GetRequiredService>() - .Value; - - if (!options.SaveStaticSettingsToDatabase && !options.IsDynamicSettingStoreEnabled) - { - return; - } - - var rootServiceProvider = context.ServiceProvider.GetRequiredService(); - - _initializeDynamicSettingsTask = Task.Run(async () => - { - using var scope = rootServiceProvider.CreateScope(); - var applicationLifetime = scope.ServiceProvider.GetService(); - var cancellationTokenProvider = scope.ServiceProvider.GetRequiredService(); - var cancellationToken = applicationLifetime?.ApplicationStopping ?? _cancellationTokenSource.Token; - - try - { - using (cancellationTokenProvider.Use(cancellationToken)) - { - if (cancellationTokenProvider.Token.IsCancellationRequested) - { - return; - } - - await SaveStaticSettingsToDatabaseAsync(options, scope, cancellationTokenProvider); - - if (cancellationTokenProvider.Token.IsCancellationRequested) - { - return; - } - - await PreCacheDynamicSettingsAsync(options, scope); - } - } - // ReSharper disable once EmptyGeneralCatchClause (No need to log since it is logged above) - catch { } - }); - } - - private async static Task SaveStaticSettingsToDatabaseAsync( - SettingManagementOptions options, - IServiceScope scope, - ICancellationTokenProvider cancellationTokenProvider) - { - if (!options.SaveStaticSettingsToDatabase) - { - return; - } - - await Policy - .Handle() - .WaitAndRetryAsync(8, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt) * 10)) - .ExecuteAsync(async _ => - { - try - { - // ReSharper disable once AccessToDisposedClosure - await scope - .ServiceProvider - .GetRequiredService() - .SaveAsync(); - } - catch (Exception ex) - { - // ReSharper disable once AccessToDisposedClosure - scope.ServiceProvider - .GetService>()? - .LogException(ex); - - throw; // Polly will catch it - } - }, cancellationTokenProvider.Token); - } - - private async static Task PreCacheDynamicSettingsAsync(SettingManagementOptions options, IServiceScope scope) - { - if (!options.IsDynamicSettingStoreEnabled) - { - return; - } - - try - { - // Pre-cache settings, so first request doesn't wait - await scope - .ServiceProvider - .GetRequiredService() - .GetAllAsync(); - } - catch (Exception ex) - { - // ReSharper disable once AccessToDisposedClosure - scope - .ServiceProvider - .GetService>()? - .LogException(ex); - - throw; // It will be cached in InitializeDynamicSettings - } - } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingDynamicInitializer.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingDynamicInitializer.cs new file mode 100644 index 0000000000..6f388c8de8 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingDynamicInitializer.cs @@ -0,0 +1,158 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using Polly; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Settings; +using Volo.Abp.Threading; + +namespace Volo.Abp.SettingManagement; + +public class SettingDynamicInitializer : ITransientDependency +{ + private Task _initializeDynamicSettingsTask; + + public ILogger Logger { get; set; } + + protected IServiceProvider ServiceProvider { get; } + protected IOptions Options { get; } + [CanBeNull] + protected IHostApplicationLifetime ApplicationLifetime { get; } + protected ICancellationTokenProvider CancellationTokenProvider { get; } + protected IDynamicSettingDefinitionStore DynamicSettingDefinitionStore { get; } + protected IStaticSettingSaver StaticSettingSaver { get; } + + public SettingDynamicInitializer( + IServiceProvider serviceProvider, + IOptions options, + ICancellationTokenProvider cancellationTokenProvider, + IDynamicSettingDefinitionStore dynamicSettingDefinitionStore, + IStaticSettingSaver staticSettingSaver) + { + Logger = NullLogger.Instance; + + ServiceProvider = serviceProvider; + Options = options; + ApplicationLifetime = ServiceProvider.GetService(); + CancellationTokenProvider = cancellationTokenProvider; + DynamicSettingDefinitionStore = dynamicSettingDefinitionStore; + StaticSettingSaver = staticSettingSaver; + } + + public virtual Task InitializeAsync(bool runInBackground, CancellationToken cancellationToken = default) + { + var options = Options.Value; + + if (!options.SaveStaticSettingsToDatabase && !options.IsDynamicSettingStoreEnabled) + { + return Task.CompletedTask; + } + + if (runInBackground) + { + _initializeDynamicSettingsTask = Task.Run(async () => + { + if (cancellationToken == default && ApplicationLifetime?.ApplicationStopping != null) + { + cancellationToken = ApplicationLifetime.ApplicationStopping; + } + await ExecuteInitializationAsync(options, cancellationToken); + }, cancellationToken); + + return Task.CompletedTask; + } + + _initializeDynamicSettingsTask = ExecuteInitializationAsync(options, cancellationToken); + return _initializeDynamicSettingsTask; + } + + public virtual Task GetInitializationTask() + { + return _initializeDynamicSettingsTask ?? Task.CompletedTask; + } + + protected virtual async Task ExecuteInitializationAsync(SettingManagementOptions options, CancellationToken cancellationToken) + { + try + { + using (CancellationTokenProvider.Use(cancellationToken)) + { + if (CancellationTokenProvider.Token.IsCancellationRequested) + { + return; + } + + await SaveStaticSettingsToDatabaseAsync(options, cancellationToken); + + if (CancellationTokenProvider.Token.IsCancellationRequested) + { + return; + } + + await PreCacheDynamicSettingsAsync(options); + } + } + catch + { + // No need to log here since inner calls log + } + } + + protected virtual async Task SaveStaticSettingsToDatabaseAsync( + SettingManagementOptions options, + CancellationToken cancellationToken) + { + if (!options.SaveStaticSettingsToDatabase) + { + return; + } + + await Policy + .Handle() + .WaitAndRetryAsync( + 8, + retryAttempt => TimeSpan.FromSeconds( + Volo.Abp.RandomHelper.GetRandom( + (int)Math.Pow(2, retryAttempt) * 8, + (int)Math.Pow(2, retryAttempt) * 12) + ) + ) + .ExecuteAsync(async _ => + { + try + { + await StaticSettingSaver.SaveAsync(); + } + catch (Exception ex) + { + Logger.LogException(ex); + throw; // Polly will catch it + } + }, cancellationToken); + } + + protected virtual async Task PreCacheDynamicSettingsAsync(SettingManagementOptions options) + { + if (!options.IsDynamicSettingStoreEnabled) + { + return; + } + + try + { + // Pre-cache settings, so first request doesn't wait + await DynamicSettingDefinitionStore.GetAllAsync(); + } + catch (Exception ex) + { + Logger.LogException(ex); + throw; // It will be cached in Initialize() + } + } +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/StaticSettingDefinitionChangedEventHandler.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/StaticSettingDefinitionChangedEventHandler.cs new file mode 100644 index 0000000000..cfc1058bb1 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/StaticSettingDefinitionChangedEventHandler.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus; +using Volo.Abp.Settings; +using Volo.Abp.StaticDefinitions; +using Volo.Abp.Threading; + +namespace Volo.Abp.SettingManagement; + +public class StaticSettingDefinitionChangedEventHandler : ILocalEventHandler, ITransientDependency +{ + protected IStaticDefinitionCache> DefinitionCache { get; } + protected SettingDynamicInitializer SettingDynamicInitializer { get; } + protected ICancellationTokenProvider CancellationTokenProvider { get; } + + public StaticSettingDefinitionChangedEventHandler( + IStaticDefinitionCache> definitionCache, + SettingDynamicInitializer settingDynamicInitializer, + ICancellationTokenProvider cancellationTokenProvider) + { + DefinitionCache = definitionCache; + SettingDynamicInitializer = settingDynamicInitializer; + CancellationTokenProvider = cancellationTokenProvider; + } + + public virtual async Task HandleEventAsync(StaticSettingDefinitionChangedEvent eventData) + { + await DefinitionCache.ClearAsync(); + await SettingDynamicInitializer.InitializeAsync(false, CancellationTokenProvider.Token); + } +} diff --git a/npm/ng-packs/apps/dev-app/project.json b/npm/ng-packs/apps/dev-app/project.json index 37f0502dde..bea3bf6612 100644 --- a/npm/ng-packs/apps/dev-app/project.json +++ b/npm/ng-packs/apps/dev-app/project.json @@ -176,9 +176,7 @@ }, "test": { "executor": "@nx/jest:jest", - "outputs": [ - "{workspaceRoot}/coverage/apps/dev-app" - ], + "outputs": ["{workspaceRoot}/coverage/apps/dev-app"], "options": { "jestConfig": "apps/dev-app/jest.config.ts" } diff --git a/npm/ng-packs/apps/dev-app/src/main.server.ts b/npm/ng-packs/apps/dev-app/src/main.server.ts index 4b9d4d1545..fbd3e9dbd7 100644 --- a/npm/ng-packs/apps/dev-app/src/main.server.ts +++ b/npm/ng-packs/apps/dev-app/src/main.server.ts @@ -1,7 +1,7 @@ -import { bootstrapApplication } from '@angular/platform-browser'; +import { bootstrapApplication, BootstrapContext } from '@angular/platform-browser'; import { AppComponent } from './app/app.component'; import { config } from './app/app.config.server'; -const bootstrap = () => bootstrapApplication(AppComponent, config); +const bootstrap = (context: BootstrapContext) => bootstrapApplication(AppComponent, config, context); export default bootstrap; diff --git a/npm/ng-packs/migrations.json b/npm/ng-packs/migrations.json index 49df20928b..3615f35e50 100644 --- a/npm/ng-packs/migrations.json +++ b/npm/ng-packs/migrations.json @@ -1,45 +1,118 @@ { "migrations": [ + { + "version": "22.0.0-beta.1", + "description": "Updates release version config based on the breaking changes in Nx v22", + "implementation": "./src/migrations/update-22-0-0/release-version-config-changes", + "package": "nx", + "name": "22-0-0-release-version-config-changes" + }, + { + "version": "22.0.0-beta.2", + "description": "Consolidates releaseTag* options into nested releaseTag object structure", + "implementation": "./src/migrations/update-22-0-0/consolidate-release-tag-config", + "package": "nx", + "name": "22-0-0-consolidate-release-tag-config" + }, { "cli": "nx", - "version": "21.2.0-beta.3", - "requires": { "@angular/core": ">=20.0.0" }, - "description": "Update the @angular/cli package version to ~20.0.0.", - "factory": "./src/migrations/update-21-2-0/update-angular-cli", + "version": "22.1.0-beta.5", + "description": "Updates the nx wrapper.", + "implementation": "./src/migrations/update-22-1-0/update-nx-wrapper", + "package": "nx", + "name": "22-1-0-update-nx-wrapper" + }, + { + "version": "21.5.0-beta.2", + "description": "Migrate the legacy 'development' custom condition to a workspace-unique custom condition name.", + "factory": "./src/migrations/update-21-5-0/migrate-development-custom-condition", + "package": "@nx/js", + "name": "migrate-development-custom-condition" + }, + { + "version": "22.0.0-beta.0", + "description": "Remove the deprecated `external` and `externalBuildTargets` options from the `@nx/js:swc` and `@nx/js:tsc` executors.", + "factory": "./src/migrations/update-22-0-0/remove-external-options-from-js-executors", + "package": "@nx/js", + "name": "remove-external-options-from-js-executors" + }, + { + "version": "22.1.0-rc.1", + "description": "Removes redundant TypeScript project references from project's tsconfig.json files when runtime tsconfig files (e.g., tsconfig.lib.json, tsconfig.app.json) exist.", + "factory": "./src/migrations/update-22-1-0/remove-redundant-ts-project-references", + "package": "@nx/js", + "name": "remove-redundant-ts-project-references" + }, + { + "version": "21.3.0-beta.3", + "description": "Rename the CLI option `testPathPattern` to `testPathPatterns`.", + "implementation": "./src/migrations/update-21-3-0/rename-test-path-pattern", + "package": "@nx/jest", + "name": "rename-test-path-pattern" + }, + { + "version": "22.2.0-beta.2", + "description": "Convert jest.config.ts files from ESM to CJS syntax (export default -> module.exports, import -> require) for projects using CommonJS resolution to ensure correct loading under Node.js type-stripping.", + "implementation": "./src/migrations/update-22-2-0/convert-jest-config-to-cjs", + "package": "@nx/jest", + "name": "convert-jest-config-to-cjs" + }, + { + "cli": "nx", + "version": "21.3.0-beta.4", + "requires": { "@angular/core": ">=20.1.0" }, + "description": "Update the @angular/cli package version to ~20.1.0.", + "factory": "./src/migrations/update-21-3-0/update-angular-cli", "package": "@nx/angular", - "name": "update-angular-cli-version-20-0-0" + "name": "update-angular-cli-version-20-1-0" }, { - "version": "21.2.0-beta.3", - "requires": { "@angular/core": ">=20.0.0" }, - "description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.", - "factory": "./src/migrations/update-21-2-0/migrate-provide-server-rendering-import", + "version": "21.5.0-beta.0", + "description": "Set the 'tsConfig' option to build and test targets to help with Angular migration issues.", + "factory": "./src/migrations/update-21-5-0/set-tsconfig-option", "package": "@nx/angular", - "name": "migrate-provide-server-rendering-import" + "name": "set-tsconfig-option" }, { - "version": "21.2.0-beta.3", - "requires": { "@angular/core": ">=20.0.0" }, - "description": "Replace `provideServerRouting` and `provideServerRoutesConfig` with `provideServerRendering` using `withRoutes`.", - "factory": "./src/migrations/update-21-2-0/replace-provide-server-routing", + "cli": "nx", + "version": "21.5.0-beta.2", + "requires": { "@angular/core": ">=20.2.0" }, + "description": "Update the @angular/cli package version to ~20.2.0.", + "factory": "./src/migrations/update-21-5-0/update-angular-cli", "package": "@nx/angular", - "name": "replace-provide-server-routing" + "name": "update-angular-cli-version-20-2-0" }, { - "version": "21.2.0-beta.3", - "requires": { "@angular/core": ">=20.0.0" }, - "description": "Update the generator defaults to maintain the previous style guide behavior.", - "factory": "./src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide", + "version": "21.5.0-beta.2", + "requires": { "@angular/core": ">=20.2.0" }, + "description": "Remove any Karma configuration files that only contain the default content. The default configuration is automatically available without a specific project configurationfile.", + "factory": "./src/migrations/update-21-5-0/remove-default-karma-configuration-files", "package": "@nx/angular", - "name": "set-generator-defaults-for-previous-style-guide" + "name": "remove-default-karma-configuration-files" }, { - "version": "21.2.0-beta.3", - "requires": { "@angular/core": ">=20.0.0" }, - "description": "Update 'moduleResolution' to 'bundler' in TypeScript configurations. You can read more about this here: https://www.typescriptlang.org/tsconfig/#moduleResolution.", - "factory": "./src/migrations/update-21-2-0/update-module-resolution", + "cli": "nx", + "version": "21.6.1-beta.2", + "requires": { "@angular/core": ">=20.3.0" }, + "description": "Update the @angular/cli package version to ~20.3.0.", + "factory": "./src/migrations/update-21-6-1/update-angular-cli", "package": "@nx/angular", - "name": "update-module-resolution" + "name": "update-angular-cli-version-20-3-0" + }, + { + "version": "20.2.0", + "description": "Replaces usages of the deprecated Router.getCurrentNavigation method with the Router.currentNavigation signal", + "factory": "./bundles/router-current-navigation.cjs#migrate", + "optional": true, + "package": "@angular/core", + "name": "router-current-navigation" + }, + { + "version": "20.3.0", + "description": "Adds `BootstrapContext` to `bootstrapApplication` calls in `main.server.ts` to support server rendering.", + "factory": "./bundles/add-bootstrap-context-to-server-main.cjs#migrate", + "package": "@angular/core", + "name": "add-bootstrap-context-to-server-main" } ] } diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index ffc9949269..444df9187f 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -48,49 +48,49 @@ "devDependencies": { "@abp/ng.theme.lepton-x": "~5.0.1", "@abp/utils": "~10.0.1", - "@angular-devkit/build-angular": "~20.0.0", - "@angular-devkit/core": "~20.0.0", - "@angular-devkit/schematics": "~20.0.0", - "@angular-devkit/schematics-cli": "~20.0.0", - "@angular-eslint/eslint-plugin": "~20.0.0", - "@angular-eslint/eslint-plugin-template": "~20.0.0", - "@angular-eslint/template-parser": "~20.0.0", - "@angular/animations": "~20.0.0", - "@angular/build": "~20.0.0", - "@angular/cli": "~20.0.0", - "@angular/common": "~20.0.0", - "@angular/compiler": "~20.0.0", - "@angular/compiler-cli": "~20.0.0", - "@angular/core": "~20.0.0", - "@angular/forms": "~20.0.0", - "@angular/language-service": "~20.0.0", - "@angular/localize": "~20.0.0", - "@angular/platform-browser": "~20.0.0", - "@angular/platform-browser-dynamic": "~20.0.0", - "@angular/platform-server": "~20.0.0", - "@angular/router": "~20.0.0", - "@angular/ssr": "~20.0.0", + "@angular-devkit/build-angular": "~21.0.0", + "@angular-devkit/core": "~21.0.0", + "@angular-devkit/schematics": "~21.0.0", + "@angular-devkit/schematics-cli": "~21.0.0", + "@angular-eslint/eslint-plugin": "~21.0.0", + "@angular-eslint/eslint-plugin-template": "~21.0.0", + "@angular-eslint/template-parser": "~21.0.0", + "@angular/animations": "21.0.0", + "@angular/build": "~21.0.0", + "@angular/cli": "~21.0.0", + "@angular/common": "~21.0.0", + "@angular/compiler": "~21.0.0", + "@angular/compiler-cli": "~21.0.0", + "@angular/core": "~21.0.0", + "@angular/forms": "~21.0.0", + "@angular/language-service": "~21.0.0", + "@angular/localize": "~21.0.0", + "@angular/platform-browser": "~21.0.0", + "@angular/platform-browser-dynamic": "~21.0.0", + "@angular/platform-server": "~21.0.0", + "@angular/router": "~21.0.0", + "@angular/ssr": "~21.0.0", "@fortawesome/fontawesome-free": "^6.0.0", - "@ng-bootstrap/ng-bootstrap": "~19.0.0", + "@ng-bootstrap/ng-bootstrap": "~20.0.0", "@ngneat/spectator": "~19.6.2", "@ngx-validate/core": "^0.2.0", - "@nx/angular": "~21.2.0", - "@nx/cypress": "~21.2.0", - "@nx/devkit": "~21.2.0", - "@nx/eslint": "~21.2.0", - "@nx/eslint-plugin": "~21.2.0", - "@nx/jest": "~21.2.0", - "@nx/js": "~21.2.0", - "@nx/plugin": "~21.2.0", - "@nx/web": "~21.2.0", - "@nx/workspace": "~21.2.0", + "@nx/angular": "~22.2.0", + "@nx/cypress": "~22.2.0", + "@nx/devkit": "~22.2.0", + "@nx/eslint": "~22.2.0", + "@nx/eslint-plugin": "~22.2.0", + "@nx/jest": "~22.2.0", + "@nx/js": "~22.2.0", + "@nx/plugin": "~22.2.0", + "@nx/web": "~22.2.0", + "@nx/workspace": "~22.2.0", "@popperjs/core": "~2.11.0", - "@schematics/angular": "~20.0.0", + "@schematics/angular": "~21.0.0", "@swc-node/register": "1.9.2", "@swc/cli": "0.6.0", "@swc/core": "~1.5.0", "@swc/helpers": "~0.5.0", - "@swimlane/ngx-datatable": "~21.1.0", + "@swimlane/ngx-datatable": "~22.0.0", "@types/express": "~5.0.0", "@types/jest": "29.5.14", "@types/node": "~20.11.0", @@ -121,9 +121,9 @@ "just-compare": "^2.0.0", "lerna": "^4.0.0", "lint-staged": "^13.0.0", - "ng-packagr": "~20.0.0", - "ng-zorro-antd": "~20.0.0", - "nx": "~21.2.0", + "ng-packagr": "~21.0.0", + "ng-zorro-antd": "~21.0.0-next.1", + "nx": "~22.2.0", "postcss": "^8.0.0", "postcss-import": "14.1.0", "postcss-preset-env": "7.5.0", @@ -133,12 +133,12 @@ "@toast-ui/editor": "~3.0.0", "rxjs": "~7.8.0", "should-quote": "^1.0.0", - "ts-jest": "29.1.0", + "ts-jest": "29.4.6", "ts-node": "10.9.1", "ts-toolbelt": "^9.0.0", "tslib": "^2.3.0", "tslint": "~6.1.0", - "typescript": "~5.8.0", + "typescript": "~5.9.0", "zone.js": "~0.15.0" }, "lint-staged": { diff --git a/npm/ng-packs/packages/account-core/project.json b/npm/ng-packs/packages/account-core/project.json index 3e60410088..312bdd30e9 100644 --- a/npm/ng-packs/packages/account-core/project.json +++ b/npm/ng-packs/packages/account-core/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/account-core/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "theme-shared"], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,7 +34,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [], - "implicitDependencies": ["core", "theme-shared"] + } } diff --git a/npm/ng-packs/packages/account/project.json b/npm/ng-packs/packages/account/project.json index 9514a59dc6..41c6597e2a 100644 --- a/npm/ng-packs/packages/account/project.json +++ b/npm/ng-packs/packages/account/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/account/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "theme-shared", "account-core"], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,7 +34,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [], - "implicitDependencies": ["core", "theme-shared", "account-core"] + } } diff --git a/npm/ng-packs/packages/components/lookup/ng-package.json b/npm/ng-packs/packages/components/lookup/ng-package.json new file mode 100644 index 0000000000..665ad2add2 --- /dev/null +++ b/npm/ng-packs/packages/components/lookup/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-entrypoint.schema.json", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.html b/npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.html new file mode 100644 index 0000000000..e795025aec --- /dev/null +++ b/npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.html @@ -0,0 +1,45 @@ +
+ @if (label()) { + + } + +
+ + @if (displayValue() && !disabled()) { + + } +
+ + @if (showDropdown() && !disabled()) { +
+ @if (isLoading()) { +
+ + {{ 'AbpUi::Loading' | abpLocalization }} +
+ } @else if (searchResults().length > 0) { + @for (item of searchResults(); track item.key) { + + } + } @else if (displayValue()) { + @if (noResultsTemplate()) { + + } @else { +
+ {{ 'AbpUi::NoRecordsFound' | abpLocalization }} +
+ } + } +
+ } +
\ No newline at end of file diff --git a/npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.scss b/npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.scss new file mode 100644 index 0000000000..6fd1e2dc26 --- /dev/null +++ b/npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.scss @@ -0,0 +1,5 @@ +.abp-lookup-dropdown { + z-index: 1050; + max-height: 200px; + overflow-y: auto; +} diff --git a/npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.ts b/npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.ts new file mode 100644 index 0000000000..9633b15ab8 --- /dev/null +++ b/npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.ts @@ -0,0 +1,136 @@ +import { + Component, + input, + output, + model, + signal, + OnInit, + ChangeDetectionStrategy, + TemplateRef, + contentChild, + DestroyRef, + inject, +} from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { LocalizationPipe } from '@abp/ng.core'; +import { Subject, Observable, debounceTime, distinctUntilChanged, of, finalize } from 'rxjs'; + +export interface LookupItem { + key: string; + displayName: string; + [key: string]: unknown; +} + +export type LookupSearchFn = (filter: string) => Observable; + +@Component({ + selector: 'abp-lookup-search', + templateUrl: './lookup-search.component.html', + styleUrl: './lookup-search.component.scss', + imports: [CommonModule, FormsModule, LocalizationPipe], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class LookupSearchComponent implements OnInit { + private readonly destroyRef = inject(DestroyRef); + + readonly label = input(); + readonly placeholder = input(''); + readonly debounceTime = input(300); + readonly minSearchLength = input(0); + readonly displayKey = input('displayName' as keyof T); + readonly valueKey = input('key' as keyof T); + readonly disabled = input(false); + + readonly searchFn = input>(() => of([])); + + readonly selectedValue = model(''); + readonly displayValue = model(''); + + readonly itemSelected = output(); + readonly searchChanged = output(); + + readonly itemTemplate = contentChild>('itemTemplate'); + readonly noResultsTemplate = contentChild>('noResultsTemplate'); + + readonly searchResults = signal([]); + readonly showDropdown = signal(false); + readonly isLoading = signal(false); + + private readonly searchSubject = new Subject(); + + ngOnInit() { + this.searchSubject.pipe( + debounceTime(this.debounceTime()), + distinctUntilChanged(), + takeUntilDestroyed(this.destroyRef) + ).subscribe(filter => { + this.performSearch(filter); + }); + } + + onSearchInput(filter: string) { + this.displayValue.set(filter); + this.showDropdown.set(true); + this.searchChanged.emit(filter); + + if (filter.length >= this.minSearchLength()) { + this.searchSubject.next(filter); + } else { + this.searchResults.set([]); + } + } + + onSearchFocus() { + this.showDropdown.set(true); + const currentFilter = this.displayValue() || ''; + if (currentFilter.length >= this.minSearchLength()) { + this.performSearch(currentFilter); + } + } + + onSearchBlur(event: FocusEvent) { + const relatedTarget = event.relatedTarget as HTMLElement; + if (!relatedTarget?.closest('.abp-lookup-dropdown')) { + this.showDropdown.set(false); + } + } + + selectItem(item: T) { + const displayKeyValue = String(item[this.displayKey()] ?? ''); + const valueKeyValue = String(item[this.valueKey()] ?? ''); + + this.displayValue.set(displayKeyValue); + this.selectedValue.set(valueKeyValue); + this.searchResults.set([]); + this.showDropdown.set(false); + this.itemSelected.emit(item); + } + + clearSelection() { + this.displayValue.set(''); + this.selectedValue.set(''); + this.searchResults.set([]); + } + + private performSearch(filter: string) { + this.isLoading.set(true); + + this.searchFn()(filter).pipe( + takeUntilDestroyed(this.destroyRef), + finalize(() => this.isLoading.set(false)) + ).subscribe({ + next: results => { + this.searchResults.set(results); + }, + error: () => { + this.searchResults.set([]); + } + }); + } + + getDisplayValue(item: T): string { + return String(item[this.displayKey()] ?? item[this.valueKey()] ?? ''); + } +} diff --git a/npm/ng-packs/packages/components/lookup/src/public-api.ts b/npm/ng-packs/packages/components/lookup/src/public-api.ts new file mode 100644 index 0000000000..b1232ef08f --- /dev/null +++ b/npm/ng-packs/packages/components/lookup/src/public-api.ts @@ -0,0 +1 @@ +export * from './lib/lookup-search.component'; diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index df305d27ae..1fb6de5e0c 100644 --- a/npm/ng-packs/packages/components/package.json +++ b/npm/ng-packs/packages/components/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "chart.js": "^3.5.1", - "ng-zorro-antd": "~20.0.0", + "ng-zorro-antd": "~21.0.0-next.1", "@ctrl/tinycolor": "^4.0.0", "tslib": "^2.0.0" }, diff --git a/npm/ng-packs/packages/components/project.json b/npm/ng-packs/packages/components/project.json index 4a61b72ab4..671fabe461 100644 --- a/npm/ng-packs/packages/components/project.json +++ b/npm/ng-packs/packages/components/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/components/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "theme-shared"], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,7 +34,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [], - "implicitDependencies": ["core", "theme-shared"] + } } diff --git a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts index 316200704b..5c320a539b 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts +++ b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts @@ -29,7 +29,7 @@ import { DISABLE_TREE_STYLE_LOADING_TOKEN } from '../disable-tree-style-loading. import { TreeNodeTemplateDirective } from '../templates/tree-node-template.directive'; import { ExpandedIconTemplateDirective } from '../templates/expanded-icon-template.directive'; import { NgTemplateOutlet } from '@angular/common'; -import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation'; +import { NzNoAnimationDirective } from 'ng-zorro-antd/core/animation'; export type DropEvent = NzFormatEmitEvent & { pos: number }; diff --git a/npm/ng-packs/packages/components/tsconfig.lib.json b/npm/ng-packs/packages/components/tsconfig.lib.json index 22d2695db8..7dde5f04bf 100644 --- a/npm/ng-packs/packages/components/tsconfig.lib.json +++ b/npm/ng-packs/packages/components/tsconfig.lib.json @@ -2,14 +2,18 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "../../dist/out-tsc", - "target": "ES2022", "declaration": true, "declarationMap": true, "inlineSources": true, "types": [], - "lib": ["dom", "es2020"], + "target": "ES2022", + "lib": ["ES2020", "dom"], "useDefineForClassFields": false }, - "exclude": ["src/test-setup.ts", "**/*.spec.ts", "jest.config.ts"], - "include": ["**/*.ts"] + "exclude": [ + "src/test-setup.ts", + "src/**/*.spec.ts", + "jest.config.ts" + ], + "include": ["src/**/*.ts"] } diff --git a/npm/ng-packs/packages/components/tsconfig.lib.prod.json b/npm/ng-packs/packages/components/tsconfig.lib.prod.json index 0e06848ce5..8bfa43c12b 100644 --- a/npm/ng-packs/packages/components/tsconfig.lib.prod.json +++ b/npm/ng-packs/packages/components/tsconfig.lib.prod.json @@ -3,7 +3,8 @@ "compilerOptions": { "declarationMap": false, "target": "ES2022", - "useDefineForClassFields": false + "useDefineForClassFields": false, + "skipLibCheck": true }, "angularCompilerOptions": { "compilationMode": "partial" diff --git a/npm/ng-packs/packages/core/project.json b/npm/ng-packs/packages/core/project.json index 9efdfd9d83..a6b7789814 100644 --- a/npm/ng-packs/packages/core/project.json +++ b/npm/ng-packs/packages/core/project.json @@ -4,6 +4,7 @@ "projectType": "library", "sourceRoot": "packages/core/src", "prefix": "abp", + "tags": [], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,6 +33,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [] + } } diff --git a/npm/ng-packs/packages/core/tsconfig.lib.prod.json b/npm/ng-packs/packages/core/tsconfig.lib.prod.json index 0e06848ce5..8bfa43c12b 100644 --- a/npm/ng-packs/packages/core/tsconfig.lib.prod.json +++ b/npm/ng-packs/packages/core/tsconfig.lib.prod.json @@ -3,7 +3,8 @@ "compilerOptions": { "declarationMap": false, "target": "ES2022", - "useDefineForClassFields": false + "useDefineForClassFields": false, + "skipLibCheck": true }, "angularCompilerOptions": { "compilationMode": "partial" diff --git a/npm/ng-packs/packages/feature-management/project.json b/npm/ng-packs/packages/feature-management/project.json index b2f0e61b08..7712d1b67b 100644 --- a/npm/ng-packs/packages/feature-management/project.json +++ b/npm/ng-packs/packages/feature-management/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/feature-management/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "theme-shared"], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,7 +34,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [], - "implicitDependencies": ["core", "theme-shared"] + } } diff --git a/npm/ng-packs/packages/generators/project.json b/npm/ng-packs/packages/generators/project.json index 06244af3d0..5924f7caac 100644 --- a/npm/ng-packs/packages/generators/project.json +++ b/npm/ng-packs/packages/generators/project.json @@ -3,6 +3,7 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "packages/generators/src", "projectType": "library", + "tags": [], "targets": { "build": { "executor": "@nx/js:tsc", @@ -51,6 +52,5 @@ "jestConfig": "packages/generators/jest.config.ts" } } - }, - "tags": [] + } } diff --git a/npm/ng-packs/packages/generators/tsconfig.json b/npm/ng-packs/packages/generators/tsconfig.json index f765bc1b6a..8d1999ff05 100644 --- a/npm/ng-packs/packages/generators/tsconfig.json +++ b/npm/ng-packs/packages/generators/tsconfig.json @@ -2,7 +2,8 @@ "extends": "../../tsconfig.base.json", "compilerOptions": { "module": "commonjs", - "skipLibCheck": true + "skipLibCheck": true, + "moduleResolution": "node" }, "files": [], "include": [], diff --git a/npm/ng-packs/packages/identity/project.json b/npm/ng-packs/packages/identity/project.json index d51409ac2a..e67a92ba2a 100644 --- a/npm/ng-packs/packages/identity/project.json +++ b/npm/ng-packs/packages/identity/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/identity/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "theme-shared", "permission-management"], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,7 +34,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [], - "implicitDependencies": ["core", "theme-shared", "permission-management"] + } } diff --git a/npm/ng-packs/packages/oauth/project.json b/npm/ng-packs/packages/oauth/project.json index 61662f4811..858ec5947c 100644 --- a/npm/ng-packs/packages/oauth/project.json +++ b/npm/ng-packs/packages/oauth/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/oauth/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core"], "targets": { "build": { "executor": "@nx/angular:package", @@ -31,7 +33,5 @@ "lint": { "executor": "@nx/eslint:lint" } - }, - "tags": [], - "implicitDependencies": ["core"] + } } diff --git a/npm/ng-packs/packages/oauth/src/lib/services/index.ts b/npm/ng-packs/packages/oauth/src/lib/services/index.ts index 32909341a1..9e8637a59a 100644 --- a/npm/ng-packs/packages/oauth/src/lib/services/index.ts +++ b/npm/ng-packs/packages/oauth/src/lib/services/index.ts @@ -3,3 +3,4 @@ export * from './oauth-error-filter.service'; export * from './remember-me.service'; export * from './browser-token-storage.service'; export * from './server-token-storage.service'; +export * from './memory-token-storage.service'; diff --git a/npm/ng-packs/packages/oauth/src/lib/services/memory-token-storage.service.ts b/npm/ng-packs/packages/oauth/src/lib/services/memory-token-storage.service.ts new file mode 100644 index 0000000000..7d531dfefd --- /dev/null +++ b/npm/ng-packs/packages/oauth/src/lib/services/memory-token-storage.service.ts @@ -0,0 +1,243 @@ +import { DestroyRef, DOCUMENT, inject, Injectable } from '@angular/core'; +import { OAuthStorage } from 'angular-oauth2-oidc'; +import { AbpLocalStorageService } from '@abp/ng.core'; +import { fromEvent } from 'rxjs'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; + +@Injectable({ + providedIn: 'root', +}) +export class MemoryTokenStorageService implements OAuthStorage { + private static workerUrl: string | null = null; + + private keysShouldStoreInMemory = [ + 'access_token', + 'id_token', + 'expires_at', + 'id_token_claims_obj', + 'id_token_expires_at', + 'id_token_stored_at', + 'access_token_stored_at', + 'abpOAuthClientId', + 'granted_scopes', + ]; + + private worker?: any; + private port?: MessagePort; + private cache = new Map(); + private localStorageService = inject(AbpLocalStorageService); + private _document = inject(DOCUMENT); + private destroyRef = inject(DestroyRef); + private useSharedWorker = false; + + constructor() { + this.initializeStorage(); + this.setupCleanup(); + } + + private initializeStorage(): void { + // @ts-ignore + if (typeof SharedWorker !== 'undefined') { + try { + // Create worker from data URL to avoid path resolution issues in consuming apps + // Data URLs are deterministic - same content produces same URL across all tabs + if (!MemoryTokenStorageService.workerUrl) { + MemoryTokenStorageService.workerUrl = this.createWorkerDataUrl(); + } + // @ts-ignore + this.worker = new SharedWorker(MemoryTokenStorageService.workerUrl, { + name: 'oauth-token-storage', + }); + this.port = this.worker.port; + this.port.start(); + this.useSharedWorker = true; + + this.port.onmessage = event => { + const { action, key, value } = event.data; + + switch (action) { + case 'set': + this.checkAuthStateChanges(key); + this.cache.set(key, value); + break; + case 'remove': + this.cache.delete(key); + this.refreshDocument(); + break; + case 'clear': + this.cache.clear(); + this.refreshDocument(); + break; + case 'get': + if (value !== null) { + this.cache.set(key, value); + } + break; + } + }; + + // Load all tokens from SharedWorker on initialization + this.keysShouldStoreInMemory.forEach(key => { + this.port?.postMessage({ action: 'get', key }); + }); + } catch (error) { + this.useSharedWorker = false; + } + } else { + this.useSharedWorker = false; + } + } + + getItem(key: string): string | null { + if (!this.keysShouldStoreInMemory.includes(key)) { + return this.localStorageService.getItem(key); + } + return this.cache.get(key) || null; + } + + setItem(key: string, value: string): void { + if (!this.keysShouldStoreInMemory.includes(key)) { + this.localStorageService.setItem(key, value); + return; + } + + if (this.useSharedWorker && this.port) { + this.cache.set(key, value); + this.port.postMessage({ action: 'set', key, value }); + } else { + this.cache.set(key, value); + } + } + + removeItem(key: string): void { + if (!this.keysShouldStoreInMemory.includes(key)) { + this.localStorageService.removeItem(key); + return; + } + + if (this.useSharedWorker && this.port) { + this.cache.delete(key); + this.port.postMessage({ action: 'remove', key }); + } else { + this.cache.delete(key); + } + } + + clear(): void { + if (this.useSharedWorker && this.port) { + this.port.postMessage({ action: 'clear' }); + } + this.cache.clear(); + } + + private cleanupPort(): void { + if (this.useSharedWorker && this.port) { + try { + this.port.postMessage({ action: 'disconnect' }); + } catch (error) { + // + } + } + } + + private setupCleanup(): void { + if (this._document.defaultView) { + fromEvent(this._document.defaultView, 'beforeunload') + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => this.cleanupPort()); + + fromEvent(this._document.defaultView, 'pagehide') + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => this.cleanupPort()); + } + } + + private checkAuthStateChanges = (key: string) => { + if (key === 'access_token' && !this.cache.get('access_token')) { + this.refreshDocument(); + } + }; + + private refreshDocument(): void { + this.cleanupPort(); + setTimeout(() => { + this._document.defaultView?.location.reload(); + }, 100); + } + + private createWorkerDataUrl(): string { + const workerScript = `const tokenStore = new Map(); +const ports = new Set(); + +function broadcastToOtherPorts(senderPort, message) { + const deadPorts = []; + ports.forEach(p => { + if (p !== senderPort) { + try { + p.postMessage(message); + } catch (error) { + deadPorts.push(p); + } + } + }); + deadPorts.forEach(p => ports.delete(p)); +} + +function removePort(port) { + if (ports.has(port)) { + ports.delete(port); + } +} + +self.onconnect = (event) => { + const port = event.ports[0]; + ports.add(port); + + port.addEventListener('messageerror', () => { + removePort(port); + }); + + port.onmessage = (e) => { + const { action, key, value } = e.data; + + switch (action) { + case 'set': + if (key && value !== undefined) { + tokenStore.set(key, value); + broadcastToOtherPorts(port, { action: 'set', key, value }); + } + break; + + case 'remove': + if (key) { + tokenStore.delete(key); + broadcastToOtherPorts(port, { action: 'remove', key }); + } + break; + + case 'clear': + tokenStore.clear(); + broadcastToOtherPorts(port, { action: 'clear' }); + break; + + case 'get': + if (key) { + const value = tokenStore.get(key) ?? null; + port.postMessage({ action: 'get', key, value }); + } + break; + + case 'disconnect': + removePort(port); + break; + + default: + // + } + }; + + port.start(); +};`; + return 'data:application/javascript;base64,' + btoa(workerScript); + } +} diff --git a/npm/ng-packs/packages/oauth/src/lib/services/oauth.service.ts b/npm/ng-packs/packages/oauth/src/lib/services/oauth.service.ts index a25c3f6138..8a30b098e1 100644 --- a/npm/ng-packs/packages/oauth/src/lib/services/oauth.service.ts +++ b/npm/ng-packs/packages/oauth/src/lib/services/oauth.service.ts @@ -110,7 +110,12 @@ export class AbpOAuthService implements IAuthService { this.document.defaultView?.location.replace('/authorize'); return Promise.resolve(); } - return this.oAuthService.refreshToken(); + try { + return this.oAuthService.refreshToken(); + } catch (error) { + console.log("Error while refreshing token: ", error); + return Promise.reject(); + } } getAccessTokenExpiration(): number { diff --git a/npm/ng-packs/packages/oauth/src/lib/utils/storage.factory.ts b/npm/ng-packs/packages/oauth/src/lib/utils/storage.factory.ts index 97cd86682b..8a2f7e04c5 100644 --- a/npm/ng-packs/packages/oauth/src/lib/utils/storage.factory.ts +++ b/npm/ng-packs/packages/oauth/src/lib/utils/storage.factory.ts @@ -1,9 +1,9 @@ import { inject, PLATFORM_ID } from '@angular/core'; import { isPlatformBrowser } from '@angular/common'; import { ServerTokenStorageService } from '../services/server-token-storage.service'; -import { BrowserTokenStorageService } from '../services'; +import { BrowserTokenStorageService, MemoryTokenStorageService } from '../services'; import { OAuthStorage } from 'angular-oauth2-oidc'; -import { AbpLocalStorageService, APP_STARTED_WITH_SSR } from '@abp/ng.core'; +import { APP_STARTED_WITH_SSR } from '@abp/ng.core'; export class MockStorage implements Storage { private data = new Map(); @@ -35,5 +35,5 @@ export function oAuthStorageFactory(): OAuthStorage { ? inject(BrowserTokenStorageService) : inject(ServerTokenStorageService); } - return inject(AbpLocalStorageService); + return inject(MemoryTokenStorageService); } diff --git a/npm/ng-packs/packages/permission-management/project.json b/npm/ng-packs/packages/permission-management/project.json index eb09ef6178..3e3287256d 100644 --- a/npm/ng-packs/packages/permission-management/project.json +++ b/npm/ng-packs/packages/permission-management/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/permission-management/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "theme-shared"], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,7 +34,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [], - "implicitDependencies": ["core", "theme-shared"] + } } diff --git a/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/generate-proxy.json b/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/generate-proxy.json index dbdc934ed9..05e7c1c92d 100644 --- a/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/generate-proxy.json +++ b/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/generate-proxy.json @@ -3,37 +3,69 @@ "permissionManagement" ], "modules": { - "featureManagement": { - "rootPath": "featureManagement", - "remoteServiceName": "AbpFeatureManagement", + "abp": { + "rootPath": "abp", + "remoteServiceName": "abp", "controllers": { - "Volo.Abp.FeatureManagement.FeaturesController": { - "controllerName": "Features", - "controllerGroupName": "Features", - "type": "Volo.Abp.FeatureManagement.FeaturesController", + "Pages.Abp.MultiTenancy.AbpTenantController": { + "controllerName": "AbpTenant", + "controllerGroupName": "AbpTenant", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Pages.Abp.MultiTenancy.AbpTenantController", "interfaces": [ { - "type": "Volo.Abp.FeatureManagement.IFeatureAppService" + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService", + "name": "IAbpTenantAppService", + "methods": [ + { + "name": "FindTenantByNameAsync", + "parametersOnMethod": [ + { + "name": "name", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto" + } + }, + { + "name": "FindTenantByIdAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto" + } + } + ] } ], "actions": { - "GetAsyncByProviderNameAndProviderKey": { - "uniqueName": "GetAsyncByProviderNameAndProviderKey", - "name": "GetAsync", + "FindTenantByNameAsyncByName": { + "uniqueName": "FindTenantByNameAsyncByName", + "name": "FindTenantByNameAsync", "httpMethod": "GET", - "url": "api/feature-management/features", + "url": "api/abp/multi-tenancy/tenants/by-name/{name}", "supportedVersions": [], "parametersOnMethod": [ { - "name": "providerName", - "typeAsString": "System.String, System.Private.CoreLib", - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - }, - { - "name": "providerKey", + "name": "name", "typeAsString": "System.String, System.Private.CoreLib", "type": "System.String", "typeSimple": "string", @@ -43,181 +75,229 @@ ], "parameters": [ { - "nameOnMethod": "providerName", - "name": "providerName", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "" - }, - { - "nameOnMethod": "providerKey", - "name": "providerKey", + "nameOnMethod": "name", + "name": "name", "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", + "constraintTypes": [], + "bindingSourceId": "Path", "descriptorName": "" } ], "returnValue": { - "type": "Volo.Abp.FeatureManagement.GetFeatureListResultDto", - "typeSimple": "Volo.Abp.FeatureManagement.GetFeatureListResultDto" + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" + "implementFrom": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService" }, - "UpdateAsyncByProviderNameAndProviderKeyAndInput": { - "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput", - "name": "UpdateAsync", - "httpMethod": "PUT", - "url": "api/feature-management/features", + "FindTenantByIdAsyncById": { + "uniqueName": "FindTenantByIdAsyncById", + "name": "FindTenantByIdAsync", + "httpMethod": "GET", + "url": "api/abp/multi-tenancy/tenants/by-id/{id}", "supportedVersions": [], "parametersOnMethod": [ { - "name": "providerName", - "typeAsString": "System.String, System.Private.CoreLib", - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - }, - { - "name": "providerKey", - "typeAsString": "System.String, System.Private.CoreLib", - "type": "System.String", + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", "typeSimple": "string", "isOptional": false, "defaultValue": null - }, - { - "name": "input", - "typeAsString": "Volo.Abp.FeatureManagement.UpdateFeaturesDto, Volo.Abp.FeatureManagement.Application.Contracts", - "type": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", - "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", - "isOptional": false, - "defaultValue": null } ], "parameters": [ { - "nameOnMethod": "providerName", - "name": "providerName", + "nameOnMethod": "id", + "name": "id", "jsonName": null, - "type": "System.String", + "type": "System.Guid", "typeSimple": "string", "isOptional": false, "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", + "constraintTypes": [], + "bindingSourceId": "Path", "descriptorName": "" - }, + } + ], + "returnValue": { + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService" + } + } + }, + "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController": { + "controllerName": "AbpApiDefinition", + "controllerGroupName": "AbpApiDefinition", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController", + "interfaces": [], + "actions": { + "GetByModel": { + "uniqueName": "GetByModel", + "name": "Get", + "httpMethod": "GET", + "url": "api/abp/api-definition", + "supportedVersions": [], + "parametersOnMethod": [ { - "nameOnMethod": "providerKey", - "name": "providerKey", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", + "name": "model", + "typeAsString": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto, Volo.Abp.Http", + "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto", + "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto", "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "" - }, + "defaultValue": null + } + ], + "parameters": [ { - "nameOnMethod": "input", - "name": "input", + "nameOnMethod": "model", + "name": "IncludeTypes", "jsonName": null, - "type": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", - "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "type": "System.Boolean", + "typeSimple": "boolean", "isOptional": false, "defaultValue": null, "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" + "bindingSourceId": "ModelBinding", + "descriptorName": "model" } ], "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" + "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel", + "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" + "implementFrom": "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController" } } - } - } - }, - "multi-tenancy": { - "rootPath": "multi-tenancy", - "remoteServiceName": "AbpTenantManagement", - "controllers": { - "Volo.Abp.TenantManagement.TenantController": { - "controllerName": "Tenant", - "controllerGroupName": "Tenant", - "type": "Volo.Abp.TenantManagement.TenantController", + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController": { + "controllerName": "AbpApplicationConfiguration", + "controllerGroupName": "AbpApplicationConfiguration", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController", "interfaces": [ { - "type": "Volo.Abp.TenantManagement.ITenantAppService" + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationConfigurationAppService", + "name": "IAbpApplicationConfigurationAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "options", + "typeAsString": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions, Volo.Abp.AspNetCore.Mvc.Contracts", + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto" + } + } + ] } ], "actions": { - "GetAsyncById": { - "uniqueName": "GetAsyncById", + "GetAsyncByOptions": { + "uniqueName": "GetAsyncByOptions", "name": "GetAsync", "httpMethod": "GET", - "url": "api/multi-tenancy/tenants/{id}", + "url": "api/abp/application-configuration", "supportedVersions": [], "parametersOnMethod": [ { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", + "name": "options", + "typeAsString": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions, Volo.Abp.AspNetCore.Mvc.Contracts", + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions", "isOptional": false, "defaultValue": null } ], "parameters": [ { - "nameOnMethod": "id", - "name": "id", + "nameOnMethod": "options", + "name": "IncludeLocalizationResources", "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", + "type": "System.Boolean", + "typeSimple": "boolean", "isOptional": false, "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", - "descriptorName": "" + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "options" } ], "returnValue": { - "type": "Volo.Abp.TenantManagement.TenantDto", - "typeSimple": "Volo.Abp.TenantManagement.TenantDto" + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" - }, - "GetListAsyncByInput": { - "uniqueName": "GetListAsyncByInput", - "name": "GetListAsync", + "implementFrom": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationConfigurationAppService" + } + } + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationLocalizationController": { + "controllerName": "AbpApplicationLocalization", + "controllerGroupName": "AbpApplicationLocalization", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationLocalizationController", + "interfaces": [ + { + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationLocalizationAppService", + "name": "IAbpApplicationLocalizationAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto, Volo.Abp.AspNetCore.Mvc.Contracts", + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationDto" + } + } + ] + } + ], + "actions": { + "GetAsyncByInput": { + "uniqueName": "GetAsyncByInput", + "name": "GetAsync", "httpMethod": "GET", - "url": "api/multi-tenancy/tenants", + "url": "api/abp/application-localization", "supportedVersions": [], "parametersOnMethod": [ { "name": "input", - "typeAsString": "Volo.Abp.TenantManagement.GetTenantsInput, Volo.Abp.TenantManagement.Application.Contracts", - "type": "Volo.Abp.TenantManagement.GetTenantsInput", - "typeSimple": "Volo.Abp.TenantManagement.GetTenantsInput", + "typeAsString": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto, Volo.Abp.AspNetCore.Mvc.Contracts", + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto", "isOptional": false, "defaultValue": null } @@ -225,7 +305,7 @@ "parameters": [ { "nameOnMethod": "input", - "name": "Filter", + "name": "CultureName", "jsonName": null, "type": "System.String", "typeSimple": "string", @@ -237,60 +317,165 @@ }, { "nameOnMethod": "input", - "name": "Sorting", + "name": "OnlyDynamics", "jsonName": null, - "type": "System.String", - "typeSimple": "string", + "type": "System.Boolean", + "typeSimple": "boolean", "isOptional": false, "defaultValue": null, "constraintTypes": null, "bindingSourceId": "ModelBinding", "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationLocalizationAppService" + } + } + } + } + }, + "account": { + "rootPath": "account", + "remoteServiceName": "AbpAccount", + "controllers": { + "Volo.Abp.Account.AccountController": { + "controllerName": "Account", + "controllerGroupName": "Account", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Account.AccountController", + "interfaces": [ + { + "type": "Volo.Abp.Account.IAccountAppService", + "name": "IAccountAppService", + "methods": [ + { + "name": "RegisterAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.RegisterDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.RegisterDto", + "typeSimple": "Volo.Abp.Account.RegisterDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + } }, { - "nameOnMethod": "input", - "name": "SkipCount", - "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" + "name": "SendPasswordResetCodeAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.SendPasswordResetCodeDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.SendPasswordResetCodeDto", + "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } }, + { + "name": "VerifyPasswordResetTokenAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyPasswordResetTokenInput, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.VerifyPasswordResetTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyPasswordResetTokenInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "ResetPasswordAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ResetPasswordDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.ResetPasswordDto", + "typeSimple": "Volo.Abp.Account.ResetPasswordDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "RegisterAsyncByInput": { + "uniqueName": "RegisterAsyncByInput", + "name": "RegisterAsync", + "httpMethod": "POST", + "url": "api/account/register", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.RegisterDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.RegisterDto", + "typeSimple": "Volo.Abp.Account.RegisterDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ { "nameOnMethod": "input", - "name": "MaxResultCount", + "name": "input", "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", + "type": "Volo.Abp.Account.RegisterDto", + "typeSimple": "Volo.Abp.Account.RegisterDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" + "bindingSourceId": "Body", + "descriptorName": "" } ], "returnValue": { - "type": "Volo.Abp.Application.Dtos.PagedResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + "implementFrom": "Volo.Abp.Account.IAccountAppService" }, - "CreateAsyncByInput": { - "uniqueName": "CreateAsyncByInput", - "name": "CreateAsync", + "SendPasswordResetCodeAsyncByInput": { + "uniqueName": "SendPasswordResetCodeAsyncByInput", + "name": "SendPasswordResetCodeAsync", "httpMethod": "POST", - "url": "api/multi-tenancy/tenants", + "url": "api/account/send-password-reset-code", "supportedVersions": [], "parametersOnMethod": [ { "name": "input", - "typeAsString": "Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts", - "type": "Volo.Abp.TenantManagement.TenantCreateDto", - "typeSimple": "Volo.Abp.TenantManagement.TenantCreateDto", + "typeAsString": "Volo.Abp.Account.SendPasswordResetCodeDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.SendPasswordResetCodeDto", + "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto", "isOptional": false, "defaultValue": null } @@ -300,8 +485,8 @@ "nameOnMethod": "input", "name": "input", "jsonName": null, - "type": "Volo.Abp.TenantManagement.TenantCreateDto", - "typeSimple": "Volo.Abp.TenantManagement.TenantCreateDto", + "type": "Volo.Abp.Account.SendPasswordResetCodeDto", + "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, @@ -310,55 +495,35 @@ } ], "returnValue": { - "type": "Volo.Abp.TenantManagement.TenantDto", - "typeSimple": "Volo.Abp.TenantManagement.TenantDto" + "type": "System.Void", + "typeSimple": "System.Void" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + "implementFrom": "Volo.Abp.Account.IAccountAppService" }, - "UpdateAsyncByIdAndInput": { - "uniqueName": "UpdateAsyncByIdAndInput", - "name": "UpdateAsync", - "httpMethod": "PUT", - "url": "api/multi-tenancy/tenants/{id}", + "VerifyPasswordResetTokenAsyncByInput": { + "uniqueName": "VerifyPasswordResetTokenAsyncByInput", + "name": "VerifyPasswordResetTokenAsync", + "httpMethod": "POST", + "url": "api/account/verify-password-reset-token", "supportedVersions": [], "parametersOnMethod": [ - { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - }, { "name": "input", - "typeAsString": "Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts", - "type": "Volo.Abp.TenantManagement.TenantUpdateDto", - "typeSimple": "Volo.Abp.TenantManagement.TenantUpdateDto", + "typeAsString": "Volo.Abp.Account.VerifyPasswordResetTokenInput, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.VerifyPasswordResetTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyPasswordResetTokenInput", "isOptional": false, "defaultValue": null } ], "parameters": [ - { - "nameOnMethod": "id", - "name": "id", - "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", - "descriptorName": "" - }, { "nameOnMethod": "input", "name": "input", "jsonName": null, - "type": "Volo.Abp.TenantManagement.TenantUpdateDto", - "typeSimple": "Volo.Abp.TenantManagement.TenantUpdateDto", + "type": "Volo.Abp.Account.VerifyPasswordResetTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyPasswordResetTokenInput", "isOptional": false, "defaultValue": null, "constraintTypes": null, @@ -367,39 +532,39 @@ } ], "returnValue": { - "type": "Volo.Abp.TenantManagement.TenantDto", - "typeSimple": "Volo.Abp.TenantManagement.TenantDto" + "type": "System.Boolean", + "typeSimple": "boolean" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + "implementFrom": "Volo.Abp.Account.IAccountAppService" }, - "DeleteAsyncById": { - "uniqueName": "DeleteAsyncById", - "name": "DeleteAsync", - "httpMethod": "DELETE", - "url": "api/multi-tenancy/tenants/{id}", + "ResetPasswordAsyncByInput": { + "uniqueName": "ResetPasswordAsyncByInput", + "name": "ResetPasswordAsync", + "httpMethod": "POST", + "url": "api/account/reset-password", "supportedVersions": [], "parametersOnMethod": [ { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", + "name": "input", + "typeAsString": "Volo.Abp.Account.ResetPasswordDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.ResetPasswordDto", + "typeSimple": "Volo.Abp.Account.ResetPasswordDto", "isOptional": false, "defaultValue": null } ], "parameters": [ { - "nameOnMethod": "id", - "name": "id", + "nameOnMethod": "input", + "name": "input", "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", + "type": "Volo.Abp.Account.ResetPasswordDto", + "typeSimple": "Volo.Abp.Account.ResetPasswordDto", "isOptional": false, "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", + "constraintTypes": null, + "bindingSourceId": "Body", "descriptorName": "" } ], @@ -408,92 +573,188 @@ "typeSimple": "System.Void" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" - }, - "GetDefaultConnectionStringAsyncById": { - "uniqueName": "GetDefaultConnectionStringAsyncById", - "name": "GetDefaultConnectionStringAsync", + "implementFrom": "Volo.Abp.Account.IAccountAppService" + } + } + }, + "Volo.Abp.Account.DynamicClaimsController": { + "controllerName": "DynamicClaims", + "controllerGroupName": "DynamicClaims", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Account.DynamicClaimsController", + "interfaces": [ + { + "type": "Volo.Abp.Account.IDynamicClaimsAppService", + "name": "IDynamicClaimsAppService", + "methods": [ + { + "name": "RefreshAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "RefreshAsync": { + "uniqueName": "RefreshAsync", + "name": "RefreshAsync", + "httpMethod": "POST", + "url": "api/account/dynamic-claims/refresh", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IDynamicClaimsAppService" + } + } + }, + "Volo.Abp.Account.ProfileController": { + "controllerName": "Profile", + "controllerGroupName": "Profile", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Account.ProfileController", + "interfaces": [ + { + "type": "Volo.Abp.Account.IProfileAppService", + "name": "IProfileAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Account.ProfileDto", + "typeSimple": "Volo.Abp.Account.ProfileDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.UpdateProfileDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.UpdateProfileDto", + "typeSimple": "Volo.Abp.Account.UpdateProfileDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Account.ProfileDto", + "typeSimple": "Volo.Abp.Account.ProfileDto" + } + }, + { + "name": "ChangePasswordAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ChangePasswordInput, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.ChangePasswordInput", + "typeSimple": "Volo.Abp.Account.ChangePasswordInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", "httpMethod": "GET", - "url": "api/multi-tenancy/tenants/{id}/default-connection-string", + "url": "api/account/my-profile", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Account.ProfileDto", + "typeSimple": "Volo.Abp.Account.ProfileDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IProfileAppService" + }, + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/account/my-profile", "supportedVersions": [], "parametersOnMethod": [ { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", + "name": "input", + "typeAsString": "Volo.Abp.Account.UpdateProfileDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.UpdateProfileDto", + "typeSimple": "Volo.Abp.Account.UpdateProfileDto", "isOptional": false, "defaultValue": null } ], "parameters": [ { - "nameOnMethod": "id", - "name": "id", + "nameOnMethod": "input", + "name": "input", "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", + "type": "Volo.Abp.Account.UpdateProfileDto", + "typeSimple": "Volo.Abp.Account.UpdateProfileDto", "isOptional": false, "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", + "constraintTypes": null, + "bindingSourceId": "Body", "descriptorName": "" } ], "returnValue": { - "type": "System.String", - "typeSimple": "string" + "type": "Volo.Abp.Account.ProfileDto", + "typeSimple": "Volo.Abp.Account.ProfileDto" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.TenantManagement.ITenantAppService" + "implementFrom": "Volo.Abp.Account.IProfileAppService" }, - "UpdateDefaultConnectionStringAsyncByIdAndDefaultConnectionString": { - "uniqueName": "UpdateDefaultConnectionStringAsyncByIdAndDefaultConnectionString", - "name": "UpdateDefaultConnectionStringAsync", - "httpMethod": "PUT", - "url": "api/multi-tenancy/tenants/{id}/default-connection-string", + "ChangePasswordAsyncByInput": { + "uniqueName": "ChangePasswordAsyncByInput", + "name": "ChangePasswordAsync", + "httpMethod": "POST", + "url": "api/account/my-profile/change-password", "supportedVersions": [], "parametersOnMethod": [ { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - }, - { - "name": "defaultConnectionString", - "typeAsString": "System.String, System.Private.CoreLib", - "type": "System.String", - "typeSimple": "string", + "name": "input", + "typeAsString": "Volo.Abp.Account.ChangePasswordInput, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.ChangePasswordInput", + "typeSimple": "Volo.Abp.Account.ChangePasswordInput", "isOptional": false, "defaultValue": null } ], "parameters": [ { - "nameOnMethod": "id", - "name": "id", - "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", - "descriptorName": "" - }, - { - "nameOnMethod": "defaultConnectionString", - "name": "defaultConnectionString", + "nameOnMethod": "input", + "name": "input", "jsonName": null, - "type": "System.String", - "typeSimple": "string", + "type": "Volo.Abp.Account.ChangePasswordInput", + "typeSimple": "Volo.Abp.Account.ChangePasswordInput", "isOptional": false, "defaultValue": null, "constraintTypes": null, - "bindingSourceId": "ModelBinding", + "bindingSourceId": "Body", "descriptorName": "" } ], @@ -502,179 +763,16 @@ "typeSimple": "System.Void" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.TenantManagement.ITenantAppService" - }, - "DeleteDefaultConnectionStringAsyncById": { - "uniqueName": "DeleteDefaultConnectionStringAsyncById", - "name": "DeleteDefaultConnectionStringAsync", - "httpMethod": "DELETE", - "url": "api/multi-tenancy/tenants/{id}/default-connection-string", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "id", - "name": "id", - "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Abp.TenantManagement.ITenantAppService" - } - } - } - } - }, - "account": { - "rootPath": "account", - "remoteServiceName": "AbpAccount", - "controllers": { - "Volo.Abp.Account.AccountController": { - "controllerName": "Account", - "controllerGroupName": "Account", - "type": "Volo.Abp.Account.AccountController", - "interfaces": [ - { - "type": "Volo.Abp.Account.IAccountAppService" - } - ], - "actions": { - "RegisterAsyncByInput": { - "uniqueName": "RegisterAsyncByInput", - "name": "RegisterAsync", - "httpMethod": "POST", - "url": "api/account/register", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Abp.Account.RegisterDto, Volo.Abp.Account.Application.Contracts", - "type": "Volo.Abp.Account.RegisterDto", - "typeSimple": "Volo.Abp.Account.RegisterDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "input", - "jsonName": null, - "type": "Volo.Abp.Account.RegisterDto", - "typeSimple": "Volo.Abp.Account.RegisterDto", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" - } - ], - "returnValue": { - "type": "Volo.Abp.Identity.IdentityUserDto", - "typeSimple": "Volo.Abp.Identity.IdentityUserDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Abp.Account.IAccountAppService" - }, - "SendPasswordResetCodeAsyncByInput": { - "uniqueName": "SendPasswordResetCodeAsyncByInput", - "name": "SendPasswordResetCodeAsync", - "httpMethod": "POST", - "url": "api/account/send-password-reset-code", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Abp.Account.SendPasswordResetCodeDto, Volo.Abp.Account.Application.Contracts", - "type": "Volo.Abp.Account.SendPasswordResetCodeDto", - "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "input", - "jsonName": null, - "type": "Volo.Abp.Account.SendPasswordResetCodeDto", - "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Abp.Account.IAccountAppService" - }, - "ResetPasswordAsyncByInput": { - "uniqueName": "ResetPasswordAsyncByInput", - "name": "ResetPasswordAsync", - "httpMethod": "POST", - "url": "api/account/reset-password", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Abp.Account.ResetPasswordDto, Volo.Abp.Account.Application.Contracts", - "type": "Volo.Abp.Account.ResetPasswordDto", - "typeSimple": "Volo.Abp.Account.ResetPasswordDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "input", - "jsonName": null, - "type": "Volo.Abp.Account.ResetPasswordDto", - "typeSimple": "Volo.Abp.Account.ResetPasswordDto", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Abp.Account.IAccountAppService" + "implementFrom": "Volo.Abp.Account.IProfileAppService" } } }, "Volo.Abp.Account.Web.Areas.Account.Controllers.AccountController": { "controllerName": "Account", "controllerGroupName": "Login", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.AccountController", "interfaces": [], "actions": { @@ -771,87 +869,106 @@ } } }, - "settingManagement": { - "rootPath": "settingManagement", - "remoteServiceName": "SettingManagement", + "featureManagement": { + "rootPath": "featureManagement", + "remoteServiceName": "AbpFeatureManagement", "controllers": { - "Volo.Abp.SettingManagement.EmailSettingsController": { - "controllerName": "EmailSettings", - "controllerGroupName": "EmailSettings", - "type": "Volo.Abp.SettingManagement.EmailSettingsController", + "Volo.Abp.FeatureManagement.FeaturesController": { + "controllerName": "Features", + "controllerGroupName": "Features", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.FeatureManagement.FeaturesController", "interfaces": [ { - "type": "Volo.Abp.SettingManagement.IEmailSettingsAppService" - } - ], - "actions": { - "GetAsync": { - "uniqueName": "GetAsync", - "name": "GetAsync", - "httpMethod": "GET", - "url": "api/setting-management/emailing", - "supportedVersions": [], - "parametersOnMethod": [], - "parameters": [], - "returnValue": { - "type": "Volo.Abp.SettingManagement.EmailSettingsDto", - "typeSimple": "Volo.Abp.SettingManagement.EmailSettingsDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Abp.SettingManagement.IEmailSettingsAppService" - }, - "UpdateAsyncByInput": { - "uniqueName": "UpdateAsyncByInput", - "name": "UpdateAsync", - "httpMethod": "POST", - "url": "api/setting-management/emailing", - "supportedVersions": [], - "parametersOnMethod": [ + "type": "Volo.Abp.FeatureManagement.IFeatureAppService", + "name": "IFeatureAppService", + "methods": [ { - "name": "input", - "typeAsString": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto, Volo.Abp.SettingManagement.Application.Contracts", - "type": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", - "typeSimple": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.FeatureManagement.GetFeatureListResultDto", + "typeSimple": "Volo.Abp.FeatureManagement.GetFeatureListResultDto" + } + }, { - "nameOnMethod": "input", - "name": "input", - "jsonName": null, - "type": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", - "typeSimple": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.FeatureManagement.UpdateFeaturesDto, Volo.Abp.FeatureManagement.Application.Contracts", + "type": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "DeleteAsync", + "parametersOnMethod": [ + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Abp.SettingManagement.IEmailSettingsAppService" - } - } - } - } - }, - "permissionManagement": { - "rootPath": "permissionManagement", - "remoteServiceName": "AbpPermissionManagement", - "controllers": { - "Volo.Abp.PermissionManagement.PermissionsController": { - "controllerName": "Permissions", - "controllerGroupName": "Permissions", - "type": "Volo.Abp.PermissionManagement.PermissionsController", - "interfaces": [ - { - "type": "Volo.Abp.PermissionManagement.IPermissionAppService" + ] } ], "actions": { @@ -859,7 +976,7 @@ "uniqueName": "GetAsyncByProviderNameAndProviderKey", "name": "GetAsync", "httpMethod": "GET", - "url": "api/permission-management/permissions", + "url": "api/feature-management/features", "supportedVersions": [], "parametersOnMethod": [ { @@ -906,17 +1023,17 @@ } ], "returnValue": { - "type": "Volo.Abp.PermissionManagement.GetPermissionListResultDto", - "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto" + "type": "Volo.Abp.FeatureManagement.GetFeatureListResultDto", + "typeSimple": "Volo.Abp.FeatureManagement.GetFeatureListResultDto" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" }, "UpdateAsyncByProviderNameAndProviderKeyAndInput": { "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput", "name": "UpdateAsync", "httpMethod": "PUT", - "url": "api/permission-management/permissions", + "url": "api/feature-management/features", "supportedVersions": [], "parametersOnMethod": [ { @@ -937,9 +1054,9 @@ }, { "name": "input", - "typeAsString": "Volo.Abp.PermissionManagement.UpdatePermissionsDto, Volo.Abp.PermissionManagement.Application.Contracts", - "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", - "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "typeAsString": "Volo.Abp.FeatureManagement.UpdateFeaturesDto, Volo.Abp.FeatureManagement.Application.Contracts", + "type": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", "isOptional": false, "defaultValue": null } @@ -973,8 +1090,8 @@ "nameOnMethod": "input", "name": "input", "jsonName": null, - "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", - "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "type": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, @@ -987,171 +1104,64 @@ "typeSimple": "System.Void" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" - } - } - } - } - }, - "abp": { - "rootPath": "abp", - "remoteServiceName": "abp", - "controllers": { - "Pages.Abp.MultiTenancy.AbpTenantController": { - "controllerName": "AbpTenant", - "controllerGroupName": "AbpTenant", - "type": "Pages.Abp.MultiTenancy.AbpTenantController", - "interfaces": [ - { - "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService" - } - ], - "actions": { - "FindTenantByNameAsyncByName": { - "uniqueName": "FindTenantByNameAsyncByName", - "name": "FindTenantByNameAsync", - "httpMethod": "GET", - "url": "api/abp/multi-tenancy/tenants/by-name/{name}", + "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" + }, + "DeleteAsyncByProviderNameAndProviderKey": { + "uniqueName": "DeleteAsyncByProviderNameAndProviderKey", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/feature-management/features", "supportedVersions": [], "parametersOnMethod": [ { - "name": "name", + "name": "providerName", "typeAsString": "System.String, System.Private.CoreLib", "type": "System.String", "typeSimple": "string", "isOptional": false, "defaultValue": null - } - ], - "parameters": [ + }, { - "nameOnMethod": "name", - "name": "name", - "jsonName": null, + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", "type": "System.String", "typeSimple": "string", "isOptional": false, - "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", - "descriptorName": "" - } - ], - "returnValue": { - "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService" - }, - "FindTenantByIdAsyncById": { - "uniqueName": "FindTenantByIdAsyncById", - "name": "FindTenantByIdAsync", - "httpMethod": "GET", - "url": "api/abp/multi-tenancy/tenants/by-id/{id}", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, "defaultValue": null } ], "parameters": [ { - "nameOnMethod": "id", - "name": "id", + "nameOnMethod": "providerName", + "name": "providerName", "jsonName": null, - "type": "System.Guid", + "type": "System.String", "typeSimple": "string", "isOptional": false, "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", + "constraintTypes": null, + "bindingSourceId": "ModelBinding", "descriptorName": "" - } - ], - "returnValue": { - "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService" - } - } - }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController": { - "controllerName": "AbpApplicationConfiguration", - "controllerGroupName": "AbpApplicationConfiguration", - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController", - "interfaces": [ - { - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationConfigurationAppService" - } - ], - "actions": { - "GetAsync": { - "uniqueName": "GetAsync", - "name": "GetAsync", - "httpMethod": "GET", - "url": "api/abp/application-configuration", - "supportedVersions": [], - "parametersOnMethod": [], - "parameters": [], - "returnValue": { - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationConfigurationAppService" - } - } - }, - "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController": { - "controllerName": "AbpApiDefinition", - "controllerGroupName": "AbpApiDefinition", - "type": "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController", - "interfaces": [], - "actions": { - "GetByModel": { - "uniqueName": "GetByModel", - "name": "Get", - "httpMethod": "GET", - "url": "api/abp/api-definition", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "model", - "typeAsString": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto, Volo.Abp.Http", - "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto", - "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ + }, { - "nameOnMethod": "model", - "name": "IncludeTypes", + "nameOnMethod": "providerKey", + "name": "providerKey", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", + "type": "System.String", + "typeSimple": "string", "isOptional": false, "defaultValue": null, "constraintTypes": null, "bindingSourceId": "ModelBinding", - "descriptorName": "model" + "descriptorName": "" } ], "returnValue": { - "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel", - "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel" + "type": "System.Void", + "typeSimple": "System.Void" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController" + "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" } } } @@ -1164,10 +1174,117 @@ "Volo.Abp.Identity.IdentityRoleController": { "controllerName": "IdentityRole", "controllerGroupName": "Role", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, "type": "Volo.Abp.Identity.IdentityRoleController", "interfaces": [ { - "type": "Volo.Abp.Identity.IIdentityRoleAppService" + "type": "Volo.Abp.Identity.IIdentityRoleAppService", + "name": "IIdentityRoleAppService", + "methods": [ + { + "name": "GetAllListAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityRoleDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityRolesInput, Volo.Abp.Identity.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityRolesInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityRolesInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityRoleCreateDto, Volo.Abp.Identity.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityRoleCreateDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityRoleDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityRoleUpdateDto, Volo.Abp.Identity.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityRoleUpdateDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleUpdateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityRoleDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleDto" + } + }, + { + "name": "DeleteAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] } ], "actions": { @@ -1250,6 +1367,18 @@ "constraintTypes": null, "bindingSourceId": "ModelBinding", "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ExtraProperties", + "jsonName": null, + "type": "Volo.Abp.Data.ExtraPropertyDictionary", + "typeSimple": "{string:object}", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" } ], "returnValue": { @@ -1432,10 +1561,193 @@ "Volo.Abp.Identity.IdentityUserController": { "controllerName": "IdentityUser", "controllerGroupName": "User", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, "type": "Volo.Abp.Identity.IdentityUserController", "interfaces": [ { - "type": "Volo.Abp.Identity.IIdentityUserAppService" + "type": "Volo.Abp.Identity.IIdentityUserAppService", + "name": "IIdentityUserAppService", + "methods": [ + { + "name": "GetRolesAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "GetAssignableRolesAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "UpdateRolesAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityUserUpdateRolesDto, Volo.Abp.Identity.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityUserUpdateRolesDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateRolesDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "FindByUsernameAsync", + "parametersOnMethod": [ + { + "name": "userName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + } + }, + { + "name": "FindByEmailAsync", + "parametersOnMethod": [ + { + "name": "email", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityUsersInput, Volo.Abp.Identity.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityUsersInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityUsersInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityUserCreateDto, Volo.Abp.Identity.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityUserCreateDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityUserUpdateDto, Volo.Abp.Identity.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityUserUpdateDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + } + }, + { + "name": "DeleteAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] } ], "actions": { @@ -1540,6 +1852,18 @@ "constraintTypes": null, "bindingSourceId": "ModelBinding", "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ExtraProperties", + "jsonName": null, + "type": "Volo.Abp.Data.ExtraPropertyDictionary", + "typeSimple": "{string:object}", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" } ], "returnValue": { @@ -1868,10 +2192,84 @@ "Volo.Abp.Identity.IdentityUserLookupController": { "controllerName": "IdentityUserLookup", "controllerGroupName": "UserLookup", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, "type": "Volo.Abp.Identity.IdentityUserLookupController", "interfaces": [ { - "type": "Volo.Abp.Identity.IIdentityUserLookupAppService" + "type": "Volo.Abp.Identity.IIdentityUserLookupAppService", + "name": "IIdentityUserLookupAppService", + "methods": [ + { + "name": "FindByIdAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Users.UserData", + "typeSimple": "Volo.Abp.Users.UserData" + } + }, + { + "name": "FindByUserNameAsync", + "parametersOnMethod": [ + { + "name": "userName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Users.UserData", + "typeSimple": "Volo.Abp.Users.UserData" + } + }, + { + "name": "SearchAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.UserLookupSearchInputDto, Volo.Abp.Identity.Application.Contracts", + "type": "Volo.Abp.Identity.UserLookupSearchInputDto", + "typeSimple": "Volo.Abp.Identity.UserLookupSearchInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "GetCountAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.UserLookupCountInputDto, Volo.Abp.Identity.Application.Contracts", + "type": "Volo.Abp.Identity.UserLookupCountInputDto", + "typeSimple": "Volo.Abp.Identity.UserLookupCountInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Int64", + "typeSimple": "number" + } + } + ] } ], "actions": { @@ -2013,6 +2411,18 @@ "constraintTypes": null, "bindingSourceId": "ModelBinding", "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ExtraProperties", + "jsonName": null, + "type": "Volo.Abp.Data.ExtraPropertyDictionary", + "typeSimple": "{string:object}", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" } ], "returnValue": { @@ -2060,44 +2470,303 @@ "implementFrom": "Volo.Abp.Identity.IIdentityUserLookupAppService" } } - }, - "Volo.Abp.Identity.ProfileController": { - "controllerName": "Profile", - "controllerGroupName": "Profile", - "type": "Volo.Abp.Identity.ProfileController", + } + } + }, + "multi-tenancy": { + "rootPath": "multi-tenancy", + "remoteServiceName": "AbpTenantManagement", + "controllers": { + "Volo.Abp.TenantManagement.TenantController": { + "controllerName": "Tenant", + "controllerGroupName": "Tenant", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.TenantManagement.TenantController", "interfaces": [ { - "type": "Volo.Abp.Identity.IProfileAppService" - } - ], - "actions": { - "GetAsync": { - "uniqueName": "GetAsync", - "name": "GetAsync", - "httpMethod": "GET", - "url": "api/identity/my-profile", - "supportedVersions": [], - "parametersOnMethod": [], - "parameters": [], - "returnValue": { - "type": "Volo.Abp.Identity.ProfileDto", - "typeSimple": "Volo.Abp.Identity.ProfileDto" - }, + "type": "Volo.Abp.TenantManagement.ITenantAppService", + "name": "ITenantAppService", + "methods": [ + { + "name": "GetDefaultConnectionStringAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + } + }, + { + "name": "UpdateDefaultConnectionStringAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "defaultConnectionString", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "DeleteDefaultConnectionStringAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.TenantManagement.TenantDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TenantManagement.GetTenantsInput, Volo.Abp.TenantManagement.Application.Contracts", + "type": "Volo.Abp.TenantManagement.GetTenantsInput", + "typeSimple": "Volo.Abp.TenantManagement.GetTenantsInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts", + "type": "Volo.Abp.TenantManagement.TenantCreateDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.TenantManagement.TenantDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts", + "type": "Volo.Abp.TenantManagement.TenantUpdateDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantUpdateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.TenantManagement.TenantDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantDto" + } + }, + { + "name": "DeleteAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/multi-tenancy/tenants/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.TenantManagement.TenantDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantDto" + }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.Identity.IProfileAppService" + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" }, - "UpdateAsyncByInput": { - "uniqueName": "UpdateAsyncByInput", - "name": "UpdateAsync", - "httpMethod": "PUT", - "url": "api/identity/my-profile", + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/multi-tenancy/tenants", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TenantManagement.GetTenantsInput, Volo.Abp.TenantManagement.Application.Contracts", + "type": "Volo.Abp.TenantManagement.GetTenantsInput", + "typeSimple": "Volo.Abp.TenantManagement.GetTenantsInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "SkipCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/multi-tenancy/tenants", "supportedVersions": [], "parametersOnMethod": [ { "name": "input", - "typeAsString": "Volo.Abp.Identity.UpdateProfileDto, Volo.Abp.Identity.Application.Contracts", - "type": "Volo.Abp.Identity.UpdateProfileDto", - "typeSimple": "Volo.Abp.Identity.UpdateProfileDto", + "typeAsString": "Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts", + "type": "Volo.Abp.TenantManagement.TenantCreateDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantCreateDto", "isOptional": false, "defaultValue": null } @@ -2107,8 +2776,8 @@ "nameOnMethod": "input", "name": "input", "jsonName": null, - "type": "Volo.Abp.Identity.UpdateProfileDto", - "typeSimple": "Volo.Abp.Identity.UpdateProfileDto", + "type": "Volo.Abp.TenantManagement.TenantCreateDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantCreateDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, @@ -2117,35 +2786,55 @@ } ], "returnValue": { - "type": "Volo.Abp.Identity.ProfileDto", - "typeSimple": "Volo.Abp.Identity.ProfileDto" + "type": "Volo.Abp.TenantManagement.TenantDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantDto" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.Identity.IProfileAppService" + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" }, - "ChangePasswordAsyncByInput": { - "uniqueName": "ChangePasswordAsyncByInput", - "name": "ChangePasswordAsync", - "httpMethod": "POST", - "url": "api/identity/my-profile/change-password", + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/multi-tenancy/tenants/{id}", "supportedVersions": [], "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, { "name": "input", - "typeAsString": "Volo.Abp.Identity.ChangePasswordInput, Volo.Abp.Identity.Application.Contracts", - "type": "Volo.Abp.Identity.ChangePasswordInput", - "typeSimple": "Volo.Abp.Identity.ChangePasswordInput", + "typeAsString": "Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts", + "type": "Volo.Abp.TenantManagement.TenantUpdateDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantUpdateDto", "isOptional": false, "defaultValue": null } ], "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, { "nameOnMethod": "input", "name": "input", "jsonName": null, - "type": "Volo.Abp.Identity.ChangePasswordInput", - "typeSimple": "Volo.Abp.Identity.ChangePasswordInput", + "type": "Volo.Abp.TenantManagement.TenantUpdateDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantUpdateDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, @@ -2153,259 +2842,2882 @@ "descriptorName": "" } ], + "returnValue": { + "type": "Volo.Abp.TenantManagement.TenantDto", + "typeSimple": "Volo.Abp.TenantManagement.TenantDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/multi-tenancy/tenants/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], "returnValue": { "type": "System.Void", "typeSimple": "System.Void" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.Identity.IProfileAppService" - } - } + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "GetDefaultConnectionStringAsyncById": { + "uniqueName": "GetDefaultConnectionStringAsyncById", + "name": "GetDefaultConnectionStringAsync", + "httpMethod": "GET", + "url": "api/multi-tenancy/tenants/{id}/default-connection-string", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.TenantManagement.ITenantAppService" + }, + "UpdateDefaultConnectionStringAsyncByIdAndDefaultConnectionString": { + "uniqueName": "UpdateDefaultConnectionStringAsyncByIdAndDefaultConnectionString", + "name": "UpdateDefaultConnectionStringAsync", + "httpMethod": "PUT", + "url": "api/multi-tenancy/tenants/{id}/default-connection-string", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "defaultConnectionString", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "defaultConnectionString", + "name": "defaultConnectionString", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.TenantManagement.ITenantAppService" + }, + "DeleteDefaultConnectionStringAsyncById": { + "uniqueName": "DeleteDefaultConnectionStringAsyncById", + "name": "DeleteDefaultConnectionStringAsync", + "httpMethod": "DELETE", + "url": "api/multi-tenancy/tenants/{id}/default-connection-string", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.TenantManagement.ITenantAppService" + } + } + } + } + }, + "permissionManagement": { + "rootPath": "permissionManagement", + "remoteServiceName": "AbpPermissionManagement", + "controllers": { + "Volo.Abp.PermissionManagement.PermissionsController": { + "controllerName": "Permissions", + "controllerGroupName": "Permissions", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.PermissionManagement.PermissionsController", + "interfaces": [ + { + "type": "Volo.Abp.PermissionManagement.IPermissionAppService", + "name": "IPermissionAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetPermissionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto" + } + }, + { + "name": "GetByGroupAsync", + "parametersOnMethod": [ + { + "name": "groupName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetPermissionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.PermissionManagement.UpdatePermissionsDto, Volo.Abp.PermissionManagement.Application.Contracts", + "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetResourceProviderKeyLookupServicesAsync", + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetResourceProviderListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetResourceProviderListResultDto" + } + }, + { + "name": "SearchResourceProviderKeyAsync", + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "serviceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "filter", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "page", + "typeAsString": "System.Int32, System.Private.CoreLib", + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.SearchProviderKeyListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.SearchProviderKeyListResultDto" + } + }, + { + "name": "GetResourceDefinitionsAsync", + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetResourcePermissionDefinitionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetResourcePermissionDefinitionListResultDto" + } + }, + { + "name": "GetResourceAsync", + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "resourceKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetResourcePermissionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetResourcePermissionListResultDto" + } + }, + { + "name": "GetResourceByProviderAsync", + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "resourceKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetResourcePermissionWithProviderListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetResourcePermissionWithProviderListResultDto" + } + }, + { + "name": "UpdateResourceAsync", + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "resourceKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.PermissionManagement.UpdateResourcePermissionsDto, Volo.Abp.PermissionManagement.Application.Contracts", + "type": "Volo.Abp.PermissionManagement.UpdateResourcePermissionsDto", + "typeSimple": "Volo.Abp.PermissionManagement.UpdateResourcePermissionsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "DeleteResourceAsync", + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "resourceKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsyncByProviderNameAndProviderKey": { + "uniqueName": "GetAsyncByProviderNameAndProviderKey", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/permission-management/permissions", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "providerName", + "name": "providerName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetPermissionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + }, + "GetByGroupAsyncByGroupNameAndProviderNameAndProviderKey": { + "uniqueName": "GetByGroupAsyncByGroupNameAndProviderNameAndProviderKey", + "name": "GetByGroupAsync", + "httpMethod": "GET", + "url": "api/permission-management/permissions/by-group", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "groupName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "groupName", + "name": "groupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "providerName", + "name": "providerName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetPermissionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + }, + "UpdateAsyncByProviderNameAndProviderKeyAndInput": { + "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/permission-management/permissions", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.PermissionManagement.UpdatePermissionsDto, Volo.Abp.PermissionManagement.Application.Contracts", + "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "providerName", + "name": "providerName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + }, + "GetResourceProviderKeyLookupServicesAsyncByResourceName": { + "uniqueName": "GetResourceProviderKeyLookupServicesAsyncByResourceName", + "name": "GetResourceProviderKeyLookupServicesAsync", + "httpMethod": "GET", + "url": "api/permission-management/permissions/resource-provider-key-lookup-services", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "resourceName", + "name": "resourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetResourceProviderListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetResourceProviderListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + }, + "SearchResourceProviderKeyAsyncByResourceNameAndServiceNameAndFilterAndPage": { + "uniqueName": "SearchResourceProviderKeyAsyncByResourceNameAndServiceNameAndFilterAndPage", + "name": "SearchResourceProviderKeyAsync", + "httpMethod": "GET", + "url": "api/permission-management/permissions/search-resource-provider-keys", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "serviceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "filter", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "page", + "typeAsString": "System.Int32, System.Private.CoreLib", + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "resourceName", + "name": "resourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "serviceName", + "name": "serviceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "filter", + "name": "filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "page", + "name": "page", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.SearchProviderKeyListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.SearchProviderKeyListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + }, + "GetResourceDefinitionsAsyncByResourceName": { + "uniqueName": "GetResourceDefinitionsAsyncByResourceName", + "name": "GetResourceDefinitionsAsync", + "httpMethod": "GET", + "url": "api/permission-management/permissions/resource-definitions", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "resourceName", + "name": "resourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetResourcePermissionDefinitionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetResourcePermissionDefinitionListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + }, + "GetResourceAsyncByResourceNameAndResourceKey": { + "uniqueName": "GetResourceAsyncByResourceNameAndResourceKey", + "name": "GetResourceAsync", + "httpMethod": "GET", + "url": "api/permission-management/permissions/resource", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "resourceKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "resourceName", + "name": "resourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "resourceKey", + "name": "resourceKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetResourcePermissionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetResourcePermissionListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + }, + "GetResourceByProviderAsyncByResourceNameAndResourceKeyAndProviderNameAndProviderKey": { + "uniqueName": "GetResourceByProviderAsyncByResourceNameAndResourceKeyAndProviderNameAndProviderKey", + "name": "GetResourceByProviderAsync", + "httpMethod": "GET", + "url": "api/permission-management/permissions/resource/by-provider", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "resourceKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "resourceName", + "name": "resourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "resourceKey", + "name": "resourceKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "providerName", + "name": "providerName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetResourcePermissionWithProviderListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetResourcePermissionWithProviderListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + }, + "UpdateResourceAsyncByResourceNameAndResourceKeyAndInput": { + "uniqueName": "UpdateResourceAsyncByResourceNameAndResourceKeyAndInput", + "name": "UpdateResourceAsync", + "httpMethod": "PUT", + "url": "api/permission-management/permissions/resource", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "resourceKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.PermissionManagement.UpdateResourcePermissionsDto, Volo.Abp.PermissionManagement.Application.Contracts", + "type": "Volo.Abp.PermissionManagement.UpdateResourcePermissionsDto", + "typeSimple": "Volo.Abp.PermissionManagement.UpdateResourcePermissionsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "resourceName", + "name": "resourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "resourceKey", + "name": "resourceKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.PermissionManagement.UpdateResourcePermissionsDto", + "typeSimple": "Volo.Abp.PermissionManagement.UpdateResourcePermissionsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + }, + "DeleteResourceAsyncByResourceNameAndResourceKeyAndProviderNameAndProviderKey": { + "uniqueName": "DeleteResourceAsyncByResourceNameAndResourceKeyAndProviderNameAndProviderKey", + "name": "DeleteResourceAsync", + "httpMethod": "DELETE", + "url": "api/permission-management/permissions/resource", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "resourceKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "resourceName", + "name": "resourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "resourceKey", + "name": "resourceKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "providerName", + "name": "providerName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + } + } + } + } + }, + "settingManagement": { + "rootPath": "settingManagement", + "remoteServiceName": "SettingManagement", + "controllers": { + "Volo.Abp.SettingManagement.EmailSettingsController": { + "controllerName": "EmailSettings", + "controllerGroupName": "EmailSettings", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.SettingManagement.EmailSettingsController", + "interfaces": [ + { + "type": "Volo.Abp.SettingManagement.IEmailSettingsAppService", + "name": "IEmailSettingsAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.SettingManagement.EmailSettingsDto", + "typeSimple": "Volo.Abp.SettingManagement.EmailSettingsDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto, Volo.Abp.SettingManagement.Application.Contracts", + "type": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", + "typeSimple": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "SendTestEmailAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.SettingManagement.SendTestEmailInput, Volo.Abp.SettingManagement.Application.Contracts", + "type": "Volo.Abp.SettingManagement.SendTestEmailInput", + "typeSimple": "Volo.Abp.SettingManagement.SendTestEmailInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/setting-management/emailing", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.SettingManagement.EmailSettingsDto", + "typeSimple": "Volo.Abp.SettingManagement.EmailSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.SettingManagement.IEmailSettingsAppService" + }, + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "POST", + "url": "api/setting-management/emailing", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto, Volo.Abp.SettingManagement.Application.Contracts", + "type": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", + "typeSimple": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", + "typeSimple": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.SettingManagement.IEmailSettingsAppService" + }, + "SendTestEmailAsyncByInput": { + "uniqueName": "SendTestEmailAsyncByInput", + "name": "SendTestEmailAsync", + "httpMethod": "POST", + "url": "api/setting-management/emailing/send-test-email", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.SettingManagement.SendTestEmailInput, Volo.Abp.SettingManagement.Application.Contracts", + "type": "Volo.Abp.SettingManagement.SendTestEmailInput", + "typeSimple": "Volo.Abp.SettingManagement.SendTestEmailInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.SettingManagement.SendTestEmailInput", + "typeSimple": "Volo.Abp.SettingManagement.SendTestEmailInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.SettingManagement.IEmailSettingsAppService" + } + } + }, + "Volo.Abp.SettingManagement.TimeZoneSettingsController": { + "controllerName": "TimeZoneSettings", + "controllerGroupName": "TimeZoneSettings", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.SettingManagement.TimeZoneSettingsController", + "interfaces": [ + { + "type": "Volo.Abp.SettingManagement.ITimeZoneSettingsAppService", + "name": "ITimeZoneSettingsAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + } + }, + { + "name": "GetTimezonesAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.NameValue]" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "timezone", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/setting-management/timezone", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.SettingManagement.ITimeZoneSettingsAppService" + }, + "GetTimezonesAsync": { + "uniqueName": "GetTimezonesAsync", + "name": "GetTimezonesAsync", + "httpMethod": "GET", + "url": "api/setting-management/timezone/timezones", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.NameValue]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.SettingManagement.ITimeZoneSettingsAppService" + }, + "UpdateAsyncByTimezone": { + "uniqueName": "UpdateAsyncByTimezone", + "name": "UpdateAsync", + "httpMethod": "POST", + "url": "api/setting-management/timezone", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "timezone", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "timezone", + "name": "timezone", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.SettingManagement.ITimeZoneSettingsAppService" + } + } + } + } + } + }, + "types": { + "Volo.Abp.Account.ChangePasswordInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CurrentPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "NewPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Account.ProfileDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "IsExternal", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "HasPassword", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Account.RegisterDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "AppName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Account.ResetPasswordDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ResetToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Account.SendPasswordResetCodeDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "AppName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ReturnUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ReturnUrlHash", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Account.UpdateProfileDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 16, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Account.VerifyPasswordResetTokenInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ResetToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.AbpLoginResult": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Result", + "jsonName": null, + "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Success", + "InvalidUserNameOrPassword", + "NotAllowed", + "LockedOut", + "RequiresTwoFactor" + ], + "enumValues": [ + 1, + 2, + 3, + 4, + 5 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserNameOrEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 255, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 32, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "RememberMe", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "TPrimaryKey" + ], + "properties": [ + { + "name": "LastModificationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "LastModifierId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "TPrimaryKey" + ], + "properties": [ + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleEntityDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.Application.Dtos.ExtensibleEntityDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "TKey" + ], + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "TKey", + "typeSimple": "TKey", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "TPrimaryKey" + ], + "properties": [ + { + "name": "IsDeleted", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "DeleterId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "DeletionTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleLimitedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "MaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "2147483647", + "regex": null, + "isNullable": false } - } - } - }, - "types": { - "Volo.Abp.Account.RegisterDto": { - "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + ] + }, + "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedResultRequestDto", "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "UserName", + "name": "Sorting", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true - }, + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensiblePagedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleLimitedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "EmailAddress", + "name": "SkipCount", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": true - }, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "0", + "maximum": "2147483647", + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Application.Dtos.LimitedResultRequestDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "Password", + "name": "MaxResultCount", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": true - }, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "2147483647", + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Application.Dtos.ListResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "T" + ], + "properties": [ { - "name": "AppName", + "name": "Items", + "jsonName": null, + "type": "[T]", + "typeSimple": "[T]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Sorting", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.ObjectExtending.ExtensibleObject": { + "Volo.Abp.Application.Dtos.PagedResultDto": { + "baseType": "Volo.Abp.Application.Dtos.ListResultDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "T" + ], + "properties": [ + { + "name": "TotalCount", + "jsonName": null, + "type": "System.Int64", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Application.Dtos.PagedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.LimitedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SkipCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "0", + "maximum": "2147483647", + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "GrantedPolicies", + "jsonName": null, + "type": "{System.String:System.Boolean}", + "typeSimple": "{string:boolean}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto": { "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ + { + "name": "Localization", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Auth", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Setting", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "CurrentUser", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Features", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "GlobalFeatures", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationGlobalFeatureConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationGlobalFeatureConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "MultiTenancy", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "CurrentTenant", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Timing", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Clock", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ObjectExtensions", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, { "name": "ExtraProperties", "jsonName": null, "type": "{System.String:System.Object}", "typeSimple": "{string:object}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Identity.IdentityUserDto": { - "baseType": "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "TenantId", + "name": "IncludeLocalizationResources", "jsonName": null, - "type": "System.Guid?", - "typeSimple": "string?", - "isRequired": false - }, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "UserName", + "name": "Values", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, + "type": "{System.String:System.String}", + "typeSimple": "{string:string}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationGlobalFeatureConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "Name", + "name": "EnabledFeatures", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Values", + "jsonName": null, + "type": "{System.String:System.Collections.Generic.Dictionary}", + "typeSimple": "{string:System.Collections.Generic.Dictionary}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Surname", + "name": "Resources", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Email", + "name": "Languages", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[Volo.Abp.Localization.LanguageInfo]", + "typeSimple": "[Volo.Abp.Localization.LanguageInfo]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "EmailConfirmed", + "name": "CurrentCulture", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "PhoneNumber", + "name": "DefaultResourceName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "PhoneNumberConfirmed", + "name": "LanguagesMap", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "{System.String:[Volo.Abp.NameValue]}", + "typeSimple": "{string:[Volo.Abp.NameValue]}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "LockoutEnabled", + "name": "LanguageFilesMap", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false - }, + "type": "{System.String:[Volo.Abp.NameValue]}", + "typeSimple": "{string:[Volo.Abp.NameValue]}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "LockoutEnd", + "name": "Resources", "jsonName": null, - "type": "System.DateTimeOffset?", - "typeSimple": "string?", - "isRequired": false + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ConcurrencyStamp", + "name": "CurrentCulture", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto": { - "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, - "genericArguments": [ - "TPrimaryKey" - ], + "genericArguments": null, "properties": [ { - "name": "IsDeleted", - "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false - }, - { - "name": "DeleterId", + "name": "CultureName", "jsonName": null, - "type": "System.Guid?", - "typeSimple": "string?", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "DeletionTime", + "name": "OnlyDynamics", "jsonName": null, - "type": "System.DateTime?", - "typeSimple": "string?", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto": { - "baseType": "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, - "genericArguments": [ - "TPrimaryKey" - ], + "genericArguments": null, "properties": [ { - "name": "LastModificationTime", + "name": "Texts", "jsonName": null, - "type": "System.DateTime?", - "typeSimple": "string?", - "isRequired": false + "type": "{System.String:System.String}", + "typeSimple": "{string:string}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "LastModifierId", + "name": "BaseResources", "jsonName": null, - "type": "System.Guid?", - "typeSimple": "string?", - "isRequired": false + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto": { - "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, - "genericArguments": [ - "TPrimaryKey" - ], + "genericArguments": null, "properties": [ { - "name": "CreationTime", - "jsonName": null, - "type": "System.DateTime", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "CreatorId", + "name": "Values", "jsonName": null, - "type": "System.Guid?", - "typeSimple": "string?", - "isRequired": false + "type": "{System.String:System.String}", + "typeSimple": "{string:string}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Application.Dtos.ExtensibleEntityDto": { - "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, - "genericArguments": [ - "TKey" - ], + "genericArguments": null, "properties": [ { - "name": "Id", + "name": "Kind", "jsonName": null, - "type": "TKey", - "typeSimple": "TKey", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Account.SendPasswordResetCodeDto": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -2413,66 +5725,125 @@ "genericArguments": null, "properties": [ { - "name": "Email", + "name": "DisplayName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "AppName", + "name": "EnglishName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ReturnUrl", + "name": "ThreeLetterIsoLanguageName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ReturnUrlHash", + "name": "TwoLetterIsoLanguageName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - } - ] - }, - "Volo.Abp.Account.ResetPasswordDto": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, { - "name": "UserId", + "name": "IsRightToLeft", "jsonName": null, - "type": "System.Guid", + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ResetToken", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Password", + "name": "NativeName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "DateTimeFormat", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -2480,219 +5851,338 @@ "genericArguments": null, "properties": [ { - "name": "UserNameOrEmailAddress", + "name": "IsAuthenticated", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Id", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "ImpersonatorUserId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "ImpersonatorTenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "ImpersonatorUserName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "Password", + "name": "ImpersonatorTenantName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "RememberMe", + "name": "UserName", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false - } - ] - }, - "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.AbpLoginResult": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, { - "name": "Result", + "name": "Name", "jsonName": null, - "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType", - "typeSimple": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "Description", + "name": "SurName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - } - ] - }, - "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType": { - "baseType": "System.Enum", - "isEnum": true, - "enumNames": [ - "Success", - "InvalidUserNameOrPassword", - "NotAllowed", - "LockedOut", - "RequiresTwoFactor" - ], - "enumValues": [ - 1, - 2, - 3, - 4, - 5 - ], - "genericArguments": null, - "properties": null - }, - "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, { - "name": "Success", + "name": "Email", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "TenantId", + "name": "EmailVerified", "jsonName": null, - "type": "System.Guid?", - "typeSimple": "string?", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Name", + "name": "PhoneNumber", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "IsActive", + "name": "PhoneNumberVerified", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false - } - ] - }, - "Volo.Abp.Application.Dtos.ListResultDto": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": [ - "T" - ], - "properties": [ + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, { - "name": "Items", + "name": "Roles", "jsonName": null, - "type": "[T]", - "typeSimple": "[T]", - "isRequired": false + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "SessionId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.Identity.IdentityRoleDto": { - "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Name", + "name": "CalendarAlgorithmType", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "IsDefault", + "name": "DateTimeFormatLong", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "IsStatic", + "name": "ShortDatePattern", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "IsPublic", + "name": "FullDateTimePattern", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ConcurrencyStamp", + "name": "DateSeparator", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - } - ] - }, - "Volo.Abp.Identity.GetIdentityRolesInput": { - "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, { - "name": "Filter", + "name": "ShortTimePattern", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - } - ] - }, - "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto": { - "baseType": "Volo.Abp.Application.Dtos.PagedResultRequestDto", - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, { - "name": "Sorting", + "name": "LongTimePattern", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Application.Dtos.PagedResultRequestDto": { - "baseType": "Volo.Abp.Application.Dtos.LimitedResultRequestDto", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "SkipCount", + "name": "TimeZoneName", "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.Application.Dtos.LimitedResultRequestDto": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -2700,56 +6190,70 @@ "genericArguments": null, "properties": [ { - "name": "DefaultMaxResultCount", - "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isRequired": false - }, - { - "name": "MaxMaxResultCount", + "name": "Properties", "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isRequired": false + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "MaxResultCount", + "name": "Configuration", "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isRequired": false + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Application.Dtos.PagedResultDto": { - "baseType": "Volo.Abp.Application.Dtos.ListResultDto", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, - "genericArguments": [ - "T" - ], + "genericArguments": null, "properties": [ { - "name": "TotalCount", + "name": "Fields", "jsonName": null, - "type": "System.Int64", - "typeSimple": "number", - "isRequired": false + "type": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto]", + "typeSimple": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "LocalizationResource", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.Identity.IdentityRoleCreateDto": { - "baseType": "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase", - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [] - }, - "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase": { - "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, @@ -2760,154 +6264,144 @@ "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true - }, - { - "name": "IsDefault", - "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "IsPublic", + "name": "Value", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.Identity.IdentityRoleUpdateDto": { - "baseType": "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "ConcurrencyStamp", + "name": "IsAvailable", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Identity.GetIdentityUsersInput": { - "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Filter", + "name": "OnGet", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - } - ] - }, - "Volo.Abp.Identity.IdentityUserCreateDto": { - "baseType": "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase", - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, { - "name": "Password", + "name": "OnCreate", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": true + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "OnUpdate", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase": { - "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "UserName", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": true - }, - { - "name": "Name", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Surname", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Email", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": true - }, - { - "name": "PhoneNumber", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "LockoutEnabled", + "name": "IsAvailable", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false - }, - { - "name": "RoleNames", - "jsonName": null, - "type": "[System.String]", - "typeSimple": "[string]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Identity.IdentityUserUpdateDto": { - "baseType": "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Password", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "ConcurrencyStamp", + "name": "IsAvailable", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Identity.IdentityUserUpdateRolesDto": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -2915,15 +6409,34 @@ "genericArguments": null, "properties": [ { - "name": "RoleNames", + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Config", "jsonName": null, - "type": "[System.String]", - "typeSimple": "[string]", - "isRequired": true + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Users.UserData": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -2931,87 +6444,160 @@ "genericArguments": null, "properties": [ { - "name": "Id", + "name": "Type", "jsonName": null, - "type": "System.Guid", + "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "TenantId", + "name": "TypeSimple", "jsonName": null, - "type": "System.Guid?", - "typeSimple": "string?", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "UserName", + "name": "DisplayName", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "Name", + "name": "Api", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Surname", + "name": "Ui", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Email", + "name": "Policy", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyPolicyDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyPolicyDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "EmailConfirmed", + "name": "Attributes", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto]", + "typeSimple": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "PhoneNumber", + "name": "Configuration", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "PhoneNumberConfirmed", + "name": "DefaultValue", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.Identity.UserLookupSearchInputDto": { - "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyFeaturePolicyDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Filter", + "name": "Features", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "RequiresAll", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Identity.UserLookupCountInputDto": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyGlobalFeaturePolicyDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3019,131 +6605,274 @@ "genericArguments": null, "properties": [ { - "name": "Filter", + "name": "Features", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "RequiresAll", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Identity.ProfileDto": { - "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyPermissionPolicyDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "UserName", + "name": "PermissionNames", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Email", + "name": "RequiresAll", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyPolicyDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "Name", + "name": "GlobalFeatures", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyGlobalFeaturePolicyDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyGlobalFeaturePolicyDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Surname", + "name": "Features", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyFeaturePolicyDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyFeaturePolicyDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "PhoneNumber", + "name": "Permissions", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyPermissionPolicyDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyPermissionPolicyDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "OnTable", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "IsExternal", + "name": "OnCreateForm", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "HasPassword", + "name": "OnEditForm", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ConcurrencyStamp", + "name": "Lookup", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Identity.UpdateProfileDto": { - "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "UserName", + "name": "IsVisible", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "Email", + "name": "Url", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Name", + "name": "ResultListPropertyName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Surname", + "name": "DisplayPropertyName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "PhoneNumber", + "name": "ValuePropertyName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ConcurrencyStamp", + "name": "FilterParamName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Identity.ChangePasswordInput": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3151,22 +6880,21 @@ "genericArguments": null, "properties": [ { - "name": "CurrentPassword", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "NewPassword", + "name": "IsVisible", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": true + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.PermissionManagement.GetPermissionListResultDto": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3174,22 +6902,34 @@ "genericArguments": null, "properties": [ { - "name": "EntityDisplayName", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Groups", + "name": "Resource", "jsonName": null, - "type": "[Volo.Abp.PermissionManagement.PermissionGroupDto]", - "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGroupDto]", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.PermissionManagement.PermissionGroupDto": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3197,29 +6937,34 @@ "genericArguments": null, "properties": [ { - "name": "Name", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "DisplayName", + "name": "Entities", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Permissions", + "name": "Configuration", "jsonName": null, - "type": "[Volo.Abp.PermissionManagement.PermissionGrantInfoDto]", - "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGrantInfoDto]", - "isRequired": false + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.PermissionManagement.PermissionGrantInfoDto": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3227,50 +6972,34 @@ "genericArguments": null, "properties": [ { - "name": "Name", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "DisplayName", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "ParentName", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "IsGranted", - "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false - }, - { - "name": "AllowedProviders", + "name": "Modules", "jsonName": null, - "type": "[System.String]", - "typeSimple": "[string]", - "isRequired": false + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "GrantedProviders", + "name": "Enums", "jsonName": null, - "type": "[Volo.Abp.PermissionManagement.ProviderInfoDto]", - "typeSimple": "[Volo.Abp.PermissionManagement.ProviderInfoDto]", - "isRequired": false + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.PermissionManagement.ProviderInfoDto": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3278,22 +7007,34 @@ "genericArguments": null, "properties": [ { - "name": "ProviderName", + "name": "Iana", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ProviderKey", + "name": "Windows", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.PermissionManagement.UpdatePermissionsDto": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3301,38 +7042,91 @@ "genericArguments": null, "properties": [ { - "name": "Permissions", + "name": "TimeZone", "jsonName": null, - "type": "[Volo.Abp.PermissionManagement.UpdatePermissionDto]", - "typeSimple": "[Volo.Abp.PermissionManagement.UpdatePermissionDto]", - "isRequired": false + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.PermissionManagement.UpdatePermissionDto": { + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone": { "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ + { + "name": "TimeZoneId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, { "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "IsGranted", + "name": "IsAvailable", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.SettingManagement.EmailSettingsDto": { + "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3340,71 +7134,95 @@ "genericArguments": null, "properties": [ { - "name": "SmtpHost", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "SmtpPort", + "name": "Success", "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "SmtpUserName", + "name": "TenantId", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "SmtpPassword", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "SmtpDomain", + "name": "NormalizedName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "SmtpEnableSsl", + "name": "IsActive", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false - }, + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "SmtpUseDefaultCredentials", + "name": "IsEnabled", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false - }, - { - "name": "DefaultFromAddress", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "DefaultFromDisplayName", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.SettingManagement.UpdateEmailSettingsDto": { + "Volo.Abp.FeatureManagement.FeatureDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3412,72 +7230,161 @@ "genericArguments": null, "properties": [ { - "name": "SmtpHost", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "SmtpPort", + "name": "DisplayName", "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "SmtpUserName", + "name": "Value", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "SmtpPassword", + "name": "Provider", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "Volo.Abp.FeatureManagement.FeatureProviderDto", + "typeSimple": "Volo.Abp.FeatureManagement.FeatureProviderDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "SmtpDomain", + "name": "Description", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "SmtpEnableSsl", + "name": "ValueType", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "Volo.Abp.Validation.StringValues.IStringValueType", + "typeSimple": "Volo.Abp.Validation.StringValues.IStringValueType", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "SmtpUseDefaultCredentials", + "name": "Depth", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "DefaultFromAddress", + "name": "ParentName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.FeatureManagement.FeatureGroupDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "DefaultFromDisplayName", + "name": "DisplayName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Features", + "jsonName": null, + "type": "[Volo.Abp.FeatureManagement.FeatureDto]", + "typeSimple": "[Volo.Abp.FeatureManagement.FeatureDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.TenantManagement.TenantDto": { - "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "Volo.Abp.FeatureManagement.FeatureProviderDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, @@ -3488,89 +7395,248 @@ "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ConcurrencyStamp", + "name": "Key", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.TenantManagement.GetTenantsInput": { - "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "Volo.Abp.FeatureManagement.GetFeatureListResultDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Filter", + "name": "Groups", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[Volo.Abp.FeatureManagement.FeatureGroupDto]", + "typeSimple": "[Volo.Abp.FeatureManagement.FeatureGroupDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.TenantManagement.TenantCreateDto": { - "baseType": "Volo.Abp.TenantManagement.TenantCreateOrUpdateDtoBase", + "Volo.Abp.FeatureManagement.UpdateFeatureDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "AdminEmailAddress", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "AdminPassword", + "name": "Value", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.TenantManagement.TenantCreateOrUpdateDtoBase": { - "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "Volo.Abp.FeatureManagement.UpdateFeaturesDto": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Name", + "name": "Features", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": true + "type": "[Volo.Abp.FeatureManagement.UpdateFeatureDto]", + "typeSimple": "[Volo.Abp.FeatureManagement.UpdateFeatureDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.TenantManagement.TenantUpdateDto": { - "baseType": "Volo.Abp.TenantManagement.TenantCreateOrUpdateDtoBase", + "Volo.Abp.Http.Modeling.ActionApiDescriptionModel": { + "baseType": null, "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "ConcurrencyStamp", + "name": "UniqueName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "HttpMethod", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "SupportedVersions", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "ParametersOnMethod", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Parameters", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.ParameterApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.ParameterApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ReturnValue", + "jsonName": null, + "type": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", + "typeSimple": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "AllowAnonymous", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "ImplementFrom", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.FeatureManagement.GetFeatureListResultDto": { + "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3578,15 +7644,34 @@ "genericArguments": null, "properties": [ { - "name": "Groups", + "name": "Modules", "jsonName": null, - "type": "[Volo.Abp.FeatureManagement.FeatureGroupDto]", - "typeSimple": "[Volo.Abp.FeatureManagement.FeatureGroupDto]", - "isRequired": false + "type": "{System.String:Volo.Abp.Http.Modeling.ModuleApiDescriptionModel}", + "typeSimple": "{string:Volo.Abp.Http.Modeling.ModuleApiDescriptionModel}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Types", + "jsonName": null, + "type": "{System.String:Volo.Abp.Http.Modeling.TypeApiDescriptionModel}", + "typeSimple": "{string:Volo.Abp.Http.Modeling.TypeApiDescriptionModel}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.FeatureManagement.FeatureGroupDto": { + "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3594,29 +7679,21 @@ "genericArguments": null, "properties": [ { - "name": "Name", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "DisplayName", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Features", + "name": "IncludeTypes", "jsonName": null, - "type": "[Volo.Abp.FeatureManagement.FeatureDto]", - "typeSimple": "[Volo.Abp.FeatureManagement.FeatureDto]", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.FeatureManagement.FeatureDto": { + "Volo.Abp.Http.Modeling.ControllerApiDescriptionModel": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3624,64 +7701,112 @@ "genericArguments": null, "properties": [ { - "name": "Name", + "name": "ControllerName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "DisplayName", + "name": "ControllerGroupName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "Value", + "name": "IsRemoteService", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Provider", + "name": "IsIntegrationService", "jsonName": null, - "type": "Volo.Abp.FeatureManagement.FeatureProviderDto", - "typeSimple": "Volo.Abp.FeatureManagement.FeatureProviderDto", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Description", + "name": "ApiVersion", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "ValueType", + "name": "Type", "jsonName": null, - "type": "Volo.Abp.Validation.StringValues.IStringValueType", - "typeSimple": "Volo.Abp.Validation.StringValues.IStringValueType", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Depth", + "name": "Interfaces", "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isRequired": false + "type": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ParentName", + "name": "Actions", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "{System.String:Volo.Abp.Http.Modeling.ActionApiDescriptionModel}", + "typeSimple": "{string:Volo.Abp.Http.Modeling.ActionApiDescriptionModel}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.FeatureManagement.FeatureProviderDto": { + "Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3689,22 +7814,47 @@ "genericArguments": null, "properties": [ { - "name": "Name", + "name": "Type", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Key", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Methods", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.InterfaceMethodApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.InterfaceMethodApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Validation.StringValues.IStringValueType": { + "Volo.Abp.Http.Modeling.InterfaceMethodApiDescriptionModel": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3716,32 +7866,43 @@ "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - }, - { - "name": "Item", - "jsonName": null, - "type": "System.Object", - "typeSimple": "object", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Properties", + "name": "ParametersOnMethod", "jsonName": null, - "type": "{System.String:System.Object}", - "typeSimple": "{string:object}", - "isRequired": false + "type": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Validator", + "name": "ReturnValue", "jsonName": null, - "type": "Volo.Abp.Validation.StringValues.IValueValidator", - "typeSimple": "Volo.Abp.Validation.StringValues.IValueValidator", - "isRequired": false + "type": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", + "typeSimple": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Validation.StringValues.IValueValidator": { + "Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3753,64 +7914,82 @@ "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Item", + "name": "TypeAsString", "jsonName": null, - "type": "System.Object", - "typeSimple": "object", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Properties", - "jsonName": null, - "type": "{System.String:System.Object}", - "typeSimple": "{string:object}", - "isRequired": false - } - ] - }, - "Volo.Abp.FeatureManagement.UpdateFeaturesDto": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ - { - "name": "Features", - "jsonName": null, - "type": "[Volo.Abp.FeatureManagement.UpdateFeatureDto]", - "typeSimple": "[Volo.Abp.FeatureManagement.UpdateFeatureDto]", - "isRequired": false - } - ] - }, - "Volo.Abp.FeatureManagement.UpdateFeatureDto": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ - { - "name": "Name", + "name": "Type", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Value", + "name": "TypeSimple", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "IsOptional", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "DefaultValue", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto": { + "Volo.Abp.Http.Modeling.ModuleApiDescriptionModel": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3818,78 +7997,47 @@ "genericArguments": null, "properties": [ { - "name": "Localization", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto", - "isRequired": false - }, - { - "name": "Auth", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto", - "isRequired": false - }, - { - "name": "Setting", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto", - "isRequired": false - }, - { - "name": "CurrentUser", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto", - "isRequired": false - }, - { - "name": "Features", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto", - "isRequired": false - }, - { - "name": "MultiTenancy", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto", - "isRequired": false - }, - { - "name": "CurrentTenant", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto", - "isRequired": false - }, - { - "name": "Timing", + "name": "RootPath", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Clock", + "name": "RemoteServiceName", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ObjectExtensions", + "name": "Controllers", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto", - "isRequired": false + "type": "{System.String:Volo.Abp.Http.Modeling.ControllerApiDescriptionModel}", + "typeSimple": "{string:Volo.Abp.Http.Modeling.ControllerApiDescriptionModel}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto": { + "Volo.Abp.Http.Modeling.ParameterApiDescriptionModel": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3897,87 +8045,138 @@ "genericArguments": null, "properties": [ { - "name": "Values", + "name": "NameOnMethod", "jsonName": null, - "type": "{System.String:System.Collections.Generic.Dictionary}", - "typeSimple": "{string:System.Collections.Generic.Dictionary}", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Languages", + "name": "Name", "jsonName": null, - "type": "[Volo.Abp.Localization.LanguageInfo]", - "typeSimple": "[Volo.Abp.Localization.LanguageInfo]", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "CurrentCulture", + "name": "JsonName", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "DefaultResourceName", + "name": "Type", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "LanguagesMap", + "name": "TypeSimple", "jsonName": null, - "type": "{System.String:[Volo.Abp.NameValue]}", - "typeSimple": "{string:[Volo.Abp.NameValue]}", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "LanguageFilesMap", + "name": "IsOptional", "jsonName": null, - "type": "{System.String:[Volo.Abp.NameValue]}", - "typeSimple": "{string:[Volo.Abp.NameValue]}", - "isRequired": false - } - ] - }, - "Volo.Abp.Localization.LanguageInfo": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, { - "name": "CultureName", + "name": "DefaultValue", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "UiCultureName", + "name": "ConstraintTypes", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "DisplayName", + "name": "BindingSourceId", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "FlagIcon", + "name": "DescriptorName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto": { + "Volo.Abp.Http.Modeling.PropertyApiDescriptionModel": { "baseType": null, "isEnum": false, "enumNames": null, @@ -3985,71 +8184,151 @@ "genericArguments": null, "properties": [ { - "name": "DisplayName", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "EnglishName", + "name": "JsonName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "ThreeLetterIsoLanguageName", + "name": "Type", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "TwoLetterIsoLanguageName", + "name": "TypeSimple", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "IsRightToLeft", + "name": "IsRequired", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "CultureName", + "name": "MinLength", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "MaxLength", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "Minimum", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "Name", + "name": "Maximum", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "NativeName", + "name": "Regex", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "DateTimeFormat", + "name": "IsNullable", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto": { + "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4057,330 +8336,704 @@ "genericArguments": null, "properties": [ { - "name": "CalendarAlgorithmType", + "name": "Type", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "DateTimeFormatLong", + "name": "TypeSimple", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - }, + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Http.Modeling.TypeApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "ShortDatePattern", + "name": "BaseType", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "FullDateTimePattern", + "name": "IsEnum", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "DateSeparator", + "name": "EnumNames", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "ShortTimePattern", + "name": "EnumValues", + "jsonName": null, + "type": "[System.Object]", + "typeSimple": "[object]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "GenericArguments", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + }, + { + "name": "Properties", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.PropertyApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.PropertyApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true + } + ] + }, + "Volo.Abp.Identity.GetIdentityRolesInput": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - }, + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Identity.GetIdentityUsersInput": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "LongTimePattern", + "name": "Filter", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.NameValue": { - "baseType": "Volo.Abp.NameValue", + "Volo.Abp.Identity.IdentityRoleCreateDto": { + "baseType": "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase", "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [] }, - "Volo.Abp.NameValue": { - "baseType": null, + "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", "isEnum": false, "enumNames": null, "enumValues": null, - "genericArguments": [ - "T" - ], + "genericArguments": null, "properties": [ { "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Value", + "name": "IsDefault", "jsonName": null, - "type": "T", - "typeSimple": "T", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "IsPublic", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto": { - "baseType": null, + "Volo.Abp.Identity.IdentityRoleDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Policies", + "name": "Name", "jsonName": null, - "type": "{System.String:System.Boolean}", - "typeSimple": "{string:boolean}", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "GrantedPolicies", + "name": "IsDefault", "jsonName": null, - "type": "{System.String:System.Boolean}", - "typeSimple": "{string:boolean}", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "IsStatic", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "IsPublic", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto": { - "baseType": null, + "Volo.Abp.Identity.IdentityRoleUpdateDto": { + "baseType": "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase", "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Values", + "name": "ConcurrencyStamp", "jsonName": null, - "type": "{System.String:System.String}", - "typeSimple": "{string:string}", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto": { - "baseType": null, + "Volo.Abp.Identity.IdentityUserCreateDto": { + "baseType": "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase", "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "IsAuthenticated", + "name": "Password", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Id", + "name": "Name", "jsonName": null, - "type": "System.Guid?", - "typeSimple": "string?", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "TenantId", + "name": "Surname", "jsonName": null, - "type": "System.Guid?", - "typeSimple": "string?", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ImpersonatorUserId", + "name": "Email", "jsonName": null, - "type": "System.Guid?", - "typeSimple": "string?", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 16, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "LockoutEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ImpersonatorTenantId", + "name": "RoleNames", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.Identity.IdentityUserDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TenantId", "jsonName": null, "type": "System.Guid?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { "name": "UserName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "SurName", + "name": "Surname", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { "name": "Email", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "EmailVerified", + "name": "EmailConfirmed", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { "name": "PhoneNumber", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "PhoneNumberVerified", + "name": "PhoneNumberConfirmed", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Roles", - "jsonName": null, - "type": "[System.String]", - "typeSimple": "[string]", - "isRequired": false - } - ] - }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ - { - "name": "Values", + "name": "IsActive", "jsonName": null, - "type": "{System.String:System.String}", - "typeSimple": "{string:string}", - "isRequired": false - } - ] - }, - "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, { - "name": "IsEnabled", + "name": "LockoutEnabled", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false - } - ] - }, - "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, { - "name": "Id", + "name": "AccessFailedCount", "jsonName": null, - "type": "System.Guid?", + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "LockoutEnd", + "jsonName": null, + "type": "System.DateTimeOffset?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "Name", + "name": "ConcurrencyStamp", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "IsAvailable", + "name": "EntityVersion", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false - } - ] - }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, { - "name": "TimeZone", + "name": "LastPasswordChangeTime", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone", - "isRequired": false + "type": "System.DateTimeOffset?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone": { - "baseType": null, + "Volo.Abp.Identity.IdentityUserUpdateDto": { + "baseType": "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase", "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Iana", + "name": "Password", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Windows", + "name": "ConcurrencyStamp", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone": { + "Volo.Abp.Identity.IdentityUserUpdateRolesDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4388,15 +9041,21 @@ "genericArguments": null, "properties": [ { - "name": "TimeZoneName", + "name": "RoleNames", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone": { + "Volo.Abp.Identity.UserLookupCountInputDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4404,31 +9063,43 @@ "genericArguments": null, "properties": [ { - "name": "TimeZoneId", + "name": "Filter", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto": { - "baseType": null, + "Volo.Abp.Identity.UserLookupSearchInputDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto", "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Kind", + "name": "Filter", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto": { + "Volo.Abp.Localization.LanguageInfo": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4436,45 +9107,105 @@ "genericArguments": null, "properties": [ { - "name": "Modules", + "name": "CultureName", "jsonName": null, - "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto}", - "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto}", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Enums", + "name": "UiCultureName", "jsonName": null, - "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto}", - "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto}", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "TwoLetterISOLanguageName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto": { - "baseType": null, + "Volo.Abp.NameValue": { + "baseType": "Volo.Abp.NameValue", "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, + "properties": [] + }, + "Volo.Abp.NameValue": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "T" + ], "properties": [ { - "name": "Entities", + "name": "Name", "jsonName": null, - "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto}", - "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto}", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Configuration", + "name": "Value", "jsonName": null, - "type": "{System.String:System.Object}", - "typeSimple": "{string:object}", - "isRequired": false + "type": "T", + "typeSimple": "T", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto": { + "Volo.Abp.ObjectExtending.ExtensibleObject": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4482,22 +9213,21 @@ "genericArguments": null, "properties": [ { - "name": "Properties", - "jsonName": null, - "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto}", - "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto}", - "isRequired": false - }, - { - "name": "Configuration", + "name": "ExtraProperties", "jsonName": null, "type": "{System.String:System.Object}", "typeSimple": "{string:object}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto": { + "Volo.Abp.PermissionManagement.GetPermissionListResultDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4505,64 +9235,34 @@ "genericArguments": null, "properties": [ { - "name": "Type", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "TypeSimple", + "name": "EntityDisplayName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - }, - { - "name": "DisplayName", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto", - "isRequired": false - }, - { - "name": "Api", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto", - "isRequired": false - }, - { - "name": "Ui", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto", - "isRequired": false - }, - { - "name": "Attributes", - "jsonName": null, - "type": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto]", - "typeSimple": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto]", - "isRequired": false - }, - { - "name": "Configuration", - "jsonName": null, - "type": "{System.String:System.Object}", - "typeSimple": "{string:object}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "DefaultValue", + "name": "Groups", "jsonName": null, - "type": "System.Object", - "typeSimple": "object", - "isRequired": false + "type": "[Volo.Abp.PermissionManagement.PermissionGroupDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGroupDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto": { + "Volo.Abp.PermissionManagement.GetResourcePermissionDefinitionListResultDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4570,22 +9270,21 @@ "genericArguments": null, "properties": [ { - "name": "Name", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Resource", + "name": "Permissions", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[Volo.Abp.PermissionManagement.ResourcePermissionDefinitionDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.ResourcePermissionDefinitionDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto": { + "Volo.Abp.PermissionManagement.GetResourcePermissionListResultDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4593,29 +9292,21 @@ "genericArguments": null, "properties": [ { - "name": "OnGet", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto", - "isRequired": false - }, - { - "name": "OnCreate", - "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto", - "isRequired": false - }, - { - "name": "OnUpdate", + "name": "Permissions", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto", - "isRequired": false + "type": "[Volo.Abp.PermissionManagement.ResourcePermissionGrantInfoDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.ResourcePermissionGrantInfoDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto": { + "Volo.Abp.PermissionManagement.GetResourcePermissionWithProviderListResultDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4623,15 +9314,21 @@ "genericArguments": null, "properties": [ { - "name": "IsAvailable", + "name": "Permissions", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "[Volo.Abp.PermissionManagement.ResourcePermissionWithProdiverGrantInfoDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.ResourcePermissionWithProdiverGrantInfoDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto": { + "Volo.Abp.PermissionManagement.GetResourceProviderListResultDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4639,15 +9336,56 @@ "genericArguments": null, "properties": [ { - "name": "IsAvailable", + "name": "Providers", + "jsonName": null, + "type": "[Volo.Abp.PermissionManagement.ResourceProviderDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.ResourceProviderDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.PermissionManagement.GrantedResourcePermissionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto": { + "Volo.Abp.PermissionManagement.PermissionGrantInfoDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4655,15 +9393,86 @@ "genericArguments": null, "properties": [ { - "name": "IsAvailable", + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ParentName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "IsGranted", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "AllowedProviders", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "GrantedProviders", + "jsonName": null, + "type": "[Volo.Abp.PermissionManagement.ProviderInfoDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.ProviderInfoDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto": { + "Volo.Abp.PermissionManagement.PermissionGroupDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4671,36 +9480,73 @@ "genericArguments": null, "properties": [ { - "name": "OnTable", + "name": "Name", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "OnCreateForm", + "name": "DisplayName", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "OnEditForm", + "name": "DisplayNameKey", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Lookup", + "name": "DisplayNameResource", "jsonName": null, - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Permissions", + "jsonName": null, + "type": "[Volo.Abp.PermissionManagement.PermissionGrantInfoDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGrantInfoDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto": { + "Volo.Abp.PermissionManagement.ProviderInfoDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4708,15 +9554,34 @@ "genericArguments": null, "properties": [ { - "name": "IsVisible", + "name": "ProviderName", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "ProviderKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto": { + "Volo.Abp.PermissionManagement.ResourcePermissionDefinitionDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4724,15 +9589,34 @@ "genericArguments": null, "properties": [ { - "name": "IsVisible", + "name": "Name", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto": { + "Volo.Abp.PermissionManagement.ResourcePermissionGrantInfoDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4740,43 +9624,73 @@ "genericArguments": null, "properties": [ { - "name": "Url", + "name": "ProviderName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ResultListPropertyName", + "name": "ProviderKey", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "DisplayPropertyName", + "name": "ProviderDisplayName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ValuePropertyName", + "name": "ProviderNameDisplayName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "FilterParamName", + "name": "Permissions", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "[Volo.Abp.PermissionManagement.GrantedResourcePermissionDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.GrantedResourcePermissionDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto": { + "Volo.Abp.PermissionManagement.ResourcePermissionWithProdiverGrantInfoDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4784,22 +9698,60 @@ "genericArguments": null, "properties": [ { - "name": "TypeSimple", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Config", + "name": "DisplayName", "jsonName": null, - "type": "{System.String:System.Object}", - "typeSimple": "{string:object}", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Providers", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "IsGranted", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto": { + "Volo.Abp.PermissionManagement.ResourceProviderDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4807,22 +9759,34 @@ "genericArguments": null, "properties": [ { - "name": "Fields", + "name": "Name", "jsonName": null, - "type": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto]", - "typeSimple": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto]", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "LocalizationResource", + "name": "DisplayName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto": { + "Volo.Abp.PermissionManagement.SearchProviderKeyInfo": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4830,22 +9794,34 @@ "genericArguments": null, "properties": [ { - "name": "Name", + "name": "ProviderKey", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Value", + "name": "ProviderDisplayName", "jsonName": null, - "type": "System.Object", - "typeSimple": "object", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto": { + "Volo.Abp.PermissionManagement.SearchProviderKeyListResultDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4853,15 +9829,21 @@ "genericArguments": null, "properties": [ { - "name": "IncludeTypes", - "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "name": "Keys", + "jsonName": null, + "type": "[Volo.Abp.PermissionManagement.SearchProviderKeyInfo]", + "typeSimple": "[Volo.Abp.PermissionManagement.SearchProviderKeyInfo]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel": { + "Volo.Abp.PermissionManagement.UpdatePermissionDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4869,22 +9851,34 @@ "genericArguments": null, "properties": [ { - "name": "Modules", + "name": "Name", "jsonName": null, - "type": "{System.String:Volo.Abp.Http.Modeling.ModuleApiDescriptionModel}", - "typeSimple": "{string:Volo.Abp.Http.Modeling.ModuleApiDescriptionModel}", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Types", + "name": "IsGranted", "jsonName": null, - "type": "{System.String:Volo.Abp.Http.Modeling.TypeApiDescriptionModel}", - "typeSimple": "{string:Volo.Abp.Http.Modeling.TypeApiDescriptionModel}", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Http.Modeling.ModuleApiDescriptionModel": { + "Volo.Abp.PermissionManagement.UpdatePermissionsDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4892,29 +9886,69 @@ "genericArguments": null, "properties": [ { - "name": "RootPath", + "name": "Permissions", + "jsonName": null, + "type": "[Volo.Abp.PermissionManagement.UpdatePermissionDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.UpdatePermissionDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.PermissionManagement.UpdateResourcePermissionsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ProviderName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "RemoteServiceName", + "name": "ProviderKey", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Controllers", + "name": "Permissions", "jsonName": null, - "type": "{System.String:Volo.Abp.Http.Modeling.ControllerApiDescriptionModel}", - "typeSimple": "{string:Volo.Abp.Http.Modeling.ControllerApiDescriptionModel}", - "isRequired": false + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Http.Modeling.ControllerApiDescriptionModel": { + "Volo.Abp.SettingManagement.EmailSettingsDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4922,43 +9956,125 @@ "genericArguments": null, "properties": [ { - "name": "ControllerName", + "name": "SmtpHost", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ControllerGroupName", + "name": "SmtpPort", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "SmtpUserName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Type", + "name": "SmtpPassword", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Interfaces", + "name": "SmtpDomain", "jsonName": null, - "type": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]", - "typeSimple": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Actions", + "name": "SmtpEnableSsl", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "SmtpUseDefaultCredentials", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "DefaultFromAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "DefaultFromDisplayName", "jsonName": null, - "type": "{System.String:Volo.Abp.Http.Modeling.ActionApiDescriptionModel}", - "typeSimple": "{string:Volo.Abp.Http.Modeling.ActionApiDescriptionModel}", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel": { + "Volo.Abp.SettingManagement.SendTestEmailInput": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4966,15 +10082,60 @@ "genericArguments": null, "properties": [ { - "name": "Type", + "name": "SenderEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "TargetEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Subject", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + }, + { + "name": "Body", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Http.Modeling.ActionApiDescriptionModel": { + "Volo.Abp.SettingManagement.UpdateEmailSettingsDto": { "baseType": null, "isEnum": false, "enumNames": null, @@ -4982,129 +10143,261 @@ "genericArguments": null, "properties": [ { - "name": "UniqueName", + "name": "SmtpHost", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Name", + "name": "SmtpPort", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "65535", + "regex": null, + "isNullable": false }, { - "name": "HttpMethod", + "name": "SmtpUserName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Url", + "name": "SmtpPassword", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "SupportedVersions", + "name": "SmtpDomain", "jsonName": null, - "type": "[System.String]", - "typeSimple": "[string]", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ParametersOnMethod", + "name": "SmtpEnableSsl", "jsonName": null, - "type": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", - "typeSimple": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Parameters", + "name": "SmtpUseDefaultCredentials", "jsonName": null, - "type": "[Volo.Abp.Http.Modeling.ParameterApiDescriptionModel]", - "typeSimple": "[Volo.Abp.Http.Modeling.ParameterApiDescriptionModel]", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ReturnValue", + "name": "DefaultFromAddress", "jsonName": null, - "type": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", - "typeSimple": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "AllowAnonymous", + "name": "DefaultFromDisplayName", "jsonName": null, - "type": "System.Boolean?", - "typeSimple": "boolean?", - "isRequired": false - }, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.TenantManagement.GetTenantsInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "ImplementFrom", + "name": "Filter", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel": { - "baseType": null, + "Volo.Abp.TenantManagement.TenantCreateDto": { + "baseType": "Volo.Abp.TenantManagement.TenantCreateOrUpdateDtoBase", "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ { - "name": "Name", + "name": "AdminEmailAddress", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "TypeAsString", + "name": "AdminPassword", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - }, + "isRequired": true, + "minLength": null, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.TenantManagement.TenantCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "Type", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - }, + "isRequired": true, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.TenantManagement.TenantDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "TypeSimple", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "IsOptional", + "name": "ConcurrencyStamp", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false - }, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false + } + ] + }, + "Volo.Abp.TenantManagement.TenantUpdateDto": { + "baseType": "Volo.Abp.TenantManagement.TenantCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ { - "name": "DefaultValue", + "name": "ConcurrencyStamp", "jsonName": null, - "type": "System.Object", - "typeSimple": "object", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Http.Modeling.ParameterApiDescriptionModel": { + "Volo.Abp.Users.UserData": { "baseType": null, "isEnum": false, "enumNames": null, @@ -5112,101 +10405,151 @@ "genericArguments": null, "properties": [ { - "name": "NameOnMethod", + "name": "Id", "jsonName": null, - "type": "System.String", + "type": "System.Guid", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Name", + "name": "TenantId", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "JsonName", + "name": "UserName", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Type", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "TypeSimple", + "name": "Surname", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "IsOptional", + "name": "IsActive", "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "DefaultValue", + "name": "Email", "jsonName": null, - "type": "System.Object", - "typeSimple": "object", - "isRequired": false + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "ConstraintTypes", + "name": "EmailConfirmed", "jsonName": null, - "type": "[System.String]", - "typeSimple": "[string]", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "BindingSourceId", + "name": "PhoneNumber", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "DescriptorName", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - } - ] - }, - "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ - { - "name": "Type", + "name": "PhoneNumberConfirmed", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "TypeSimple", + "name": "ExtraProperties", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Http.Modeling.TypeApiDescriptionModel": { + "Volo.Abp.Validation.StringValues.IStringValueType": { "baseType": null, "isEnum": false, "enumNames": null, @@ -5214,50 +10557,60 @@ "genericArguments": null, "properties": [ { - "name": "BaseType", + "name": "Name", "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - }, - { - "name": "IsEnum", - "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false - }, - { - "name": "EnumNames", - "jsonName": null, - "type": "[System.String]", - "typeSimple": "[string]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "EnumValues", + "name": "Item", "jsonName": null, - "type": "[System.Object]", - "typeSimple": "[object]", - "isRequired": false + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "GenericArguments", + "name": "Properties", "jsonName": null, - "type": "[System.String]", - "typeSimple": "[string]", - "isRequired": false + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "Properties", + "name": "Validator", "jsonName": null, - "type": "[Volo.Abp.Http.Modeling.PropertyApiDescriptionModel]", - "typeSimple": "[Volo.Abp.Http.Modeling.PropertyApiDescriptionModel]", - "isRequired": false + "type": "Volo.Abp.Validation.StringValues.IValueValidator", + "typeSimple": "Volo.Abp.Validation.StringValues.IValueValidator", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] }, - "Volo.Abp.Http.Modeling.PropertyApiDescriptionModel": { + "Volo.Abp.Validation.StringValues.IValueValidator": { "baseType": null, "isEnum": false, "enumNames": null, @@ -5269,35 +10622,39 @@ "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - }, - { - "name": "JsonName", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Type", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false }, { - "name": "TypeSimple", + "name": "Item", "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isRequired": false + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": true }, { - "name": "IsRequired", + "name": "Properties", "jsonName": null, - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null, + "isNullable": false } ] } diff --git a/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/models.ts b/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/models.ts index cbba2214ec..49e67f7614 100644 --- a/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/models.ts +++ b/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/models.ts @@ -4,6 +4,27 @@ export interface GetPermissionListResultDto { groups: PermissionGroupDto[]; } +export interface GetResourcePermissionDefinitionListResultDto { + permissions?: ResourcePermissionDefinitionDto[]; +} + +export interface GetResourcePermissionListResultDto { + permissions?: ResourcePermissionGrantInfoDto[]; +} + +export interface GetResourcePermissionWithProviderListResultDto { + permissions?: ResourcePermissionWithProdiverGrantInfoDto[]; +} + +export interface GetResourceProviderListResultDto { + providers?: ResourceProviderDto[]; +} + +export interface GrantedResourcePermissionDto { + name?: string; + displayName?: string; +} + export interface PermissionGrantInfoDto { name?: string; displayName?: string; @@ -17,6 +38,8 @@ export interface PermissionGroupDto { name?: string; displayName?: string; permissions: PermissionGrantInfoDto[]; + displayNameKey?: string; + displayNameResource?: string; } export interface ProviderInfoDto { @@ -24,6 +47,40 @@ export interface ProviderInfoDto { providerKey?: string; } +export interface ResourcePermissionDefinitionDto { + name?: string; + displayName?: string; +} + +export interface ResourcePermissionGrantInfoDto { + providerName?: string; + providerKey?: string; + providerDisplayName?: string; + providerNameDisplayName?: string; + permissions?: GrantedResourcePermissionDto[]; +} + +export interface ResourcePermissionWithProdiverGrantInfoDto { + name?: string; + displayName?: string; + providers?: string[]; + isGranted?: boolean; +} + +export interface ResourceProviderDto { + name?: string; + displayName?: string; +} + +export interface SearchProviderKeyInfo { + providerKey?: string; + providerDisplayName?: string; +} + +export interface SearchProviderKeyListResultDto { + keys?: SearchProviderKeyInfo[]; +} + export interface UpdatePermissionDto { name?: string; isGranted: boolean; @@ -32,3 +89,9 @@ export interface UpdatePermissionDto { export interface UpdatePermissionsDto { permissions: UpdatePermissionDto[]; } + +export interface UpdateResourcePermissionsDto { + providerName?: string; + providerKey?: string; + permissions?: string[]; +} diff --git a/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/permissions.service.ts b/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/permissions.service.ts index dbd13ca778..8f28edf3fb 100644 --- a/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/permissions.service.ts +++ b/npm/ng-packs/packages/permission-management/proxy/src/lib/proxy/permissions.service.ts @@ -1,5 +1,5 @@ -import type { GetPermissionListResultDto, UpdatePermissionsDto } from './models'; -import { RestService } from '@abp/ng.core'; +import type { GetPermissionListResultDto, GetResourcePermissionDefinitionListResultDto, GetResourcePermissionListResultDto, GetResourcePermissionWithProviderListResultDto, GetResourceProviderListResultDto, SearchProviderKeyListResultDto, UpdatePermissionsDto, UpdateResourcePermissionsDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; import { Injectable, inject } from '@angular/core'; @Injectable({ @@ -7,23 +7,97 @@ import { Injectable, inject } from '@angular/core'; }) export class PermissionsService { private restService = inject(RestService); - apiName = 'AbpPermissionManagement'; - get = (providerName: string, providerKey: string) => + + deleteResource = (resourceName: string, resourceKey: string, providerName: string, providerKey: string, config?: Partial) => + this.restService.request({ + method: 'DELETE', + url: '/api/permission-management/permissions/resource', + params: { resourceName, resourceKey, providerName, providerKey }, + }, + { apiName: this.apiName, ...config }); + + + get = (providerName: string, providerKey: string, config?: Partial) => this.restService.request({ method: 'GET', url: '/api/permission-management/permissions', params: { providerName, providerKey }, }, - { apiName: this.apiName }); + { apiName: this.apiName, ...config }); + + + getByGroup = (groupName: string, providerName: string, providerKey: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/permission-management/permissions/by-group', + params: { groupName, providerName, providerKey }, + }, + { apiName: this.apiName, ...config }); + + + getResource = (resourceName: string, resourceKey: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/permission-management/permissions/resource', + params: { resourceName, resourceKey }, + }, + { apiName: this.apiName, ...config }); + + + getResourceByProvider = (resourceName: string, resourceKey: string, providerName: string, providerKey: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/permission-management/permissions/resource/by-provider', + params: { resourceName, resourceKey, providerName, providerKey }, + }, + { apiName: this.apiName, ...config }); - update = (providerName: string, providerKey: string, input: UpdatePermissionsDto) => + + getResourceDefinitions = (resourceName: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/permission-management/permissions/resource-definitions', + params: { resourceName }, + }, + { apiName: this.apiName, ...config }); + + + getResourceProviderKeyLookupServices = (resourceName: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/permission-management/permissions/resource-provider-key-lookup-services', + params: { resourceName }, + }, + { apiName: this.apiName, ...config }); + + + searchResourceProviderKey = (resourceName: string, serviceName: string, filter: string, page: number, config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/permission-management/permissions/search-resource-provider-keys', + params: { resourceName, serviceName, filter, page }, + }, + { apiName: this.apiName, ...config }); + + + update = (providerName: string, providerKey: string, input: UpdatePermissionsDto, config?: Partial) => this.restService.request({ method: 'PUT', url: '/api/permission-management/permissions', params: { providerName, providerKey }, body: input, }, - { apiName: this.apiName }); + { apiName: this.apiName, ...config }); + + + updateResource = (resourceName: string, resourceKey: string, input: UpdateResourcePermissionsDto, config?: Partial) => + this.restService.request({ + method: 'PUT', + url: '/api/permission-management/permissions/resource', + params: { resourceName, resourceKey }, + body: input, + }, + { apiName: this.apiName, ...config }); } diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/index.ts b/npm/ng-packs/packages/permission-management/src/lib/components/index.ts index efa91b45a2..074ddb880d 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/index.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/components/index.ts @@ -1 +1,6 @@ export * from './permission-management.component'; +export * from './resource-permission-management/resource-permission-management.component'; +export * from './resource-permission-management/provider-key-search/provider-key-search.component'; +export * from './resource-permission-management/permission-checkbox-list/permission-checkbox-list.component'; +export * from './resource-permission-management/resource-permission-list/resource-permission-list.component'; +export * from './resource-permission-management/resource-permission-form/resource-permission-form.component'; diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/permission-checkbox-list/permission-checkbox-list.component.html b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/permission-checkbox-list/permission-checkbox-list.component.html new file mode 100644 index 0000000000..07db143b00 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/permission-checkbox-list/permission-checkbox-list.component.html @@ -0,0 +1,25 @@ +
+ @if (showTitle()) { +
{{ title() | abpLocalization }}
+ } +
+ + +
+
+ @for (perm of permissions(); track perm.name) { +
+ + +
+ } +
+
\ No newline at end of file diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/permission-checkbox-list/permission-checkbox-list.component.scss b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/permission-checkbox-list/permission-checkbox-list.component.scss new file mode 100644 index 0000000000..0562864716 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/permission-checkbox-list/permission-checkbox-list.component.scss @@ -0,0 +1,4 @@ +.abp-permission-list-container { + max-height: 300px; + overflow-y: auto; +} \ No newline at end of file diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/permission-checkbox-list/permission-checkbox-list.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/permission-checkbox-list/permission-checkbox-list.component.ts new file mode 100644 index 0000000000..26c5a314f9 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/permission-checkbox-list/permission-checkbox-list.component.ts @@ -0,0 +1,24 @@ +import { Component, input, inject, ChangeDetectionStrategy } from '@angular/core'; +import { LocalizationPipe } from '@abp/ng.core'; +import { ResourcePermissionStateService } from '../../../services/resource-permission-state.service'; + +interface PermissionItem { + name?: string | null; + displayName?: string | null; +} + +@Component({ + selector: 'abp-permission-checkbox-list', + templateUrl: './permission-checkbox-list.component.html', + styleUrl: './permission-checkbox-list.component.scss', + imports: [LocalizationPipe], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PermissionCheckboxListComponent { + readonly state = inject(ResourcePermissionStateService); + + readonly permissions = input.required(); + readonly idPrefix = input('default'); + readonly title = input('AbpPermissionManagement::ResourcePermissionPermissions'); + readonly showTitle = input(true); +} diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/provider-key-search/provider-key-search.component.html b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/provider-key-search/provider-key-search.component.html new file mode 100644 index 0000000000..41740a1f64 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/provider-key-search/provider-key-search.component.html @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/provider-key-search/provider-key-search.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/provider-key-search/provider-key-search.component.ts new file mode 100644 index 0000000000..0aceed0c5f --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/provider-key-search/provider-key-search.component.ts @@ -0,0 +1,61 @@ +import { Component, input, inject, OnInit, ChangeDetectionStrategy, DestroyRef } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { PermissionsService } from '@abp/ng.permission-management/proxy'; +import { LookupSearchComponent, LookupItem } from '@abp/ng.components/lookup'; +import { Observable, map } from 'rxjs'; +import { ResourcePermissionStateService } from '../../../services/resource-permission-state.service'; + +interface ProviderKeyLookupItem extends LookupItem { + providerKey: string; + providerDisplayName?: string; +} + +@Component({ + selector: 'abp-provider-key-search', + templateUrl: './provider-key-search.component.html', + imports: [LookupSearchComponent], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ProviderKeySearchComponent implements OnInit { + readonly state = inject(ResourcePermissionStateService); + private readonly service = inject(PermissionsService); + private readonly destroyRef = inject(DestroyRef); + + readonly resourceName = input.required(); + + searchFn: (filter: string) => Observable = () => new Observable(); + + ngOnInit() { + this.searchFn = (filter: string) => this.loadProviderKeys(filter); + } + + onItemSelected(item: ProviderKeyLookupItem) { + // State is already updated via displayValue and selectedValue bindings + // This handler can be used for additional side effects if needed + } + + private loadProviderKeys(filter: string): Observable { + const providerName = this.state.selectedProviderName(); + if (!providerName) { + return new Observable(subscriber => { + subscriber.next([]); + subscriber.complete(); + }); + } + + return this.service.searchResourceProviderKey( + this.resourceName(), + providerName, + filter, + 1 + ).pipe( + map(res => (res.keys || []).map(k => ({ + key: k.providerKey || '', + displayName: k.providerDisplayName || k.providerKey || '', + providerKey: k.providerKey || '', + providerDisplayName: k.providerDisplayName || undefined, + }))), + takeUntilDestroyed(this.destroyRef) + ); + } +} diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-form/resource-permission-form.component.html b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-form/resource-permission-form.component.html new file mode 100644 index 0000000000..ed1feb243c --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-form/resource-permission-form.component.html @@ -0,0 +1,28 @@ +@if (mode() === eResourcePermissionViewModes.Add) { +
+ +
+ @for (provider of state.providers(); track provider.name; let i = $index) { +
+ + +
+ } +
+ + +
+ + +} @else { +
+

{{ 'AbpPermissionManagement::Permissions' | abpLocalization }}

+ +
+} \ No newline at end of file diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-form/resource-permission-form.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-form/resource-permission-form.component.ts new file mode 100644 index 0000000000..8761da7f90 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-form/resource-permission-form.component.ts @@ -0,0 +1,31 @@ +import { Component, input, inject, output, ChangeDetectionStrategy } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { LocalizationPipe } from '@abp/ng.core'; +import { ResourcePermissionStateService } from '../../../services/resource-permission-state.service'; +import { ProviderKeySearchComponent } from '../provider-key-search/provider-key-search.component'; +import { PermissionCheckboxListComponent } from '../permission-checkbox-list/permission-checkbox-list.component'; + +import { eResourcePermissionViewModes } from '../../../enums/view-modes'; + +@Component({ + selector: 'abp-resource-permission-form', + templateUrl: './resource-permission-form.component.html', + imports: [ + FormsModule, + LocalizationPipe, + ProviderKeySearchComponent, + PermissionCheckboxListComponent, + ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ResourcePermissionFormComponent { + readonly state = inject(ResourcePermissionStateService); + readonly eResourcePermissionViewModes = eResourcePermissionViewModes; + + readonly mode = input.required(); + readonly resourceName = input.required(); + + readonly save = output(); + readonly cancel = output(); +} + diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-list/resource-permission-list.component.html b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-list/resource-permission-list.component.html new file mode 100644 index 0000000000..a00c909aff --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-list/resource-permission-list.component.html @@ -0,0 +1,41 @@ +
+ +
+ + +
+ + +
+
+ +@if (state.resourcePermissions().length > 0) { + +} @else { +
+ {{ 'AbpPermissionManagement::NoPermissionsAssigned' | abpLocalization }} +
+} diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-list/resource-permission-list.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-list/resource-permission-list.component.ts new file mode 100644 index 0000000000..777246af9a --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-list/resource-permission-list.component.ts @@ -0,0 +1,33 @@ +import { Component, inject, output, ChangeDetectionStrategy } from '@angular/core'; +import { ListService, LocalizationPipe } from '@abp/ng.core'; +import { ExtensibleTableComponent, EXTENSIONS_IDENTIFIER } from '@abp/ng.components/extensible'; +import { ResourcePermissionGrantInfoDto } from '@abp/ng.permission-management/proxy'; +import { ResourcePermissionStateService } from '../../../services/resource-permission-state.service'; +import { ePermissionManagementComponents } from '../../../enums/components'; +import { configureResourcePermissionExtensions } from '../../../services/extensions.service'; + +@Component({ + selector: 'abp-resource-permission-list', + templateUrl: './resource-permission-list.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: ePermissionManagementComponents.ResourcePermissions, + }, + ], + imports: [LocalizationPipe, ExtensibleTableComponent], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ResourcePermissionListComponent { + readonly state = inject(ResourcePermissionStateService); + readonly list = inject(ListService); + + readonly addClicked = output(); + readonly editClicked = output(); + readonly deleteClicked = output(); + + constructor() { + configureResourcePermissionExtensions(); + } +} diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-management.component.html b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-management.component.html new file mode 100644 index 0000000000..571880a25f --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-management.component.html @@ -0,0 +1,60 @@ + + + + + + + @if (!state.hasResourcePermission() || !state.hasProviderKeyLookupService()) { + + } @else { + @switch (state.viewMode()) { + @case (eResourcePermissionViewModes.List) { + + } + @case (eResourcePermissionViewModes.Add) { + + } + @case (eResourcePermissionViewModes.Edit) { + + } + } + } + + + + @if (state.isListMode()) { + + } @else { + + + {{ 'AbpUi::Save' | abpLocalization }} + + } + + \ No newline at end of file diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-management.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-management.component.ts new file mode 100644 index 0000000000..fc534f128d --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-management.component.ts @@ -0,0 +1,217 @@ +import { ListService, LocalizationPipe } from '@abp/ng.core'; +import { + ButtonComponent, + Confirmation, + ConfirmationService, + ModalCloseDirective, + ModalComponent, + ToasterService, +} from '@abp/ng.theme.shared'; +import { + PermissionsService, + ResourcePermissionGrantInfoDto, +} from '@abp/ng.permission-management/proxy'; +import { + Component, + inject, + input, + model, + OnInit, + effect, + untracked, + signal, +} from '@angular/core'; +import { finalize, switchMap, of } from 'rxjs'; +import { ResourcePermissionStateService } from '../../services/resource-permission-state.service'; +import { ResourcePermissionListComponent } from './resource-permission-list/resource-permission-list.component'; +import { ResourcePermissionFormComponent } from './resource-permission-form/resource-permission-form.component'; + +import { eResourcePermissionViewModes } from '../../enums/view-modes'; + +const DEFAULT_MAX_RESULT_COUNT = 10; + +@Component({ + selector: 'abp-resource-permission-management', + templateUrl: './resource-permission-management.component.html', + exportAs: 'abpResourcePermissionManagement', + providers: [ResourcePermissionStateService, ListService], + imports: [ + ModalComponent, + LocalizationPipe, + ButtonComponent, + ModalCloseDirective, + ResourcePermissionListComponent, + ResourcePermissionFormComponent, + ], +}) +export class ResourcePermissionManagementComponent implements OnInit { + readonly eResourcePermissionViewModes = eResourcePermissionViewModes; + + protected readonly service = inject(PermissionsService); + protected readonly toasterService = inject(ToasterService); + protected readonly confirmationService = inject(ConfirmationService); + protected readonly state = inject(ResourcePermissionStateService); + private readonly list = inject(ListService); + + readonly resourceName = input.required(); + readonly resourceKey = input.required(); + readonly resourceDisplayName = input(); + + readonly visible = model(false); + + private readonly previousVisible = signal(false); + + constructor() { + effect(() => { + const resourceName = this.resourceName(); + const resourceKey = this.resourceKey(); + const resourceDisplayName = this.resourceDisplayName(); + + untracked(() => { + this.state.resourceName.set(resourceName); + this.state.resourceKey.set(resourceKey); + this.state.resourceDisplayName.set(resourceDisplayName); + }); + }); + + effect(() => { + const isVisible = this.visible(); + const wasVisible = this.previousVisible(); + if (isVisible && !wasVisible) { + this.openModal(); + } else if (!isVisible && wasVisible) { + this.state.reset(); + } + untracked(() => this.previousVisible.set(isVisible)); + }); + } + + ngOnInit() { + this.list.maxResultCount = DEFAULT_MAX_RESULT_COUNT; + + this.list.hookToQuery(query => { + const allData = this.state.allResourcePermissions(); + const skipCount = query.skipCount || 0; + const maxResultCount = query.maxResultCount || DEFAULT_MAX_RESULT_COUNT; + + const paginatedData = allData.slice(skipCount, skipCount + maxResultCount); + + return of({ + items: paginatedData, + totalCount: allData.length + }); + }).subscribe(result => { + this.state.resourcePermissions.set(result.items); + this.state.totalCount.set(result.totalCount); + }); + } + + openModal() { + this.state.modalBusy.set(true); + + this.service.getResource(this.resourceName(), this.resourceKey()).pipe( + switchMap(permRes => { + this.state.setResourceData(permRes.permissions || []); + this.list.get(); + return this.service.getResourceProviderKeyLookupServices(this.resourceName()); + }), + switchMap(providerRes => { + this.state.setProviders(providerRes.providers || []); + return this.service.getResourceDefinitions(this.resourceName()); + }), + finalize(() => this.state.modalBusy.set(false)) + ).subscribe({ + next: defRes => { + this.state.setDefinitions(defRes.permissions || []); + }, + error: () => { + this.toasterService.error('AbpPermissionManagement::ErrorLoadingPermissions'); + } + }); + } + + onAddClicked() { + this.state.goToAddMode(); + } + + onEditClicked(grant: ResourcePermissionGrantInfoDto) { + this.state.prepareEditMode(grant); + this.state.modalBusy.set(true); + + this.service.getResourceByProvider( + this.resourceName(), + this.resourceKey(), + grant.providerName || '', + grant.providerKey || '' + ).pipe( + finalize(() => this.state.modalBusy.set(false)) + ).subscribe({ + next: res => { + this.state.setEditModePermissions(res.permissions || []); + } + }); + } + + onDeleteClicked(grant: ResourcePermissionGrantInfoDto) { + this.confirmationService + .warn( + 'AbpPermissionManagement::PermissionDeletionConfirmationMessage', + 'AbpPermissionManagement::AreYouSure', + { + messageLocalizationParams: [grant.providerKey || ''], + } + ) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + this.state.modalBusy.set(true); + this.service.deleteResource( + this.resourceName(), + this.resourceKey(), + grant.providerName || '', + grant.providerKey || '' + ).pipe( + switchMap(() => this.service.getResource(this.resourceName(), this.resourceKey())), + finalize(() => this.state.modalBusy.set(false)) + ).subscribe({ + next: res => { + this.state.setResourceData(res.permissions || []); + this.list.get(); + this.toasterService.success('AbpUi::SuccessfullyDeleted'); + } + }); + } + }); + } + + savePermission() { + const isEdit = this.state.isEditMode(); + const providerName = isEdit ? this.state.editProviderName() : this.state.selectedProviderName(); + const providerKey = isEdit ? this.state.editProviderKey() : this.state.selectedProviderKey(); + + if (!isEdit && !this.state.canSave()) { + this.toasterService.warn('AbpPermissionManagement::PleaseSelectProviderAndPermissions'); + return; + } + + this.state.modalBusy.set(true); + this.service.updateResource( + this.resourceName(), + this.resourceKey(), + { + providerName, + providerKey, + permissions: this.state.selectedPermissions() + } + ).pipe( + switchMap(() => this.service.getResource(this.resourceName(), this.resourceKey())), + finalize(() => this.state.modalBusy.set(false)) + ).subscribe({ + next: res => { + this.state.setResourceData(res.permissions || []); + this.list.get(); + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.state.goToListMode(); + } + }); + } +} diff --git a/npm/ng-packs/packages/permission-management/src/lib/defaults/default-resource-permission-entity-props.ts b/npm/ng-packs/packages/permission-management/src/lib/defaults/default-resource-permission-entity-props.ts new file mode 100644 index 0000000000..107410f73c --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/defaults/default-resource-permission-entity-props.ts @@ -0,0 +1,34 @@ +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; +import { ResourcePermissionGrantInfoDto } from '@abp/ng.permission-management/proxy'; +import { of } from 'rxjs'; + +export const DEFAULT_RESOURCE_PERMISSION_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'providerWithKey', + displayName: 'AbpPermissionManagement::Provider', + sortable: false, + valueResolver: data => { + const providerName = data.record.providerName || ''; + const providerDisplayName = data.record.providerDisplayName || data.record.providerKey || ''; + // Get first letter of provider name for abbreviation + const abbr = providerName.charAt(0).toUpperCase(); + return of( + `${abbr}${providerDisplayName}` + ); + }, + }, + { + type: ePropType.String, + name: 'permissions', + displayName: 'AbpPermissionManagement::Permissions', + sortable: false, + valueResolver: data => { + const permissions = data.record.permissions || []; + const pills = permissions + .map(p => `${p.displayName}`) + .join(''); + return of(pills); + }, + }, +]); diff --git a/npm/ng-packs/packages/permission-management/src/lib/defaults/index.ts b/npm/ng-packs/packages/permission-management/src/lib/defaults/index.ts new file mode 100644 index 0000000000..930121e6f1 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/defaults/index.ts @@ -0,0 +1 @@ +export * from './default-resource-permission-entity-props'; diff --git a/npm/ng-packs/packages/permission-management/src/lib/enums/components.ts b/npm/ng-packs/packages/permission-management/src/lib/enums/components.ts index 175d39c999..5db553c4e9 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/enums/components.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/enums/components.ts @@ -1,3 +1,4 @@ export const enum ePermissionManagementComponents { PermissionManagement = 'PermissionManagement.PermissionManagementComponent', + ResourcePermissions = 'PermissionManagement.ResourcePermissionsComponent', } diff --git a/npm/ng-packs/packages/permission-management/src/lib/enums/index.ts b/npm/ng-packs/packages/permission-management/src/lib/enums/index.ts new file mode 100644 index 0000000000..df29235e5b --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/enums/index.ts @@ -0,0 +1,2 @@ +export * from './view-modes'; +export * from './components'; diff --git a/npm/ng-packs/packages/permission-management/src/lib/enums/view-modes.ts b/npm/ng-packs/packages/permission-management/src/lib/enums/view-modes.ts new file mode 100644 index 0000000000..4611dda210 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/enums/view-modes.ts @@ -0,0 +1,5 @@ +export enum eResourcePermissionViewModes { + List = 'list', + Add = 'add', + Edit = 'edit', +} diff --git a/npm/ng-packs/packages/permission-management/src/lib/services/extensions.service.ts b/npm/ng-packs/packages/permission-management/src/lib/services/extensions.service.ts new file mode 100644 index 0000000000..ef9de4bc37 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/services/extensions.service.ts @@ -0,0 +1,23 @@ +import { + ExtensionsService, + mergeWithDefaultProps, +} from '@abp/ng.components/extensible'; +import { inject } from '@angular/core'; +import { + RESOURCE_PERMISSION_ENTITY_PROP_CONTRIBUTORS, + DEFAULT_RESOURCE_PERMISSION_ENTITY_PROPS_MAP, +} from '../tokens'; + +export function configureResourcePermissionExtensions() { + const extensions = inject(ExtensionsService); + + const config = { optional: true }; + + const propContributors = inject(RESOURCE_PERMISSION_ENTITY_PROP_CONTRIBUTORS, config) || {}; + + mergeWithDefaultProps( + extensions.entityProps, + DEFAULT_RESOURCE_PERMISSION_ENTITY_PROPS_MAP, + propContributors, + ); +} diff --git a/npm/ng-packs/packages/permission-management/src/lib/services/index.ts b/npm/ng-packs/packages/permission-management/src/lib/services/index.ts new file mode 100644 index 0000000000..f4dae3a571 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/services/index.ts @@ -0,0 +1,2 @@ +export * from './extensions.service'; +export * from './resource-permission-state.service'; diff --git a/npm/ng-packs/packages/permission-management/src/lib/services/resource-permission-state.service.ts b/npm/ng-packs/packages/permission-management/src/lib/services/resource-permission-state.service.ts new file mode 100644 index 0000000000..e27bcd10c4 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/services/resource-permission-state.service.ts @@ -0,0 +1,164 @@ +import { Injectable, signal, computed } from '@angular/core'; +import { + ResourcePermissionGrantInfoDto, + ResourceProviderDto, + ResourcePermissionDefinitionDto, + SearchProviderKeyInfo, + ResourcePermissionWithProdiverGrantInfoDto, +} from '@abp/ng.permission-management/proxy'; +import { eResourcePermissionViewModes } from '../enums/view-modes'; + +@Injectable() +export class ResourcePermissionStateService { + // View state + readonly viewMode = signal(eResourcePermissionViewModes.List); + readonly modalBusy = signal(false); + readonly hasResourcePermission = signal(false); + readonly hasProviderKeyLookupService = signal(false); + + // Resource data + readonly resourceName = signal(''); + readonly resourceKey = signal(''); + readonly resourceDisplayName = signal(undefined); + + // Permissions data + readonly allResourcePermissions = signal([]); + readonly resourcePermissions = signal([]); + readonly totalCount = signal(0); + readonly permissionDefinitions = signal([]); + readonly permissionsWithProvider = signal([]); + readonly selectedPermissions = signal([]); + + // Provider data + readonly providers = signal([]); + readonly selectedProviderName = signal(''); + readonly selectedProviderKey = signal(''); + + // Edit mode specific + readonly editProviderName = signal(''); + readonly editProviderKey = signal(''); + + // Search state + readonly searchFilter = signal(''); + readonly searchResults = signal([]); + readonly showDropdown = signal(false); + + // Computed properties + readonly isAddMode = computed(() => this.viewMode() === eResourcePermissionViewModes.Add); + readonly isEditMode = computed(() => this.viewMode() === eResourcePermissionViewModes.Edit); + readonly isListMode = computed(() => this.viewMode() === eResourcePermissionViewModes.List); + + readonly currentPermissionsList = computed(() => + this.isAddMode() ? this.permissionDefinitions() : this.permissionsWithProvider() + ); + + readonly allPermissionsSelected = computed(() => { + const definitions = this.currentPermissionsList(); + return definitions.length > 0 && + definitions.every(p => this.selectedPermissions().includes(p.name || '')); + }); + + readonly canSave = computed(() => { + if (this.isAddMode()) { + return !!this.selectedProviderKey() && this.selectedPermissions().length > 0; + } + return this.selectedPermissions().length >= 0; + }); + + // State transition methods + goToListMode() { + this.viewMode.set(eResourcePermissionViewModes.List); + this.selectedPermissions.set([]); + } + + goToAddMode() { + this.viewMode.set(eResourcePermissionViewModes.Add); + this.selectedPermissions.set([]); + this.selectedProviderKey.set(''); + this.searchResults.set([]); + this.searchFilter.set(''); + } + + prepareEditMode(grant: ResourcePermissionGrantInfoDto) { + this.editProviderName.set(grant.providerName || ''); + this.editProviderKey.set(grant.providerKey || ''); + } + + setEditModePermissions(permissions: ResourcePermissionWithProdiverGrantInfoDto[]) { + this.permissionsWithProvider.set(permissions); + this.selectedPermissions.set( + permissions.filter(p => p.isGranted).map(p => p.name || '') + ); + this.viewMode.set(eResourcePermissionViewModes.Edit); + } + + // Permission selection methods + togglePermission(permissionName: string) { + const current = this.selectedPermissions(); + if (current.includes(permissionName)) { + this.selectedPermissions.set(current.filter(p => p !== permissionName)); + } else { + this.selectedPermissions.set([...current, permissionName]); + } + } + + toggleAllPermissions(selectAll: boolean) { + const permissions = this.currentPermissionsList(); + this.selectedPermissions.set( + selectAll ? permissions.map(p => p.name || '') : [] + ); + } + + isPermissionSelected(permissionName: string): boolean { + return this.selectedPermissions().includes(permissionName); + } + + // Provider search methods + onProviderChange(providerName: string) { + this.selectedProviderName.set(providerName); + this.selectedProviderKey.set(''); + this.searchResults.set([]); + this.searchFilter.set(''); + } + + selectProviderKey(key: SearchProviderKeyInfo) { + this.selectedProviderKey.set(key.providerKey || ''); + this.searchFilter.set(key.providerDisplayName || key.providerKey || ''); + this.searchResults.set([]); + this.showDropdown.set(false); + } + + // Reset all state + reset() { + this.viewMode.set(eResourcePermissionViewModes.List); + this.allResourcePermissions.set([]); + this.resourcePermissions.set([]); + this.totalCount.set(0); + this.selectedProviderName.set(''); + this.selectedProviderKey.set(''); + this.searchFilter.set(''); + this.selectedPermissions.set([]); + this.searchResults.set([]); + this.editProviderName.set(''); + this.editProviderKey.set(''); + } + + // Data loading helpers + setResourceData(permissions: ResourcePermissionGrantInfoDto[]) { + this.allResourcePermissions.set(permissions); + this.totalCount.set(permissions.length); + } + + setProviders(providers: ResourceProviderDto[]) { + this.providers.set(providers); + this.hasProviderKeyLookupService.set(providers.length > 0); + if (providers.length) { + this.selectedProviderName.set(providers[0].name || ''); + } + } + + setDefinitions(permissions: ResourcePermissionDefinitionDto[]) { + this.permissionDefinitions.set(permissions); + this.hasResourcePermission.set(permissions.length > 0); + } +} diff --git a/npm/ng-packs/packages/permission-management/src/lib/tokens/extensions.token.ts b/npm/ng-packs/packages/permission-management/src/lib/tokens/extensions.token.ts new file mode 100644 index 0000000000..b87f253eb1 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/tokens/extensions.token.ts @@ -0,0 +1,17 @@ +import { ResourcePermissionGrantInfoDto } from '@abp/ng.permission-management/proxy'; +import { EntityPropContributorCallback } from '@abp/ng.components/extensible'; +import { InjectionToken } from '@angular/core'; +import { DEFAULT_RESOURCE_PERMISSION_ENTITY_PROPS } from '../defaults/default-resource-permission-entity-props'; +import { ePermissionManagementComponents } from '../enums/components'; + +export const DEFAULT_RESOURCE_PERMISSION_ENTITY_PROPS_MAP = { + [ePermissionManagementComponents.ResourcePermissions]: DEFAULT_RESOURCE_PERMISSION_ENTITY_PROPS, +}; + +export const RESOURCE_PERMISSION_ENTITY_PROP_CONTRIBUTORS = new InjectionToken( + 'RESOURCE_PERMISSION_ENTITY_PROP_CONTRIBUTORS', +); + +type EntityPropContributors = Partial<{ + [ePermissionManagementComponents.ResourcePermissions]: EntityPropContributorCallback[]; +}>; diff --git a/npm/ng-packs/packages/permission-management/src/lib/tokens/index.ts b/npm/ng-packs/packages/permission-management/src/lib/tokens/index.ts new file mode 100644 index 0000000000..33233400a2 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/tokens/index.ts @@ -0,0 +1 @@ +export * from './extensions.token'; diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index d878f17f3a..8a7836e8ba 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -4,16 +4,16 @@ "author": "", "schematics": "./collection.json", "dependencies": { - "@angular-devkit/core": "~20.0.0", - "@angular-devkit/schematics": "~20.0.0", - "@angular/cli": "~20.0.0", + "@angular-devkit/core": "~21.0.0", + "@angular-devkit/schematics": "~21.0.0", + "@angular/cli": "~21.0.0", "got": "^11.5.2", "jsonc-parser": "^2.3.0", "should-quote": "^1.0.0", - "typescript": "~5.8.0" + "typescript": "~5.9.0" }, "devDependencies": { - "@schematics/angular": "~20.0.0", + "@schematics/angular": "~21.0.0", "@types/jest": "29.4.4", "@types/node": "20.2.5", "jest": "29.4.3", diff --git a/npm/ng-packs/packages/schematics/project.json b/npm/ng-packs/packages/schematics/project.json index 7e3f6a8fd3..74a01e9f03 100644 --- a/npm/ng-packs/packages/schematics/project.json +++ b/npm/ng-packs/packages/schematics/project.json @@ -4,6 +4,7 @@ "projectType": "library", "sourceRoot": "packages/schematics/src", "prefix": "abp", + "tags": [], "targets": { "test": { "executor": "@nx/jest:jest", @@ -16,6 +17,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [] + } } diff --git a/npm/ng-packs/packages/setting-management/project.json b/npm/ng-packs/packages/setting-management/project.json index 334e58be26..57f72234fb 100644 --- a/npm/ng-packs/packages/setting-management/project.json +++ b/npm/ng-packs/packages/setting-management/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/setting-management/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "theme-shared", "components"], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,7 +34,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [], - "implicitDependencies": ["core", "theme-shared", "components"] + } } diff --git a/npm/ng-packs/packages/tenant-management/project.json b/npm/ng-packs/packages/tenant-management/project.json index c2f4c3bc8c..2394793380 100644 --- a/npm/ng-packs/packages/tenant-management/project.json +++ b/npm/ng-packs/packages/tenant-management/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/tenant-management/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "theme-shared", "feature-management"], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,7 +34,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [], - "implicitDependencies": ["core", "theme-shared", "feature-management"] + } } diff --git a/npm/ng-packs/packages/theme-basic/project.json b/npm/ng-packs/packages/theme-basic/project.json index 5c2936576f..be0464cc18 100644 --- a/npm/ng-packs/packages/theme-basic/project.json +++ b/npm/ng-packs/packages/theme-basic/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/theme-basic/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "theme-shared", "account-core"], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,7 +34,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [], - "implicitDependencies": ["core", "theme-shared", "account-core"] + } } diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index add2a3e0e1..8f4fe7888a 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -9,10 +9,10 @@ "dependencies": { "@abp/ng.core": "~10.0.1", "@fortawesome/fontawesome-free": "^6.0.0", - "@ng-bootstrap/ng-bootstrap": "~19.0.0", + "@ng-bootstrap/ng-bootstrap": "~20.0.0", "@ngx-validate/core": "^0.2.0", "@popperjs/core": "~2.11.0", - "@swimlane/ngx-datatable": "^21.0.0", + "@swimlane/ngx-datatable": "~22.0.0", "bootstrap": "^5.0.0", "tslib": "^2.0.0" }, diff --git a/npm/ng-packs/packages/theme-shared/project.json b/npm/ng-packs/packages/theme-shared/project.json index 6ad2a9db6d..a77551187c 100644 --- a/npm/ng-packs/packages/theme-shared/project.json +++ b/npm/ng-packs/packages/theme-shared/project.json @@ -4,6 +4,8 @@ "projectType": "library", "sourceRoot": "packages/theme-shared/src", "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "oauth"], "targets": { "build": { "executor": "@nx/angular:package", @@ -32,7 +34,5 @@ "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"] } - }, - "tags": [], - "implicitDependencies": ["core", "oauth"] + } } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts index aca2149f8b..9c884cb937 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts @@ -46,7 +46,7 @@ export class ToastContainerComponent implements OnInit { }); } - @HostListener('window:resize', ['$event']) + @HostListener('window:resize') onWindowResize() { this.setDefaultRight(); } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-default.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-default.directive.ts index b4c0d419c3..951de1a6f2 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-default.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-default.directive.ts @@ -8,7 +8,7 @@ import { inject, PLATFORM_ID, } from '@angular/core'; -import { ColumnMode, DatatableComponent, ScrollerComponent } from '@swimlane/ngx-datatable'; +import { ColumnMode, DatatableComponent } from '@swimlane/ngx-datatable'; import { fromEvent, Subscription } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; @@ -41,7 +41,7 @@ export class NgxDatatableDefaultDirective implements AfterViewInit, OnDestroy { this.table.virtualization = false; } - private fixHorizontalGap(scroller: ScrollerComponent) { + private fixHorizontalGap(scroller: any) { const { body, documentElement } = this.document; if (isPlatformBrowser(this.platformId)) { if (documentElement.scrollHeight !== documentElement.clientHeight) { diff --git a/npm/ng-packs/tsconfig.base.json b/npm/ng-packs/tsconfig.base.json index e667f271f4..4194690430 100644 --- a/npm/ng-packs/tsconfig.base.json +++ b/npm/ng-packs/tsconfig.base.json @@ -4,12 +4,12 @@ "strict": false, "sourceMap": true, "declaration": false, - "moduleResolution": "node", + "moduleResolution": "bundler", "emitDecoratorMetadata": true, "experimentalDecorators": true, "importHelpers": true, - "target": "es2020", - "module": "esnext", + "target": "ES2020", + "module": "ES2022", "lib": ["es2020", "dom"], "esModuleInterop": true, "baseUrl": "./", @@ -22,6 +22,7 @@ "@abp/ng.components": ["packages/components/src/public-api.ts"], "@abp/ng.components/chart.js": ["packages/components/chart.js/src/public-api.ts"], "@abp/ng.components/extensible": ["packages/components/extensible/src/public-api.ts"], + "@abp/ng.components/lookup": ["packages/components/lookup/src/public-api.ts"], "@abp/ng.components/page": ["packages/components/page/src/public-api.ts"], "@abp/ng.components/tree": ["packages/components/tree/src/public-api.ts"], "@abp/ng.core": ["packages/core/src/public-api.ts"], diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json index 420ad7b2cf..6a8c89da4e 100644 --- a/templates/app-nolayers/angular/package.json +++ b/templates/app-nolayers/angular/package.json @@ -21,15 +21,15 @@ "@abp/ng.tenant-management": "~10.0.1", "@abp/ng.theme.lepton-x": "~5.0.1", "@abp/ng.theme.shared": "~10.0.1", - "@angular/animations": "~20.0.0", - "@angular/common": "~20.0.0", - "@angular/compiler": "~20.0.0", - "@angular/core": "~20.0.0", - "@angular/forms": "~20.0.0", - "@angular/localize": "~20.0.0", - "@angular/platform-browser": "~20.0.0", - "@angular/platform-browser-dynamic": "~20.0.0", - "@angular/router": "~20.0.0", + "@angular/animations": "~21.0.0", + "@angular/common": "~21.0.0", + "@angular/compiler": "~21.0.0", + "@angular/core": "~21.0.0", + "@angular/forms": "~21.0.0", + "@angular/localize": "~21.0.0", + "@angular/platform-browser": "~21.0.0", + "@angular/platform-browser-dynamic": "~21.0.0", + "@angular/router": "~21.0.0", "bootstrap-icons": "~1.8.0", "rxjs": "~7.8.0", "tslib": "^2.0.0", @@ -37,27 +37,26 @@ }, "devDependencies": { "@abp/ng.schematics": "~10.0.1", - "@angular-devkit/build-angular": "~20.0.0", - "@angular-eslint/builder": "~20.0.0", - "@angular-eslint/eslint-plugin": "~20.0.0", - "@angular-eslint/eslint-plugin-template": "~20.0.0", - "@angular-eslint/schematics": "~20.0.0", - "@angular-eslint/template-parser": "~20.0.0", - "@angular/cli": "~20.0.0", - "@angular/compiler-cli": "~20.0.0", - "@angular/language-service": "~20.0.0", - "@angular/build": "~20.0.0", + "@angular-eslint/builder": "~21.0.0", + "@angular-eslint/eslint-plugin": "~21.0.0", + "@angular-eslint/eslint-plugin-template": "~21.0.0", + "@angular-eslint/schematics": "~21.0.0", + "@angular-eslint/template-parser": "~21.0.0", + "@angular/build": "~21.0.0", + "@angular/cli": "~21.0.0", + "@angular/compiler-cli": "~21.0.0", + "@angular/language-service": "~21.0.0", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "7.16.0", "@typescript-eslint/parser": "7.16.0", "eslint": "^8.0.0", "jasmine-core": "~4.0.0", - "karma": "~6.3.0", + "karma": "~6.4.4", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.1.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.7.0", - "typescript": "~5.8.0" + "typescript": "~5.9.0" } } diff --git a/templates/app-nolayers/angular/src/main.ts b/templates/app-nolayers/angular/src/main.ts index 7180ec1a32..b7ef9f0bc3 100644 --- a/templates/app-nolayers/angular/src/main.ts +++ b/templates/app-nolayers/angular/src/main.ts @@ -1,5 +1,6 @@ +import { provideZoneChangeDetection } from "@angular/core"; import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; -bootstrapApplication(AppComponent, appConfig).catch(err => console.error(err)); +bootstrapApplication(AppComponent, {...appConfig, providers: [provideZoneChangeDetection(), ...appConfig.providers]}).catch(err => console.error(err)); diff --git a/templates/app-nolayers/angular/tsconfig.json b/templates/app-nolayers/angular/tsconfig.json index 0322d97e4d..9a18adaf46 100644 --- a/templates/app-nolayers/angular/tsconfig.json +++ b/templates/app-nolayers/angular/tsconfig.json @@ -10,13 +10,9 @@ "moduleResolution": "bundler", "importHelpers": true, "target": "ES2022", - "module": "esnext", + "module": "ES2022", "skipLibCheck": true, "esModuleInterop": true, - "lib": [ - "es2020", - "dom" - ], "paths": { "@proxy": [ "src/app/proxy/index.ts" diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index ac7e253962..57e5e6d457 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -21,15 +21,15 @@ "@abp/ng.tenant-management": "~10.0.1", "@abp/ng.theme.lepton-x": "~5.0.1", "@abp/ng.theme.shared": "~10.0.1", - "@angular/animations": "~20.0.0", - "@angular/common": "~20.0.0", - "@angular/compiler": "~20.0.0", - "@angular/core": "~20.0.0", - "@angular/forms": "~20.0.0", - "@angular/localize": "~20.0.0", - "@angular/platform-browser": "~20.0.0", - "@angular/platform-browser-dynamic": "~20.0.0", - "@angular/router": "~20.0.0", + "@angular/animations": "~21.0.0", + "@angular/common": "~21.0.0", + "@angular/compiler": "~21.0.0", + "@angular/core": "~21.0.0", + "@angular/forms": "~21.0.0", + "@angular/localize": "~21.0.0", + "@angular/platform-browser": "~21.0.0", + "@angular/platform-browser-dynamic": "~21.0.0", + "@angular/router": "~21.0.0", "bootstrap-icons": "~1.8.0", "rxjs": "~7.8.0", "tslib": "^2.0.0", @@ -37,27 +37,26 @@ }, "devDependencies": { "@abp/ng.schematics": "~10.0.1", - "@angular-devkit/build-angular": "~20.0.0", - "@angular-eslint/builder": "~20.0.0", - "@angular-eslint/eslint-plugin": "~20.0.0", - "@angular-eslint/eslint-plugin-template": "~20.0.0", - "@angular-eslint/schematics": "~20.0.0", - "@angular-eslint/template-parser": "~20.0.0", - "@angular/cli": "~20.0.0", - "@angular/compiler-cli": "~20.0.0", - "@angular/language-service": "~20.0.0", - "@angular/build": "~20.0.0", + "@angular-eslint/builder": "~21.0.0", + "@angular-eslint/eslint-plugin": "~21.0.0", + "@angular-eslint/eslint-plugin-template": "~21.0.0", + "@angular-eslint/schematics": "~21.0.0", + "@angular-eslint/template-parser": "~21.0.0", + "@angular/build": "~21.0.0", + "@angular/cli": "~21.0.0", + "@angular/compiler-cli": "~21.0.0", + "@angular/language-service": "~21.0.0", "@types/jasmine": "~3.6.0", "@types/node": "~20.11.0", "@typescript-eslint/eslint-plugin": "7.16.0", "@typescript-eslint/parser": "7.16.0", "eslint": "^8.0.0", "jasmine-core": "~4.0.0", - "karma": "~6.3.0", + "karma": "~6.4.4", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.1.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.7.0", - "typescript": "~5.8.0" + "typescript": "~5.9.3" } } diff --git a/templates/app/angular/src/main.ts b/templates/app/angular/src/main.ts index 7180ec1a32..b7ef9f0bc3 100644 --- a/templates/app/angular/src/main.ts +++ b/templates/app/angular/src/main.ts @@ -1,5 +1,6 @@ +import { provideZoneChangeDetection } from "@angular/core"; import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; -bootstrapApplication(AppComponent, appConfig).catch(err => console.error(err)); +bootstrapApplication(AppComponent, {...appConfig, providers: [provideZoneChangeDetection(), ...appConfig.providers]}).catch(err => console.error(err)); diff --git a/templates/app/angular/tsconfig.json b/templates/app/angular/tsconfig.json index 0322d97e4d..9a18adaf46 100644 --- a/templates/app/angular/tsconfig.json +++ b/templates/app/angular/tsconfig.json @@ -10,13 +10,9 @@ "moduleResolution": "bundler", "importHelpers": true, "target": "ES2022", - "module": "esnext", + "module": "ES2022", "skipLibCheck": true, "esModuleInterop": true, - "lib": [ - "es2020", - "dom" - ], "paths": { "@proxy": [ "src/app/proxy/index.ts" diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 5fc4ebe29e..6e66db9a0d 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -22,44 +22,43 @@ "@abp/ng.tenant-management": "~10.0.1", "@abp/ng.theme.basic": "~10.0.1", "@abp/ng.theme.shared": "~10.0.1", - "@angular/animations": "~20.0.0", - "@angular/common": "~20.0.0", - "@angular/compiler": "~20.0.0", - "@angular/core": "~20.0.0", - "@angular/forms": "~20.0.0", - "@angular/localize": "~20.0.0", - "@angular/platform-browser": "~20.0.0", - "@angular/platform-browser-dynamic": "~20.0.0", - "@angular/router": "~20.0.0", + "@angular/animations": "~21.0.0", + "@angular/common": "~21.0.0", + "@angular/compiler": "~21.0.0", + "@angular/core": "~21.0.0", + "@angular/forms": "~21.0.0", + "@angular/localize": "~21.0.0", + "@angular/platform-browser": "~21.0.0", + "@angular/platform-browser-dynamic": "~21.0.0", + "@angular/router": "~21.0.0", "rxjs": "~7.8.0", "tslib": "^2.0.0", "zone.js": "~0.15.0" }, "devDependencies": { "@abp/ng.schematics": "~10.0.1", - "@angular-devkit/build-angular": "~20.0.0", - "@angular-eslint/builder": "~20.0.0", - "@angular-eslint/eslint-plugin": "~20.0.0", - "@angular-eslint/eslint-plugin-template": "~20.0.0", - "@angular-eslint/schematics": "~20.0.0", - "@angular-eslint/template-parser": "~20.0.0", - "@angular/cli": "~20.0.0", - "@angular/compiler-cli": "~20.0.0", - "@angular/language-service": "~20.0.0", - "@angular/build": "~20.0.0", + "@angular-eslint/builder": "~21.0.0", + "@angular-eslint/eslint-plugin": "~21.0.0", + "@angular-eslint/eslint-plugin-template": "~21.0.0", + "@angular-eslint/schematics": "~21.0.0", + "@angular-eslint/template-parser": "~21.0.0", + "@angular/build": "~21.0.0", + "@angular/cli": "~21.0.0", + "@angular/compiler-cli": "~21.0.0", + "@angular/language-service": "~21.0.0", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "7.16.0", "@typescript-eslint/parser": "7.16.0", "eslint": "^8.0.0", "jasmine-core": "~4.0.0", - "karma": "~6.3.0", + "karma": "~6.4.4", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.1.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.7.0", - "ng-packagr": "~20.0.0", + "ng-packagr": "~21.0.0", "symlink": "^2.0.0", - "typescript": "~5.8.0" + "typescript": "~5.9.0" } } diff --git a/templates/module/angular/projects/dev-app/src/main.ts b/templates/module/angular/projects/dev-app/src/main.ts index 7180ec1a32..b7ef9f0bc3 100644 --- a/templates/module/angular/projects/dev-app/src/main.ts +++ b/templates/module/angular/projects/dev-app/src/main.ts @@ -1,5 +1,6 @@ +import { provideZoneChangeDetection } from "@angular/core"; import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; -bootstrapApplication(AppComponent, appConfig).catch(err => console.error(err)); +bootstrapApplication(AppComponent, {...appConfig, providers: [provideZoneChangeDetection(), ...appConfig.providers]}).catch(err => console.error(err)); diff --git a/templates/module/angular/projects/my-project-name/tsconfig.lib.json b/templates/module/angular/projects/my-project-name/tsconfig.lib.json index 8246b3f0b1..6fea9ad884 100644 --- a/templates/module/angular/projects/my-project-name/tsconfig.lib.json +++ b/templates/module/angular/projects/my-project-name/tsconfig.lib.json @@ -6,11 +6,7 @@ "declaration": true, "declarationMap": true, "inlineSources": true, - "types": [], - "lib": [ - "dom", - "es2018" - ] + "types": [] }, "exclude": [ "src/test.ts", diff --git a/templates/module/angular/tsconfig.json b/templates/module/angular/tsconfig.json index 0cbe9a9de8..2e5e466bf0 100644 --- a/templates/module/angular/tsconfig.json +++ b/templates/module/angular/tsconfig.json @@ -2,6 +2,7 @@ "extends": "./tsconfig.prod.json", "compilerOptions": { "esModuleInterop": true, + "moduleResolution": "bundler", "skipLibCheck": true, "paths": { "@my-company-name/my-project-name": [ diff --git a/templates/module/angular/tsconfig.prod.json b/templates/module/angular/tsconfig.prod.json index 28b0a75f51..2f4afb8ff7 100644 --- a/templates/module/angular/tsconfig.prod.json +++ b/templates/module/angular/tsconfig.prod.json @@ -7,10 +7,10 @@ "declaration": false, "downlevelIteration": true, "experimentalDecorators": true, - "moduleResolution": "node", + "moduleResolution": "bundler", "importHelpers": true, - "target": "es2020", - "module": "esnext", + "target": "es2022", + "module": "ES2022", "esModuleInterop": true, "lib": [ "es2020",