diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000000..b88c4e1588 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,270 @@ +# ABP Framework – Cursor Rules +# Scope: ABP Framework repository (abpframework/abp) — for developing ABP itself, not ABP-based applications. +# Goal: Enforce ABP module architecture best practices (DDD, layering, DB/ORM independence), +# maintain backward compatibility, ensure extensibility, and align with ABP contribution guidelines. + +## Global Defaults +- Follow existing patterns in this repository first. Before generating new code, search for similar implementations and mirror their structure, naming, and conventions. +- Prefer minimal, focused diffs. Avoid drive-by refactors and formatting churn. +- Preserve public APIs. Avoid breaking changes unless explicitly requested and justified. +- Keep layers clean. Do not introduce forbidden dependencies between packages. + +## Module / Package Architecture (Layering) +- Use a layered module structure with explicit dependencies: + - *.Domain.Shared: constants, enums, shared types safe for all layers and 3rd-party clients. MUST NOT contain entities, repositories, domain services, or business objects. + - *.Domain: entities/aggregate roots, repository interfaces, domain services. + - *.Application.Contracts: application service interfaces and DTOs. + - *.Application: application service implementations. + - *.EntityFrameworkCore / *.MongoDb: ORM integration packages depend on *.Domain only. MUST NOT depend on other layers. + - *.HttpApi: REST controllers. MUST depend ONLY on *.Application.Contracts (NOT *.Application). + - *.HttpApi.Client: remote client proxies. MUST depend ONLY on *.Application.Contracts. + - *.Web: UI. MUST depend ONLY on *.HttpApi. +- Enforce dependency direction: + - Web -> HttpApi -> Application.Contracts + - Application -> Domain + Application.Contracts + - Domain -> Domain.Shared + - ORM integration -> Domain +- Do not leak web concerns into application/domain. + +## Domain Layer – Entities & Aggregate Roots +- Define entities in the domain layer. +- Entities must be valid at creation: + - Provide a primary constructor that enforces invariants. + - Always include a protected parameterless constructor for ORMs. + - Always initialize sub-collections in the primary constructor. + - Do NOT generate Guid keys inside constructors; accept `id` and generate using `IGuidGenerator` from the calling code. +- Make members `virtual` where appropriate (ORM/proxy compatibility). +- Protect consistency: + - Use non-public setters (private/protected/internal) when needed. + - Provide meaningful domain methods for state transitions; prefer returning `this` from setters when applicable. +- Aggregate roots: + - Always use a single `Id` property. Do NOT use composite keys. + - Prefer `Guid` keys for aggregate roots. + - Inherit from `AggregateRoot` or audited base classes as required. +- Aggregate boundaries: + - Keep aggregates small. Avoid large sub-collections unless necessary. +- References: + - Reference other aggregate roots by Id only. + - Do NOT add navigation properties to other aggregate roots. + +## Repositories +- Define repository interfaces in the domain layer. +- Create one dedicated repository interface per aggregate root (e.g., `IProductRepository`). +- Public repository interfaces exposed by modules: + - SHOULD inherit from `IBasicRepository` (or `IReadOnlyRepository<...>` when suitable). + - SHOULD NOT expose `IQueryable` in the public contract. + - Internal implementations MAY use `IRepository` and `IQueryable` as needed. +- Do NOT define repositories for non-aggregate-root entities. +- Repository method conventions: + - All methods async. + - Include optional `CancellationToken cancellationToken = default` in every method. + - For single-entity returning methods: include `bool includeDetails = true`. + - For list returning methods: include `bool includeDetails = false`. + - Do NOT return composite projection classes like `UserWithRoles`. Use `includeDetails` for eager-loading. + - Avoid projection-only view models from repositories by default; only allow when performance is critical. + +## Domain Services +- Define domain services in the domain layer. +- Default: do NOT create interfaces for domain services unless necessary (mocking/multiple implementations). +- Naming: use `*Manager` suffix. +- Domain service methods: + - Focus on operations that enforce domain invariants and business rules. + - Query methods are acceptable when they encapsulate domain-specific lookup logic (e.g., normalized lookups, caching, complex resolution). Simple queries belong in repositories. + - Define methods that mutate state and enforce domain rules. + - Use specific, intention-revealing names (avoid generic `UpdateXAsync`). + - Accept valid domain objects as parameters; do NOT accept/return DTOs. + - On rule violations, throw `BusinessException` (or custom business exceptions). + - Use unique, namespaced error codes suitable for localization (e.g., `IssueTracking:ConcurrentOpenIssueLimit`). + - Do NOT depend on authenticated user logic; pass required values from application layer. + +## Application Services (Contracts + Implementation) +### Contracts +- Define one interface per application service in *.Application.Contracts. +- Interfaces must inherit from `IApplicationService`. +- Naming: `I*AppService`. +- Do NOT accept/return entities. Use DTOs and primitive parameters. + +### Method Naming & Shapes +- All service methods async and end with `Async`. +- Do not repeat entity names in method names (use `GetAsync`, not `GetProductAsync`). +- Standard CRUD: + - `GetAsync(Guid id)` returns a detailed DTO. + - `GetListAsync(QueryDto queryDto)` returns a list of detailed DTOs. + - `CreateAsync(CreateDto dto)` returns detailed DTO. + - `UpdateAsync(Guid id, UpdateDto dto)` returns detailed DTO (id MUST NOT be inside update DTO). + - `DeleteAsync(Guid id)` returns void/Task. +- `GetListAsync` query DTO: + - Filtering/sorting/paging fields optional with defaults. + - Enforce a maximum page size for performance. + +### DTO Usage +- Inputs: + - Do not include unused properties. + - Do NOT share input DTOs between methods. + - Do NOT use inheritance between input DTOs (except rare abstract base DTO cases; be very cautious). + +### Implementation +- Application layer must be independent of web. +- Implement interfaces in *.Application, name `ProductAppService` for `IProductAppService`. +- Inherit from `ApplicationService`. +- Make all public methods `virtual`. +- Avoid private helper methods; prefer `protected virtual` helpers for extensibility. +- Data access: + - Use dedicated repositories (e.g., `IProductRepository`). + - Do NOT use generic repositories. + - Do NOT put LINQ/SQL queries inside application service methods; repositories perform queries. +- Entity mutation: + - Load required entities from repositories. + - Mutate using domain methods. + - Call repository `UpdateAsync` after updates (do not assume change tracking). +- Extra properties: + - Use `MapExtraPropertiesTo` or configure object mapper for `MapExtraProperties`. +- Files: + - Do NOT use web types like `IFormFile` or `Stream` in application services. + - Controllers handle upload; pass `byte[]` (or similar) to application services. +- Cross-application-service calls: + - Do NOT call other application services within the same module. + - For reuse, push logic into domain layer or extract shared helpers carefully. + - You MAY call other modules’ application services only via their Application.Contracts. + +## DTO Conventions +- Define DTOs in *.Application.Contracts. +- Prefer ABP base DTO types (`EntityDto`, audited DTOs). +- For aggregate roots, prefer extensible DTO base types so extra properties can map. +- DTO properties: public getters/setters. +- Input DTO validation: + - Use data annotations. + - Reuse constants from Domain.Shared wherever possible. +- Avoid logic in DTOs; only implement `IValidatableObject` when necessary. +- Do NOT use `[Serializable]` attribute (BinaryFormatter is obsolete); ABP uses JSON serialization. +- Output DTO strategy: + - Prefer a Basic DTO and a Detailed DTO; avoid many variants. + - Detailed DTOs: include reference details as nested basic DTOs; avoid duplicating raw FK ids unnecessarily. + +## EF Core Integration +- Define a separate DbContext interface + class per module. +- Do NOT rely on lazy loading; do NOT enable lazy loading. +- DbContext interface: + - Inherit from `IEfCoreDbContext`. + - Add `[ConnectionStringName("...")]`. + - Expose `DbSet` ONLY for aggregate roots. + - Do NOT include setters in the interface. +- DbContext class: + - Inherit `AbpDbContext`. + - Add `[ConnectionStringName("...")]` and implement the interface. +- Table prefix/schema: + - Provide static `TablePrefix` and `Schema` defaulted from constants. + - Use short prefixes; `Abp` prefix reserved for ABP core modules. + - Default schema should be `null`. +- Model mapping: + - Do NOT configure entities directly inside `OnModelCreating`. + - Create `ModelBuilder` extension method `ConfigureX()` and call it. + - Call `b.ConfigureByConvention()` for each entity. +- Repository implementations: + - Inherit from `EfCoreRepository`. + - Use DbContext interface as generic parameter. + - Pass cancellation tokens using `GetCancellationToken(cancellationToken)`. + - Implement `IncludeDetails(include)` extension per aggregate root with sub-collections. + - Override `WithDetailsAsync()` where needed. + +## MongoDB Integration +- Define a separate MongoDbContext interface + class per module. +- MongoDbContext interface: + - Inherit from `IAbpMongoDbContext`. + - Add `[ConnectionStringName("...")]`. + - Expose `IMongoCollection` ONLY for aggregate roots. +- MongoDbContext class: + - Inherit `AbpMongoDbContext` and implement the interface. +- Collection prefix: + - Provide static `CollectionPrefix` defaulted from constants. + - Use short prefixes; `Abp` prefix reserved for ABP core modules. +- Mapping: + - Do NOT configure directly inside `CreateModel`. + - Create `IMongoModelBuilder` extension method `ConfigureX()` and call it. +- Repository implementations: + - Inherit from `MongoDbRepository`. + - Pass cancellation tokens using `GetCancellationToken(cancellationToken)`. + - Ignore `includeDetails` for MongoDB in most cases (documents load sub-collections). + - Prefer `GetQueryableAsync()` to ensure ABP data filters are applied. + +## ABP Module Classes +- Every package must have exactly one `AbpModule` class. +- Naming: `Abp[ModuleName][Layer]Module` (e.g., `AbpIdentityDomainModule`, `AbpIdentityApplicationModule`). +- Use `[DependsOn(typeof(...))]` to declare module dependencies explicitly. +- Override `ConfigureServices` for DI registration and configuration. +- Override `OnApplicationInitialization` sparingly; prefer `ConfigureServices` when possible. +- Each module must be usable standalone; avoid hidden cross-module coupling. + +## Framework Extensibility +- All public and protected members should be `virtual` for inheritance-based extensibility. +- Prefer `protected virtual` over `private` for helper methods to allow overriding. +- Use `[Dependency(ReplaceServices = true)]` patterns for services intended to be replaceable. +- Provide extension points via interfaces and virtual methods. +- Document extension points with XML comments explaining intended usage. +- Consider providing `*Options` classes for configuration-based extensibility. + +## Backward Compatibility +- Do NOT remove or rename public API members without a deprecation cycle. +- Use `[Obsolete("Message. Use X instead.")]` with clear migration guidance before removal. +- Maintain binary and source compatibility within major versions. +- Add new optional parameters with defaults; do not change existing method signatures. +- When adding new abstract members to base classes, provide default implementations if possible. +- Prefer adding new interfaces over modifying existing ones. + +## Localization Resources +- Define localization resources in Domain.Shared. +- Resource class naming: `[ModuleName]Resource` (e.g., `IdentityResource`, `PermissionManagementResource`). +- JSON files under `/Localization/[ModuleName]/` directory. +- Use `LocalizableString.Create("Key")` for localizable exceptions and messages. +- All user-facing strings must be localized; no hardcoded English text in code. +- Error codes should be namespaced: `ModuleName:ErrorCode` (e.g., `Identity:UserNameAlreadyExists`). + +## Settings & Features +- Define settings in `*SettingDefinitionProvider` in Domain.Shared or Domain. +- Setting names must follow `Abp.[ModuleName].[SettingName]` convention. +- Define features in `*FeatureDefinitionProvider` in Domain.Shared. +- Feature names must follow `[ModuleName].[FeatureName]` convention. +- Use constants for setting/feature names; never hardcode strings. + +## Permissions +- Define permissions in `*PermissionDefinitionProvider` in Application.Contracts. +- Permission names must follow `[ModuleName].[Permission]` convention. +- Use constants for permission names (e.g., `IdentityPermissions.Users.Create`). +- Group related permissions logically. + +## Event Bus & Distributed Events +- Use `ILocalEventBus` for intra-module communication within the same process. +- Use `IDistributedEventBus` for cross-module or cross-service communication. +- Define Event Transfer Objects (ETOs) in Domain.Shared for distributed events. +- ETO naming: `[EntityName][Action]Eto` (e.g., `UserCreatedEto`, `OrderCompletedEto`). +- Event handlers belong in the Application layer. +- ETOs should be simple, serializable, and contain only primitive types or nested ETOs. + +## Testing +- Unit tests: `*.Tests` projects for isolated logic testing with mocked dependencies. +- Integration tests: `*.EntityFrameworkCore.Tests` / `*.MongoDB.Tests` for repository and DB tests. +- Use `AbpIntegratedTest` or `AbpApplicationTestBase` base classes. +- Test modules should use `[DependsOn]` on the module under test. +- Use `Shouldly` assertions (ABP convention). +- Test both EF Core and MongoDB implementations when the module supports both. +- Include tests for permission checks, validation, and edge cases. +- Name test methods: `MethodName_Scenario_ExpectedResult` or `Should_ExpectedBehavior_When_Condition`. + +## Contribution Discipline (PR / Issues / Tests) +- Before significant changes, align via GitHub issue/discussion. +- PRs: + - Keep changes scoped and reviewable. + - Add/update unit/integration tests relevant to the change. + - Build and run tests for the impacted area when possible. +- Localization: + - Prefer the `abp translate` workflow for adding missing translations (generate `abp-translation.json`, fill, apply, then PR). + +## Review Checklist +- Layer dependencies respected (no forbidden references). +- No `IQueryable` or generic repository usage leaking into application/domain. +- Entities maintain invariants; Guid id generation not inside constructors. +- Repositories follow async + CancellationToken + includeDetails conventions. +- No web types in application services. +- DTOs in contracts, serializable, validated, minimal, no logic. +- EF/Mongo integration follows context + mapping + repository patterns. +- Minimal diff; no unnecessary API surface expansion. diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000000..a754a2b5ea --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,372 @@ +# ABP Framework – GitHub Copilot Instructions + +> **Scope**: ABP Framework repository (abpframework/abp) — for developing ABP itself, not ABP-based applications. +> +> **Goal**: Enforce ABP module architecture best practices (DDD, layering, DB/ORM independence), maintain backward compatibility, ensure extensibility, and align with ABP contribution guidelines. + +--- + +## Global Defaults + +- Follow existing patterns in this repository first. Before generating new code, search for similar implementations and mirror their structure, naming, and conventions. +- Prefer minimal, focused diffs. Avoid drive-by refactors and formatting churn. +- Preserve public APIs. Avoid breaking changes unless explicitly requested and justified. +- Keep layers clean. Do not introduce forbidden dependencies between packages. + +--- + +## Module / Package Architecture (Layering) + +Use a layered module structure with explicit dependencies: + +| Layer | Purpose | Allowed Dependencies | +|-------|---------|---------------------| +| `*.Domain.Shared` | Constants, enums, shared types safe for all layers and 3rd-party clients. MUST NOT contain entities, repositories, domain services, or business objects. | None | +| `*.Domain` | Entities/aggregate roots, repository interfaces, domain services. | Domain.Shared | +| `*.Application.Contracts` | Application service interfaces and DTOs. | Domain.Shared | +| `*.Application` | Application service implementations. | Domain, Application.Contracts | +| `*.EntityFrameworkCore` / `*.MongoDb` | ORM integration packages. MUST NOT depend on other layers. | Domain only | +| `*.HttpApi` | REST controllers. MUST depend ONLY on Application.Contracts (NOT Application). | Application.Contracts | +| `*.HttpApi.Client` | Remote client proxies. MUST depend ONLY on Application.Contracts. | Application.Contracts | +| `*.Web` | UI layer. MUST depend ONLY on HttpApi. | HttpApi | + +### Dependency Direction +``` +Web -> HttpApi -> Application.Contracts +Application -> Domain + Application.Contracts +Domain -> Domain.Shared +ORM integration -> Domain +``` + +Do not leak web concerns into application/domain. + +--- + +## Domain Layer – Entities & Aggregate Roots + +- Define entities in the domain layer. +- Entities must be valid at creation: + - Provide a primary constructor that enforces invariants. + - Always include a `protected` parameterless constructor for ORMs. + - Always initialize sub-collections in the primary constructor. + - Do NOT generate Guid keys inside constructors; accept `id` and generate using `IGuidGenerator` from the calling code. +- Make members `virtual` where appropriate (ORM/proxy compatibility). +- Protect consistency: + - Use non-public setters (`private`/`protected`/`internal`) when needed. + - Provide meaningful domain methods for state transitions. + +### Aggregate Roots +- Always use a single `Id` property. Do NOT use composite keys. +- Prefer `Guid` keys for aggregate roots. +- Inherit from `AggregateRoot` or audited base classes as required. +- Keep aggregates small. Avoid large sub-collections unless necessary. + +### References +- Reference other aggregate roots by Id only. +- Do NOT add navigation properties to other aggregate roots. + +--- + +## Repositories + +- Define repository interfaces in the domain layer. +- Create one dedicated repository interface per aggregate root (e.g., `IProductRepository`). +- Public repository interfaces exposed by modules: + - SHOULD inherit from `IBasicRepository` (or `IReadOnlyRepository<...>` when suitable). + - SHOULD NOT expose `IQueryable` in the public contract. + - Internal implementations MAY use `IRepository` and `IQueryable` as needed. +- Do NOT define repositories for non-aggregate-root entities. + +### Method Conventions +- All methods async. +- Include optional `CancellationToken cancellationToken = default` in every method. +- For single-entity returning methods: include `bool includeDetails = true`. +- For list returning methods: include `bool includeDetails = false`. +- Do NOT return composite projection classes like `UserWithRoles`. Use `includeDetails` for eager-loading. +- Avoid projection-only view models from repositories by default; only allow when performance is critical. + +--- + +## Domain Services + +- Define domain services in the domain layer. +- Default: do NOT create interfaces for domain services unless necessary (mocking/multiple implementations). +- Naming: use `*Manager` suffix. + +### Method Guidelines +- Focus on operations that enforce domain invariants and business rules. +- Query methods are acceptable when they encapsulate domain-specific lookup logic (e.g., normalized lookups, caching, complex resolution). Simple queries belong in repositories. +- Define methods that mutate state and enforce domain rules. +- Use specific, intention-revealing names (avoid generic `UpdateXAsync`). +- Accept valid domain objects as parameters; do NOT accept/return DTOs. +- On rule violations, throw `BusinessException` (or custom business exceptions). +- Use unique, namespaced error codes suitable for localization (e.g., `IssueTracking:ConcurrentOpenIssueLimit`). +- Do NOT depend on authenticated user logic; pass required values from application layer. + +--- + +## Application Services + +### Contracts +- Define one interface per application service in `*.Application.Contracts`. +- Interfaces must inherit from `IApplicationService`. +- Naming: `I*AppService`. +- Do NOT accept/return entities. Use DTOs and primitive parameters. + +### Method Naming & Shapes +- All service methods async and end with `Async`. +- Do not repeat entity names in method names (use `GetAsync`, not `GetProductAsync`). + +**Standard CRUD:** +```csharp +Task GetAsync(Guid id); +Task> GetListAsync(GetProductListInput input); +Task CreateAsync(CreateProductInput input); +Task UpdateAsync(Guid id, UpdateProductInput input); // id NOT inside DTO +Task DeleteAsync(Guid id); +``` + +### DTO Usage (Inputs) +- Do not include unused properties. +- Do NOT share input DTOs between methods. +- Do NOT use inheritance between input DTOs (except rare abstract base DTO cases; be very cautious). + +### Implementation +- Application layer must be independent of web. +- Implement interfaces in `*.Application`, name `ProductAppService` for `IProductAppService`. +- Inherit from `ApplicationService`. +- Make all public methods `virtual`. +- Avoid private helper methods; prefer `protected virtual` helpers for extensibility. + +### Data Access +- Use dedicated repositories (e.g., `IProductRepository`). +- Do NOT put LINQ/SQL queries inside application service methods; repositories perform queries. + +### Entity Mutation +- Load required entities from repositories. +- Mutate using domain methods. +- Call repository `UpdateAsync` after updates (do not assume change tracking). + +### Files +- Do NOT use web types like `IFormFile` or `Stream` in application services. +- Controllers handle upload; pass `byte[]` (or similar) to application services. + +### Cross-Service Calls +- Do NOT call other application services within the same module. +- For reuse, push logic into domain layer or extract shared helpers carefully. +- You MAY call other modules' application services only via their Application.Contracts. + +--- + +## DTO Conventions + +- Define DTOs in `*.Application.Contracts`. +- Prefer ABP base DTO types (`EntityDto`, audited DTOs). +- For aggregate roots, prefer extensible DTO base types so extra properties can map. +- DTO properties: public getters/setters. + +### Input DTO Validation +- Use data annotations. +- Reuse constants from Domain.Shared wherever possible. + +### General Rules +- Avoid logic in DTOs; only implement `IValidatableObject` when necessary. +- Do NOT use `[Serializable]` attribute (BinaryFormatter is obsolete); ABP uses JSON serialization. + +### Output DTO Strategy +- Prefer a Basic DTO and a Detailed DTO; avoid many variants. +- Detailed DTOs: include reference details as nested basic DTOs; avoid duplicating raw FK ids unnecessarily. + +--- + +## EF Core Integration + +- Define a separate DbContext interface + class per module. +- Do NOT rely on lazy loading; do NOT enable lazy loading. + +### DbContext Interface +```csharp +[ConnectionStringName("ModuleName")] +public interface IModuleNameDbContext : IEfCoreDbContext +{ + DbSet Products { get; } // No setters, aggregate roots only +} +``` + +### DbContext Class +```csharp +[ConnectionStringName("ModuleName")] +public class ModuleNameDbContext : AbpDbContext, IModuleNameDbContext +{ + public static string TablePrefix { get; set; } = ModuleNameConsts.DefaultDbTablePrefix; + public static string? Schema { get; set; } = ModuleNameConsts.DefaultDbSchema; + + public DbSet Products { get; set; } +} +``` + +### Table Prefix/Schema +- Provide static `TablePrefix` and `Schema` defaulted from constants. +- Use short prefixes; `Abp` prefix reserved for ABP core modules. +- Default schema should be `null`. + +### Model Mapping +- Do NOT configure entities directly inside `OnModelCreating`. +- Create `ModelBuilder` extension method `ConfigureX()` and call it. +- Call `b.ConfigureByConvention()` for each entity. + +### Repository Implementations +- Inherit from `EfCoreRepository`. +- Use DbContext interface as generic parameter. +- Pass cancellation tokens using `GetCancellationToken(cancellationToken)`. +- Implement `IncludeDetails(include)` extension per aggregate root with sub-collections. +- Override `WithDetailsAsync()` where needed. + +--- + +## MongoDB Integration + +- Define a separate MongoDbContext interface + class per module. + +### MongoDbContext Interface +```csharp +[ConnectionStringName("ModuleName")] +public interface IModuleNameMongoDbContext : IAbpMongoDbContext +{ + IMongoCollection Products { get; } // Aggregate roots only +} +``` + +### MongoDbContext Class +```csharp +public class ModuleNameMongoDbContext : AbpMongoDbContext, IModuleNameMongoDbContext +{ + public static string CollectionPrefix { get; set; } = ModuleNameConsts.DefaultDbTablePrefix; +} +``` + +### Mapping +- Do NOT configure directly inside `CreateModel`. +- Create `IMongoModelBuilder` extension method `ConfigureX()` and call it. + +### Repository Implementations +- Inherit from `MongoDbRepository`. +- Pass cancellation tokens using `GetCancellationToken(cancellationToken)`. +- Ignore `includeDetails` for MongoDB in most cases (documents load sub-collections). +- Prefer `GetQueryableAsync()` to ensure ABP data filters are applied. + +--- + +## ABP Module Classes + +- Every package must have exactly one `AbpModule` class. +- Naming: `Abp[ModuleName][Layer]Module` (e.g., `AbpIdentityDomainModule`, `AbpIdentityApplicationModule`). +- Use `[DependsOn(typeof(...))]` to declare module dependencies explicitly. +- Override `ConfigureServices` for DI registration and configuration. +- Override `OnApplicationInitialization` sparingly; prefer `ConfigureServices` when possible. +- Each module must be usable standalone; avoid hidden cross-module coupling. + +--- + +## Framework Extensibility + +- All public and protected members should be `virtual` for inheritance-based extensibility. +- Prefer `protected virtual` over `private` for helper methods to allow overriding. +- Use `[Dependency(ReplaceServices = true)]` patterns for services intended to be replaceable. +- Provide extension points via interfaces and virtual methods. +- Document extension points with XML comments explaining intended usage. +- Consider providing `*Options` classes for configuration-based extensibility. + +--- + +## Backward Compatibility + +- Do NOT remove or rename public API members without a deprecation cycle. +- Use `[Obsolete("Message. Use X instead.")]` with clear migration guidance before removal. +- Maintain binary and source compatibility within major versions. +- Add new optional parameters with defaults; do not change existing method signatures. +- When adding new abstract members to base classes, provide default implementations if possible. +- Prefer adding new interfaces over modifying existing ones. + +--- + +## Localization Resources + +- Define localization resources in Domain.Shared. +- Resource class naming: `[ModuleName]Resource` (e.g., `IdentityResource`, `PermissionManagementResource`). +- JSON files under `/Localization/[ModuleName]/` directory. +- Use `LocalizableString.Create("Key")` for localizable exceptions and messages. +- All user-facing strings must be localized; no hardcoded English text in code. +- Error codes should be namespaced: `ModuleName:ErrorCode` (e.g., `Identity:UserNameAlreadyExists`). + +--- + +## Settings & Features + +- Define settings in `*SettingDefinitionProvider` in Domain.Shared or Domain. +- Setting names must follow `Abp.[ModuleName].[SettingName]` convention. +- Define features in `*FeatureDefinitionProvider` in Domain.Shared. +- Feature names must follow `[ModuleName].[FeatureName]` convention. +- Use constants for setting/feature names; never hardcode strings. + +--- + +## Permissions + +- Define permissions in `*PermissionDefinitionProvider` in Application.Contracts. +- Permission names must follow `[ModuleName].[Permission]` convention. +- Use constants for permission names (e.g., `IdentityPermissions.Users.Create`). +- Group related permissions logically. + +--- + +## Event Bus & Distributed Events + +- Use `ILocalEventBus` for intra-module communication within the same process. +- Use `IDistributedEventBus` for cross-module or cross-service communication. +- Define Event Transfer Objects (ETOs) in Domain.Shared for distributed events. +- ETO naming: `[EntityName][Action]Eto` (e.g., `UserCreatedEto`, `OrderCompletedEto`). +- Event handlers belong in the Application layer. +- ETOs should be simple, serializable, and contain only primitive types or nested ETOs. + +--- + +## Testing + +- Unit tests: `*.Tests` projects for isolated logic testing with mocked dependencies. +- Integration tests: `*.EntityFrameworkCore.Tests` / `*.MongoDB.Tests` for repository and DB tests. +- Use `AbpIntegratedTest` or `AbpApplicationTestBase` base classes. +- Test modules should use `[DependsOn]` on the module under test. +- Use `Shouldly` assertions (ABP convention). +- Test both EF Core and MongoDB implementations when the module supports both. +- Include tests for permission checks, validation, and edge cases. +- Name test methods: `MethodName_Scenario_ExpectedResult` or `Should_ExpectedBehavior_When_Condition`. + +--- + +## Contribution Discipline (PR / Issues / Tests) + +- Before significant changes, align via GitHub issue/discussion. + +### PRs +- Keep changes scoped and reviewable. +- Add/update unit/integration tests relevant to the change. +- Build and run tests for the impacted area when possible. + +### Localization +- Prefer the `abp translate` workflow for adding missing translations (generate `abp-translation.json`, fill, apply, then PR). + +--- + +## Review Checklist + +- [ ] Layer dependencies respected (no forbidden references). +- [ ] No `IQueryable` leaking into public repository contracts. +- [ ] Entities maintain invariants; Guid id generation not inside constructors. +- [ ] Repositories follow async + CancellationToken + includeDetails conventions. +- [ ] No web types in application services. +- [ ] DTOs in contracts, validated, minimal, no logic. +- [ ] EF/Mongo integration follows context + mapping + repository patterns. +- [ ] Public members are `virtual` for extensibility. +- [ ] Backward compatibility maintained; no breaking changes without deprecation. +- [ ] Minimal diff; no unnecessary API surface expansion. diff --git a/.github/scripts/test_update_dependency_changes.py b/.github/scripts/test_update_dependency_changes.py new file mode 100644 index 0000000000..f8cf0100f3 --- /dev/null +++ b/.github/scripts/test_update_dependency_changes.py @@ -0,0 +1,406 @@ +#!/usr/bin/env python3 +""" +Comprehensive test suite for update_dependency_changes.py + +Tests cover: +- Basic update/add/remove scenarios +- Version revert scenarios +- Complex multi-step change sequences +- Edge cases and duplicate operations +- Document format validation +""" + +import sys +import os +sys.path.insert(0, os.path.dirname(__file__)) + +from update_dependency_changes import merge_changes, render_section + + +def test_update_then_revert(): + """Test: PR1 updates A->B, PR2 reverts B->A. Should be removed.""" + print("Test 1: Update then revert") + existing = ( + {"PackageA": ("1.0.0", "2.0.0", "#1")}, # updated + {}, # added + {} # removed + ) + new = ( + {"PackageA": ("2.0.0", "1.0.0", "#2")}, # updated back + {}, + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageA" not in updated, f"Expected PackageA removed, got: {updated}" + assert len(added) == 0 and len(removed) == 0 + print("✓ Passed: Package correctly removed from updates\n") + + +def test_add_then_remove_same_version(): + """Test: PR1 adds v1.0, PR2 removes v1.0. Should be completely removed.""" + print("Test 2: Add then remove same version") + existing = ( + {}, + {"PackageB": ("1.0.0", "#1")}, # added + {} + ) + new = ( + {}, + {}, + {"PackageB": ("1.0.0", "#2")} # removed + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageB" not in added, f"Expected PackageB removed from added, got: {added}" + assert "PackageB" not in removed, f"Expected PackageB removed from removed, got: {removed}" + assert "PackageB" not in updated + print("✓ Passed: Package correctly removed from all sections\n") + + +def test_remove_then_add_same_version(): + """Test: PR1 removes v1.0, PR2 adds v1.0. Should be removed.""" + print("Test 3: Remove then add same version") + existing = ( + {}, + {}, + {"PackageC": ("1.0.0", "#1")} # removed + ) + new = ( + {}, + {"PackageC": ("1.0.0", "#2")}, # added back + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageC" not in updated, f"Expected PackageC removed from updated, got: {updated}" + assert "PackageC" not in added, f"Expected PackageC removed from added, got: {added}" + assert "PackageC" not in removed, f"Expected PackageC removed from removed, got: {removed}" + print("✓ Passed: Package correctly removed from all sections\n") + + +def test_add_then_remove_different_version(): + """Test: PR1 adds v1.0, PR2 removes v2.0. Should show as removed v2.0.""" + print("Test 4: Add then remove different version") + existing = ( + {}, + {"PackageD": ("1.0.0", "#1")}, # added + {} + ) + new = ( + {}, + {}, + {"PackageD": ("2.0.0", "#2")} # removed different version + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageD" not in added, f"Expected PackageD removed from added, got: {added}" + assert "PackageD" in removed, f"Expected PackageD in removed, got: {removed}" + assert removed["PackageD"][0] == "2.0.0", f"Expected version 2.0.0, got: {removed['PackageD']}" + print(f"✓ Passed: Package correctly tracked as removed with version {removed['PackageD'][0]}\n") + + +def test_update_in_added(): + """Test: PR1 adds v1.0, PR2 updates to v2.0. Should show as updated 1.0->2.0.""" + print("Test 5: Update a package that was added") + existing = ( + {}, + {"PackageE": ("1.0.0", "#1")}, # added + {} + ) + new = ( + {"PackageE": ("1.0.0", "2.0.0", "#2")}, # updated + {}, + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageE" not in added, f"Expected PackageE removed from added, got: {added}" + assert "PackageE" in updated, f"Expected PackageE in updated, got: {updated}" + assert updated["PackageE"] == ("1.0.0", "2.0.0", "#1, #2"), \ + f"Expected ('1.0.0', '2.0.0', '#1, #2'), got: {updated['PackageE']}" + print(f"✓ Passed: Package correctly converted to updated: {updated['PackageE']}\n") + + +def test_multiple_updates(): + """Test: PR1 updates A->B, PR2 updates B->C. Should show A->C.""" + print("Test 6: Multiple updates") + existing = ( + {"PackageF": ("1.0.0", "2.0.0", "#1")}, # updated + {}, + {} + ) + new = ( + {"PackageF": ("2.0.0", "3.0.0", "#2")}, # updated again + {}, + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageF" in updated + assert updated["PackageF"] == ("1.0.0", "3.0.0", "#1, #2"), \ + f"Expected ('1.0.0', '3.0.0', '#1, #2'), got: {updated['PackageF']}" + print(f"✓ Passed: Package correctly shows full range: {updated['PackageF']}\n") + + +def test_multiple_updates_back_to_original(): + """Test: PR1 updates 1->2, PR2 updates 2->3, PR3 updates 3->1. Should be removed.""" + print("Test 7: Multiple updates ending back at original version") + # Simulate PR1 and PR2 already merged + existing = ( + {"PackageG": ("1.0.0", "3.0.0", "#1, #2")}, # updated through PR1 and PR2 + {}, + {} + ) + # PR3 changes back to 1.0.0 + new = ( + {"PackageG": ("3.0.0", "1.0.0", "#3")}, # updated back to original + {}, + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageG" not in updated, f"Expected PackageG removed, got: {updated}" + assert len(added) == 0 and len(removed) == 0 + print("✓ Passed: Package correctly removed (version returned to original)\n") + + +def test_update_remove_add_same_version(): + """Test: PR1 updates 1->2, PR2 updates 2->3, PR3 removes, PR4 adds v3. Should show updated 1->3.""" + print("Test 8: Update-Update-Remove-Add same version") + # After PR1, PR2, PR3 + existing = ( + {}, + {}, + {"PackageH": ("1.0.0", "#1, #2, #3")} # removed (original was 1.0.0) + ) + # PR4 adds back the same version that was removed + new = ( + {}, + {"PackageH": ("3.0.0", "#4")}, # added + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageH" in updated, f"Expected PackageH in updated, got: updated={updated}, added={added}, removed={removed}" + assert updated["PackageH"] == ("1.0.0", "3.0.0", "#1, #2, #3, #4"), \ + f"Expected ('1.0.0', '3.0.0', '#1, #2, #3, #4'), got: {updated['PackageH']}" + print(f"✓ Passed: Package correctly shows as updated: {updated['PackageH']}\n") + + +def test_update_remove_add_original_version(): + """Test: PR1 updates 1->2, PR2 updates 2->3, PR3 removes, PR4 adds v1. Should be removed.""" + print("Test 9: Update-Update-Remove-Add original version") + # After PR1, PR2, PR3 + existing = ( + {}, + {}, + {"PackageI": ("1.0.0", "#1, #2, #3")} # removed (original was 1.0.0) + ) + # PR4 adds back the original version + new = ( + {}, + {"PackageI": ("1.0.0", "#4")}, # added back to original + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageI" not in updated, f"Expected PackageI removed, got: updated={updated}" + assert "PackageI" not in added, f"Expected PackageI removed, got: added={added}" + assert "PackageI" not in removed, f"Expected PackageI removed, got: removed={removed}" + print("✓ Passed: Package correctly removed (added back to original version)\n") + + +def test_update_remove_add_different_version(): + """Test: PR1 updates 1->2, PR2 updates 2->3, PR3 removes, PR4 adds v4. Should show updated 1->4.""" + print("Test 10: Update-Update-Remove-Add different version") + # After PR1, PR2, PR3 + existing = ( + {}, + {}, + {"PackageJ": ("1.0.0", "#1, #2, #3")} # removed (original was 1.0.0) + ) + # PR4 adds a completely different version + new = ( + {}, + {"PackageJ": ("4.0.0", "#4")}, # added new version + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageJ" in updated, f"Expected PackageJ in updated, got: updated={updated}, added={added}, removed={removed}" + assert updated["PackageJ"] == ("1.0.0", "4.0.0", "#1, #2, #3, #4"), \ + f"Expected ('1.0.0', '4.0.0', '#1, #2, #3, #4'), got: {updated['PackageJ']}" + print(f"✓ Passed: Package correctly shows as updated: {updated['PackageJ']}\n") + + +def test_add_update_remove(): + """Test: PR1 adds v1, PR2 updates to v2, PR3 removes v2. Should be completely removed.""" + print("Test 11: Add-Update-Remove") + # After PR1 and PR2 + existing = ( + {"PackageK": ("1.0.0", "2.0.0", "#1, #2")}, # updated (was added in PR1, updated in PR2) + {}, + {} + ) + # PR3 removes v2 + new = ( + {}, + {}, + {"PackageK": ("2.0.0", "#3")} # removed + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageK" not in updated, f"Expected PackageK removed from updated, got: {updated}" + assert "PackageK" not in added, f"Expected PackageK removed from added, got: {added}" + assert "PackageK" in removed, f"Expected PackageK in removed, got: {removed}" + # The removed should track from the original first version + assert removed["PackageK"][0] == "1.0.0", f"Expected removed from 1.0.0, got: {removed['PackageK']}" + print(f"✓ Passed: Package correctly shows as removed from original: {removed['PackageK']}\n") + + +def test_add_remove_add_same_version(): + """Test: PR1 adds v1, PR2 removes v1, PR3 adds v1 again. Should show as added v1.""" + print("Test 12: Add-Remove-Add same version") + # After PR1 and PR2 (added then removed) + existing = ( + {}, + {}, + {} # Completely removed after PR2 + ) + # PR3 adds v1 again + new = ( + {}, + {"PackageL": ("1.0.0", "#3")}, # added + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageL" in added, f"Expected PackageL in added, got: added={added}" + assert added["PackageL"] == ("1.0.0", "#3"), f"Expected ('1.0.0', '#3'), got: {added['PackageL']}" + print(f"✓ Passed: Package correctly shows as added: {added['PackageL']}\n") + + +def test_update_remove_remove(): + """Test: PR1 updates 1->2, PR2 removes v2, PR3 tries to remove again. Should show removed from v1.""" + print("Test 13: Update-Remove (duplicate remove)") + # After PR1 and PR2 + existing = ( + {}, + {}, + {"PackageM": ("1.0.0", "#1, #2")} # removed (original was 1.0.0) + ) + # PR3 tries to remove again (edge case, might not happen in practice) + new = ( + {}, + {}, + {"PackageM": ("1.0.0", "#3")} # removed again + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageM" in removed, f"Expected PackageM in removed, got: {removed}" + # Should keep the original information + assert removed["PackageM"][0] == "1.0.0", f"Expected removed from 1.0.0, got: {removed['PackageM']}" + print(f"✓ Passed: Package correctly maintains removed state: {removed['PackageM']}\n") + + +def test_add_add(): + """Test: PR1 adds v1, PR2 adds v2 (version changed externally). Should show added v2.""" + print("Test 14: Add-Add (version changed between PRs)") + # After PR1 + existing = ( + {}, + {"PackageN": ("1.0.0", "#1")}, # added + {} + ) + # PR2 adds different version (edge case) + new = ( + {}, + {"PackageN": ("2.0.0", "#2")}, # added different version + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageN" in added, f"Expected PackageN in added, got: {added}" + assert added["PackageN"][0] == "2.0.0", f"Expected version 2.0.0, got: {added['PackageN']}" + print(f"✓ Passed: Package correctly shows latest added version: {added['PackageN']}\n") + + +def test_complex_chain_ending_in_original(): + """Test: Complex chain - Add v1, Update to v2, Remove, Add v2, Update to v1. Should be removed.""" + print("Test 15: Complex chain ending at nothing changed") + # After PR1 (add), PR2 (update), PR3 (remove), PR4 (add back) + existing = ( + {"PackageO": ("1.0.0", "2.0.0", "#1, #2, #3, #4")}, # Complex history + {}, + {} + ) + # PR5 updates back to v1 (original from perspective of first state) + new = ( + {"PackageO": ("2.0.0", "1.0.0", "#5")}, # back to start + {}, + {} + ) + updated, added, removed = merge_changes(existing, new) + assert "PackageO" not in updated, f"Expected PackageO removed, got: {updated}" + print(f"✓ Passed: Complex chain correctly removed when ending at original\n") + + +def test_document_format(): + """Test: Verify the document rendering format.""" + print("Test 16: Document format validation") + + updated = { + "Microsoft.Extensions.Logging": ("8.0.0", "8.0.1", "#123"), + "Newtonsoft.Json": ("13.0.1", "13.0.3", "#456, #789"), + } + + added = { + "Azure.Identity": ("1.10.0", "#567"), + } + + removed = { + "System.Text.Json": ("7.0.0", "#890"), + } + + document = render_section("9.0.0", updated, added, removed) + + # Verify document structure + assert "## 9.0.0" in document, "Version header missing" + assert "| Package | Old Version | New Version | PR |" in document, "Updated table header missing" + assert "Microsoft.Extensions.Logging" in document, "Updated package missing" + assert "**Added:**" in document, "Added section missing" + assert "Azure.Identity" in document, "Added package missing" + assert "**Removed:**" in document, "Removed section missing" + assert "System.Text.Json" in document, "Removed package missing" + + print("✓ Passed: Document format is correct") + print("\nSample output:") + print("-" * 60) + print(document) + print("-" * 60 + "\n") + + +def run_all_tests(): + """Run all test cases.""" + print("=" * 70) + print("Testing update_dependency_changes.py") + print("=" * 70 + "\n") + + test_update_then_revert() + test_add_then_remove_same_version() + test_remove_then_add_same_version() + test_add_then_remove_different_version() + test_update_in_added() + test_multiple_updates() + test_multiple_updates_back_to_original() + test_update_remove_add_same_version() + test_update_remove_add_original_version() + test_update_remove_add_different_version() + test_add_update_remove() + test_add_remove_add_same_version() + test_update_remove_remove() + test_add_add() + test_complex_chain_ending_in_original() + test_document_format() + + print("=" * 70) + print("All 16 tests passed! ✓") + print("=" * 70) + print("\nTest coverage summary:") + print(" ✓ Basic scenarios (update, add, remove)") + print(" ✓ Version revert handling") + print(" ✓ Complex multi-step sequences") + print(" ✓ Edge cases and duplicates") + print(" ✓ Document format validation") + print("=" * 70) + + +if __name__ == "__main__": + run_all_tests() diff --git a/.github/scripts/update_dependency_changes.py b/.github/scripts/update_dependency_changes.py new file mode 100644 index 0000000000..05e0019470 --- /dev/null +++ b/.github/scripts/update_dependency_changes.py @@ -0,0 +1,331 @@ +import subprocess +import re +import os +import sys +import xml.etree.ElementTree as ET + + +HEADER = "# Package Version Changes\n" +DOC_PATH = os.environ.get("DOC_PATH", "docs/en/package-version-changes.md") + + +def get_version(): + """Read the current version from common.props.""" + try: + tree = ET.parse("common.props") + root = tree.getroot() + version_elem = root.find(".//Version") + if version_elem is not None: + return version_elem.text + except FileNotFoundError: + print("Error: 'common.props' file not found.", file=sys.stderr) + except ET.ParseError as ex: + print(f"Error: Failed to parse 'common.props': {ex}", file=sys.stderr) + return None + + +def get_diff(base_ref): + """Get diff of Directory.Packages.props against the base branch.""" + result = subprocess.run( + ["git", "diff", f"origin/{base_ref}", "--", "Directory.Packages.props"], + capture_output=True, + text=True, + ) + if result.returncode != 0: + raise RuntimeError( + f"Failed to get diff for base ref 'origin/{base_ref}': {result.stderr}" + ) + return result.stdout + + +def get_existing_doc_from_base(base_ref): + """Read the existing document from the base branch.""" + result = subprocess.run( + ["git", "show", f"origin/{base_ref}:{DOC_PATH}"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return result.stdout + return "" + + +def parse_diff_packages(lines, prefix): + """Parse package versions from diff lines with the given prefix (+ or -).""" + packages = {} + # Use separate patterns to handle different attribute orders + include_pattern = re.compile(r'Include="([^"]+)"') + version_pattern = re.compile(r'Version="([^"]+)"') + for line in lines: + if line.startswith(prefix) and "PackageVersion" in line and not line.startswith(prefix * 3): + include_match = include_pattern.search(line) + version_match = version_pattern.search(line) + if include_match and version_match: + packages[include_match.group(1)] = version_match.group(1) + return packages + + +def classify_changes(old_packages, new_packages, pr_number): + """Classify diff into updated, added, and removed with PR attribution.""" + updated = {} + added = {} + removed = {} + + all_packages = sorted(set(list(old_packages.keys()) + list(new_packages.keys()))) + + for pkg in all_packages: + if pkg in old_packages and pkg in new_packages: + if old_packages[pkg] != new_packages[pkg]: + updated[pkg] = (old_packages[pkg], new_packages[pkg], pr_number) + elif pkg in new_packages: + added[pkg] = (new_packages[pkg], pr_number) + else: + removed[pkg] = (old_packages[pkg], pr_number) + + return updated, added, removed + + +def parse_existing_section(section_text): + """Parse an existing markdown section to extract package records with PR info.""" + updated = {} + added = {} + removed = {} + + mode = "updated" + for line in section_text.split("\n"): + if "**Added:**" in line: + mode = "added" + continue + if "**Removed:**" in line: + mode = "removed" + continue + if not line.startswith("|") or line.startswith("| Package") or line.startswith("|---"): + continue + + parts = [p.strip() for p in line.split("|")[1:-1]] + if mode == "updated" and len(parts) >= 3: + pr = parts[3] if len(parts) >= 4 else "" + updated[parts[0]] = (parts[1], parts[2], pr) + elif len(parts) >= 2: + pr = parts[2] if len(parts) >= 3 else "" + if mode == "added": + added[parts[0]] = (parts[1], pr) + else: + removed[parts[0]] = (parts[1], pr) + + return updated, added, removed + + +def merge_prs(existing_pr, new_pr): + """Merge PR numbers, avoiding duplicates.""" + if not existing_pr or not existing_pr.strip(): + return new_pr + if not new_pr or not new_pr.strip(): + return existing_pr + + # Parse existing PRs + existing_prs = [p.strip() for p in existing_pr.split(",") if p.strip()] + # Add new PR if not already present + if new_pr not in existing_prs: + existing_prs.append(new_pr) + return ", ".join(existing_prs) + + +def merge_changes(existing, new): + """Merge new changes into existing records for the same version.""" + ex_updated, ex_added, ex_removed = existing + new_updated, new_added, new_removed = new + + merged_updated = dict(ex_updated) + merged_added = dict(ex_added) + merged_removed = dict(ex_removed) + + for pkg, (old_ver, new_ver, pr) in new_updated.items(): + if pkg in merged_updated: + existing_old_ver, existing_new_ver, existing_pr = merged_updated[pkg] + merged_pr = merge_prs(existing_pr, pr) + merged_updated[pkg] = (existing_old_ver, new_ver, merged_pr) + elif pkg in merged_added: + existing_ver, existing_pr = merged_added[pkg] + merged_pr = merge_prs(existing_pr, pr) + # Convert added to updated since the version changed again + del merged_added[pkg] + merged_updated[pkg] = (existing_ver, new_ver, merged_pr) + else: + merged_updated[pkg] = (old_ver, new_ver, pr) + + for pkg, (ver, pr) in new_added.items(): + if pkg in merged_removed: + removed_ver, removed_pr = merged_removed.pop(pkg) + merged_pr = merge_prs(removed_pr, pr) + merged_updated[pkg] = (removed_ver, ver, merged_pr) + elif pkg in merged_added: + existing_ver, existing_pr = merged_added[pkg] + merged_pr = merge_prs(existing_pr, pr) + merged_added[pkg] = (ver, merged_pr) + else: + merged_added[pkg] = (ver, pr) + + for pkg, (ver, pr) in new_removed.items(): + if pkg in merged_added: + existing_ver, existing_pr = merged_added[pkg] + # Only delete if versions match (added then removed the same version) + if existing_ver == ver: + del merged_added[pkg] + else: + # Version changed between add and remove, convert to updated then removed + del merged_added[pkg] + merged_removed[pkg] = (ver, merge_prs(existing_pr, pr)) + elif pkg in merged_updated: + old_ver, new_ver, existing_pr = merged_updated.pop(pkg) + merged_pr = merge_prs(existing_pr, pr) + # Only keep as removed if the final state is different from original + merged_removed[pkg] = (old_ver, merged_pr) + else: + merged_removed[pkg] = (ver, pr) + + # Remove updated entries where old and new versions are the same + merged_updated = {k: v for k, v in merged_updated.items() if v[0] != v[1]} + + # Remove added entries that are also in removed with the same version + for pkg in list(merged_added.keys()): + if pkg in merged_removed: + added_ver, added_pr = merged_added[pkg] + removed_ver, removed_pr = merged_removed[pkg] + if added_ver == removed_ver: + # Package was added and removed at the same version, cancel out + del merged_added[pkg] + del merged_removed[pkg] + + return merged_updated, merged_added, merged_removed + + +def render_section(version, updated, added, removed): + """Render a version section as markdown.""" + lines = [f"## {version}\n"] + + if updated: + lines.append("| Package | Old Version | New Version | PR |") + lines.append("|---------|-------------|-------------|-----|") + for pkg in sorted(updated): + old_ver, new_ver, pr = updated[pkg] + lines.append(f"| {pkg} | {old_ver} | {new_ver} | {pr} |") + lines.append("") + + if added: + lines.append("**Added:**\n") + lines.append("| Package | Version | PR |") + lines.append("|---------|---------|-----|") + for pkg in sorted(added): + ver, pr = added[pkg] + lines.append(f"| {pkg} | {ver} | {pr} |") + lines.append("") + + if removed: + lines.append("**Removed:**\n") + lines.append("| Package | Version | PR |") + lines.append("|---------|---------|-----|") + for pkg in sorted(removed): + ver, pr = removed[pkg] + lines.append(f"| {pkg} | {ver} | {pr} |") + lines.append("") + + return "\n".join(lines) + + +def parse_document(content): + """Split document into a list of (version, section_text) tuples.""" + sections = [] + current_version = None + current_lines = [] + + for line in content.split("\n"): + match = re.match(r"^## (.+)$", line) + if match: + if current_version: + sections.append((current_version, "\n".join(current_lines))) + current_version = match.group(1).strip() + current_lines = [line] + elif current_version: + current_lines.append(line) + + if current_version: + sections.append((current_version, "\n".join(current_lines))) + + return sections + + +def main(): + if len(sys.argv) < 3: + print("Usage: update_dependency_changes.py ") + sys.exit(1) + + base_ref = sys.argv[1] + pr_arg = sys.argv[2] + + # Validate PR number is numeric + if not re.fullmatch(r"\d+", pr_arg): + print("Invalid PR number; must be numeric.") + sys.exit(1) + + # Validate base_ref doesn't contain dangerous characters + if not re.fullmatch(r"[a-zA-Z0-9/_.-]+", base_ref): + print("Invalid base ref; contains invalid characters.") + sys.exit(1) + + pr_number = f"#{pr_arg}" + + version = get_version() + if not version: + print("Could not read version from common.props.") + sys.exit(1) + + diff = get_diff(base_ref) + if not diff: + print("No diff found for Directory.Packages.props.") + sys.exit(0) + + diff_lines = diff.split("\n") + old_packages = parse_diff_packages(diff_lines, "-") + new_packages = parse_diff_packages(diff_lines, "+") + + new_updated, new_added, new_removed = classify_changes(old_packages, new_packages, pr_number) + + if not new_updated and not new_added and not new_removed: + print("No package version changes detected.") + sys.exit(0) + + # Load existing document from the base branch + existing_content = get_existing_doc_from_base(base_ref) + sections = parse_document(existing_content) if existing_content else [] + + # Find existing section for this version + version_index = None + for i, (v, _) in enumerate(sections): + if v == version: + version_index = i + break + + if version_index is not None: + existing = parse_existing_section(sections[version_index][1]) + merged = merge_changes(existing, (new_updated, new_added, new_removed)) + section_text = render_section(version, *merged) + sections[version_index] = (version, section_text) + else: + section_text = render_section(version, new_updated, new_added, new_removed) + sections.insert(0, (version, section_text)) + + # Write document + doc_dir = os.path.dirname(DOC_PATH) + if doc_dir: + os.makedirs(doc_dir, exist_ok=True) + with open(DOC_PATH, "w") as f: + f.write(HEADER + "\n") + for _, text in sections: + f.write(text.rstrip("\n") + "\n\n") + + print(f"Updated {DOC_PATH} for version {version}") + + +if __name__ == "__main__": + main() diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml index 4cb89fd21d..559bdb637e 100644 --- a/.github/workflows/auto-pr.yml +++ b/.github/workflows/auto-pr.yml @@ -26,7 +26,6 @@ jobs: branch: auto-merge/rel-10-1/${{github.run_number}} title: Merge branch dev with rel-10.1 body: This PR generated automatically to merge dev with rel-10.1. Please review the changed files before merging to prevent any errors that may occur. - reviewers: maliming draft: true token: ${{ github.token }} - name: Merge Pull Request diff --git a/.github/workflows/nuget-packages-version-change-detector.yml b/.github/workflows/nuget-packages-version-change-detector.yml new file mode 100644 index 0000000000..45dba3332b --- /dev/null +++ b/.github/workflows/nuget-packages-version-change-detector.yml @@ -0,0 +1,71 @@ +# Automatically detects and documents NuGet package version changes in PRs. +# Triggers on changes to Directory.Packages.props and: +# - Adds 'dependency-change' label to the PR +# - Updates docs/en/package-version-changes.md with version changes +# - Commits the documentation back to the PR branch +# Note: Only runs for PRs from the same repository (not forks) to ensure write permissions. +name: Nuget Packages Version Change Detector + +on: + pull_request: + paths: + - 'Directory.Packages.props' + types: + - opened + - synchronize + - reopened + - ready_for_review + +permissions: + contents: read + +concurrency: + group: dependency-changes-${{ github.event.pull_request.number }} + cancel-in-progress: false + +jobs: + label: + if: ${{ !github.event.pull_request.draft && !startsWith(github.head_ref, 'auto-merge/') && github.event.pull_request.head.repo.full_name == github.repository && !contains(github.event.head_commit.message, '[skip ci]') }} + permissions: + contents: write + pull-requests: write + runs-on: ubuntu-latest + env: + DOC_PATH: docs/en/package-version-changes.md + steps: + - run: gh pr edit "$PR_NUMBER" --add-label "dependency-change" + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + GH_TOKEN: ${{ secrets.MLM_Token }} + GH_REPO: ${{ github.repository }} + + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref }} + fetch-depth: 1 + + - name: Fetch base branch + run: git fetch origin ${{ github.event.pull_request.base.ref }}:refs/remotes/origin/${{ github.event.pull_request.base.ref }} --depth=1 + + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - run: python .github/scripts/update_dependency_changes.py ${{ github.event.pull_request.base.ref }} ${{ github.event.pull_request.number }} + + - name: Commit changes + run: | + set -e + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add "$DOC_PATH" + if git diff --staged --quiet; then + echo "No changes to commit." + else + git commit -m "docs: update package version changes [skip ci]" + if ! git push; then + echo "Error: Failed to push changes. This may be due to conflicts or permission issues." + exit 1 + fi + echo "Successfully committed and pushed documentation changes." + fi diff --git a/.github/workflows/update-studio-docs.yml b/.github/workflows/update-studio-docs.yml new file mode 100644 index 0000000000..541ceeaf30 --- /dev/null +++ b/.github/workflows/update-studio-docs.yml @@ -0,0 +1,658 @@ +name: Update ABP Studio Docs + +on: + repository_dispatch: + types: [update_studio_docs] + workflow_dispatch: + inputs: + version: + description: 'Studio version (e.g., 2.1.10)' + required: true + name: + description: 'Release name' + required: true + notes: + description: 'Raw release notes' + required: true + url: + description: 'Release URL' + required: true + target_branch: + description: 'Target branch (default: dev)' + required: false + default: 'dev' + +jobs: + update-docs: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + models: read + + steps: + # ------------------------------------------------- + # Extract payload (repository_dispatch or workflow_dispatch) + # ------------------------------------------------- + - name: Extract payload + id: payload + run: | + if [ "${{ github.event_name }}" = "repository_dispatch" ]; then + echo "version=${{ github.event.client_payload.version }}" >> $GITHUB_OUTPUT + echo "name=${{ github.event.client_payload.name }}" >> $GITHUB_OUTPUT + echo "url=${{ github.event.client_payload.url }}" >> $GITHUB_OUTPUT + echo "target_branch=${{ github.event.client_payload.target_branch || 'dev' }}" >> $GITHUB_OUTPUT + + # Save notes to environment variable (multiline) + { + echo "RAW_NOTES<> $GITHUB_ENV + else + echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT + echo "name=${{ github.event.inputs.name }}" >> $GITHUB_OUTPUT + echo "url=${{ github.event.inputs.url }}" >> $GITHUB_OUTPUT + echo "target_branch=${{ github.event.inputs.target_branch || 'dev' }}" >> $GITHUB_OUTPUT + + # Save notes to environment variable (multiline) + { + echo "RAW_NOTES<> $GITHUB_ENV + fi + + - name: Validate payload + env: + VERSION: ${{ steps.payload.outputs.version }} + NAME: ${{ steps.payload.outputs.name }} + URL: ${{ steps.payload.outputs.url }} + TARGET_BRANCH: ${{ steps.payload.outputs.target_branch }} + run: | + if [ -z "$VERSION" ] || [ "$VERSION" = "null" ]; then + echo "❌ Missing: version" + exit 1 + fi + if [ -z "$NAME" ] || [ "$NAME" = "null" ]; then + echo "❌ Missing: name" + exit 1 + fi + if [ -z "$URL" ] || [ "$URL" = "null" ]; then + echo "❌ Missing: url" + exit 1 + fi + if [ -z "$RAW_NOTES" ]; then + echo "❌ Missing: release notes" + exit 1 + fi + + echo "✅ Payload validated" + echo " Version: $VERSION" + echo " Name: $NAME" + echo " Target Branch: $TARGET_BRANCH" + + # ------------------------------------------------- + # Checkout target branch + # ------------------------------------------------- + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ steps.payload.outputs.target_branch }} + fetch-depth: 0 + + - name: Configure git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + # ------------------------------------------------- + # Create working branch + # ------------------------------------------------- + - name: Create branch + env: + VERSION: ${{ steps.payload.outputs.version }} + run: | + BRANCH="docs/studio-${VERSION}" + + # Delete remote branch if exists (idempotent) + git push origin --delete "$BRANCH" 2>/dev/null || true + + git checkout -B "$BRANCH" + echo "BRANCH=$BRANCH" >> $GITHUB_ENV + + # ------------------------------------------------- + # Analyze existing release notes format + # ------------------------------------------------- + - name: Analyze existing format + id: analyze + run: | + FILE="docs/en/studio/release-notes.md" + + if [ -f "$FILE" ] && [ -s "$FILE" ]; then + { + echo "EXISTING_FORMAT<> $GITHUB_OUTPUT + else + { + echo "EXISTING_FORMAT<> $GITHUB_OUTPUT + fi + + # ------------------------------------------------- + # Try AI formatting (OPTIONAL - never fails workflow) + # ------------------------------------------------- + - name: Format release notes with AI + id: ai + continue-on-error: true + uses: actions/ai-inference@v1 + with: + model: openai/gpt-4.1 + prompt: | + You are a technical writer for ABP Studio release notes. + + Existing release notes format: + ${{ steps.analyze.outputs.EXISTING_FORMAT }} + + New release: + Version: ${{ steps.payload.outputs.version }} + Name: ${{ steps.payload.outputs.name }} + Raw notes: + ${{ env.RAW_NOTES }} + + CRITICAL RULES: + 1. Extract ONLY essential, user-facing changes + 2. Format as bullet points starting with "- " + 3. Keep it concise and professional + 4. Match the style of existing release notes + 5. Skip internal/technical details unless critical + 6. Return ONLY the bullet points (no version header, no date) + 7. One change per line + + Output example: + - Fixed books sample for blazor-webapp tiered solution + - Enhanced Module Installation UI + - Added AI Management option to Startup Templates + + Return ONLY the formatted bullet points. + + # ------------------------------------------------- + # Fallback: Use raw notes if AI unavailable + # ------------------------------------------------- + - name: Prepare final release notes + run: | + mkdir -p .tmp + + AI_RESPONSE="${{ steps.ai.outputs.response }}" + + if [ -n "$AI_RESPONSE" ] && [ "$AI_RESPONSE" != "null" ]; then + echo "✅ Using AI-formatted release notes" + echo "$AI_RESPONSE" > .tmp/final-notes.txt + else + echo "⚠️ AI unavailable - using aggressive cleaning on raw release notes" + + # Clean and format raw notes with aggressive filtering + echo "$RAW_NOTES" | while IFS= read -r line; do + # Skip empty lines + [ -z "$line" ] && continue + + # Skip section headers + [[ "$line" =~ ^#+.*What.*Changed ]] && continue + [[ "$line" =~ ^##[[:space:]] ]] && continue + + # Skip full changelog links + [[ "$line" =~ ^\*\*Full\ Changelog ]] && continue + [[ "$line" =~ ^Full\ Changelog ]] && continue + + # Remove leading bullet/asterisk + line=$(echo "$line" | sed 's/^[[:space:]]*[*-][[:space:]]*//') + + # Aggressive cleaning: remove entire " by @user in https://..." suffix + line=$(echo "$line" | sed 's/[[:space:]]*by @[a-zA-Z0-9_-]*[[:space:]]*in https:\/\/github\.com\/[^[:space:]]*//g') + + # Remove remaining "by @username" or "by username" + line=$(echo "$line" | sed 's/[[:space:]]*by @[a-zA-Z0-9_-]*[[:space:]]*$//g') + line=$(echo "$line" | sed 's/[[:space:]]*by [a-zA-Z0-9_-]*[[:space:]]*$//g') + + # Remove standalone @mentions + line=$(echo "$line" | sed 's/@[a-zA-Z0-9_-]*//g') + + # Clean trailing periods if orphaned + line=$(echo "$line" | sed 's/\.[[:space:]]*$//') + + # Trim all whitespace + line=$(echo "$line" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + + # Skip if line is empty or too short + [ -z "$line" ] && continue + [ ${#line} -lt 5 ] && continue + + # Capitalize first letter if lowercase + line="$(echo ${line:0:1} | tr '[:lower:]' '[:upper:]')${line:1}" + + # Add clean bullet and output + echo "- $line" + done > .tmp/final-notes.txt + fi + + # Safety check: verify we have content + if [ ! -s .tmp/final-notes.txt ]; then + echo "⚠️ No valid release notes extracted, using minimal fallback" + echo "- Release ${{ steps.payload.outputs.version }}" > .tmp/final-notes.txt + fi + + echo "=== Final release notes ===" + cat .tmp/final-notes.txt + echo "===========================" + + # ------------------------------------------------- + # Update release-notes.md (move "Latest" tag correctly) + # ------------------------------------------------- + - name: Update release-notes.md + env: + VERSION: ${{ steps.payload.outputs.version }} + NAME: ${{ steps.payload.outputs.name }} + URL: ${{ steps.payload.outputs.url }} + run: | + FILE="docs/en/studio/release-notes.md" + DATE="$(date +%Y-%m-%d)" + + mkdir -p docs/en/studio + + # Check if version already exists (idempotent) + if [ -f "$FILE" ] && grep -q "^## $VERSION " "$FILE"; then + echo "⚠️ Version $VERSION already exists in release notes - skipping update" + echo "VERSION_UPDATED=false" >> $GITHUB_ENV + exit 0 + fi + + # Read final notes + NOTES_CONTENT="$(cat .tmp/final-notes.txt)" + + # Create new entry + NEW_ENTRY="## $VERSION ($DATE) Latest + + $NOTES_CONTENT + " + + # Process file + if [ ! -f "$FILE" ]; then + # Create new file + cat > "$FILE" < "$FILE.new" + + mv "$FILE.new" "$FILE" + fi + + echo "VERSION_UPDATED=true" >> $GITHUB_ENV + + echo "=== Updated release-notes.md preview ===" + head -30 "$FILE" + echo "========================================" + + # ------------------------------------------------- + # Fetch latest stable ABP version (no preview/rc/beta) + # ------------------------------------------------- + - name: Fetch latest stable ABP version + id: abp + run: | + # Fetch all releases + RELEASES=$(curl -fsS \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ + "https://api.github.com/repos/abpframework/abp/releases?per_page=20") + + # Filter stable releases (exclude preview, rc, beta, dev) + ABP_VERSION=$(echo "$RELEASES" | jq -r ' + [.[] | select( + (.prerelease == false) and + (.tag_name | test("preview|rc|beta|dev"; "i") | not) + )] | first | .tag_name + ') + + if [ -z "$ABP_VERSION" ] || [ "$ABP_VERSION" = "null" ]; then + echo "❌ Could not determine latest stable ABP version" + exit 1 + fi + + echo "✅ Latest stable ABP version: $ABP_VERSION" + echo "ABP_VERSION=$ABP_VERSION" >> $GITHUB_ENV + + # ------------------------------------------------- + # Update version-mapping.md (smart range expansion) + # ------------------------------------------------- + - name: Update version-mapping.md + env: + STUDIO_VERSION: ${{ steps.payload.outputs.version }} + run: | + FILE="docs/en/studio/version-mapping.md" + ABP_VERSION="${{ env.ABP_VERSION }}" + + mkdir -p docs/en/studio + + # Create file if doesn't exist + if [ ! -f "$FILE" ]; then + cat > "$FILE" <> $GITHUB_ENV + exit 0 + fi + + # Use Python for smart version range handling + python3 <<'PYTHON_EOF' + import os + import re + from packaging.version import Version, InvalidVersion + + studio_ver = os.environ["STUDIO_VERSION"] + abp_ver = os.environ["ABP_VERSION"] + file_path = "docs/en/studio/version-mapping.md" + + try: + studio = Version(studio_ver) + except InvalidVersion: + print(f"❌ Invalid Studio version: {studio_ver}") + exit(1) + + with open(file_path, 'r') as f: + lines = f.readlines() + + # Find table start (skip SEO and headers) + table_start = 0 + table_end = 0 + for i, line in enumerate(lines): + if line.strip().startswith('|') and '**ABP Studio Version**' in line: + table_start = i + elif table_start > 0 and line.strip() and not line.strip().startswith('|'): + table_end = i + break + + if table_start == 0: + print("❌ Could not find version mapping table") + exit(1) + + # If no end found, table goes to end of file + if table_end == 0: + table_end = len(lines) + + # Extract sections + before_table = lines[:table_start] # Everything before table + table_header = lines[table_start:table_start+2] # Header + separator + data_rows = [l for l in lines[table_start+2:table_end] if l.strip().startswith('|')] # Data rows + after_table = lines[table_end:] # Everything after table + + new_rows = [] + handled = False + + def parse_version_range(version_str): + """Parse '2.1.5 - 2.1.9' or '2.1.5' into (start, end)""" + version_str = version_str.strip() + + if '–' in version_str or '-' in version_str: + # Handle both em-dash and hyphen + parts = re.split(r'\s*[–-]\s*', version_str) + if len(parts) == 2: + try: + return Version(parts[0].strip()), Version(parts[1].strip()) + except InvalidVersion: + return None, None + + try: + v = Version(version_str) + return v, v + except InvalidVersion: + return None, None + + def format_row(studio_range, abp_version): + """Format a table row with proper spacing""" + return f"| {studio_range:<22} | {abp_version:<27} |\n" + + # Process existing rows + for row in data_rows: + match = re.match(r'\|\s*(.+?)\s*\|\s*(.+?)\s*\|', row) + if not match: + continue + + existing_studio_range = match.group(1).strip() + existing_abp = match.group(2).strip() + + # Only consider rows with matching ABP version + if existing_abp != abp_ver: + new_rows.append(row) + continue + + start_ver, end_ver = parse_version_range(existing_studio_range) + + if start_ver is None or end_ver is None: + new_rows.append(row) + continue + + # Check if current studio version is in this range + if start_ver <= studio <= end_ver: + print(f"✅ Studio version {studio_ver} already covered in range {existing_studio_range}") + handled = True + new_rows.append(row) + + # Check if we should extend the range + elif end_ver < studio: + # Calculate if studio is the next logical version + # For patch versions: 2.1.9 -> 2.1.10 + # For minor versions: 2.1.9 -> 2.2.0 + + # Simple heuristic: if major.minor match and patch increments, extend range + if (start_ver.major == studio.major and + start_ver.minor == studio.minor and + studio.micro <= end_ver.micro + 5): # Allow small gaps + + new_range = f"{start_ver} - {studio}" + new_rows.append(format_row(new_range, abp_ver)) + print(f"✅ Extended range: {new_range}") + handled = True + else: + new_rows.append(row) + else: + new_rows.append(row) + + # If not handled, add new row at top of data + if not handled: + new_row = format_row(str(studio), abp_ver) + new_rows.insert(0, new_row) + print(f"✅ Added new mapping: {studio_ver} -> {abp_ver}") + + # Write updated file - preserve ALL content + with open(file_path, 'w') as f: + f.writelines(before_table) # SEO, title, intro text + f.writelines(table_header) # Table header + f.writelines(new_rows) # Updated data rows + f.writelines(after_table) # Content after table (preview section, etc.) + + print("MAPPING_UPDATED=true") + PYTHON_EOF + + echo "MAPPING_UPDATED=true" >> $GITHUB_ENV + + echo "=== Updated version-mapping.md preview ===" + head -35 "$FILE" + echo "==========================================" + + # ------------------------------------------------- + # Check for changes + # ------------------------------------------------- + - name: Check for changes + id: changes + run: | + git add docs/en/studio/ + + if git diff --cached --quiet; then + echo "has_changes=false" >> $GITHUB_OUTPUT + echo "⚠️ No changes detected" + else + echo "has_changes=true" >> $GITHUB_OUTPUT + echo "✅ Changes detected:" + git diff --cached --stat + fi + + # ------------------------------------------------- + # Commit & push + # ------------------------------------------------- + - name: Commit and push + if: steps.changes.outputs.has_changes == 'true' + env: + VERSION: ${{ steps.payload.outputs.version }} + NAME: ${{ steps.payload.outputs.name }} + run: | + git commit -m "docs(studio): update documentation for release $VERSION + + - Updated release notes for $VERSION + - Updated version mapping with ABP ${{ env.ABP_VERSION }} + + Release: $NAME" + + git push -f origin "$BRANCH" + + # ------------------------------------------------- + # Create or update PR + # ------------------------------------------------- + - name: Create or update PR + if: steps.changes.outputs.has_changes == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VERSION: ${{ steps.payload.outputs.version }} + NAME: ${{ steps.payload.outputs.name }} + URL: ${{ steps.payload.outputs.url }} + TARGET_BRANCH: ${{ steps.payload.outputs.target_branch }} + run: | + # Check for existing PR + EXISTING_PR=$(gh pr list \ + --head "$BRANCH" \ + --base "$TARGET_BRANCH" \ + --json number \ + --jq '.[0].number' 2>/dev/null || echo "") + + PR_BODY="Automated documentation update for ABP Studio release **$VERSION**. + + ## Release Information + - **Version**: $VERSION + - **Name**: $NAME + - **Release**: [View on GitHub]($URL) + - **ABP Framework Version**: ${{ env.ABP_VERSION }} + + ## Changes + - ✅ Updated [release-notes.md](docs/en/studio/release-notes.md) + - ✅ Updated [version-mapping.md](docs/en/studio/version-mapping.md) + + --- + + *This PR was automatically generated by the [update-studio-docs workflow](.github/workflows/update-studio-docs.yml)*" + + if [ -n "$EXISTING_PR" ]; then + echo "🔄 Updating existing PR #$EXISTING_PR" + + gh pr edit "$EXISTING_PR" \ + --title "docs(studio): release $VERSION - $NAME" \ + --body "$PR_BODY" + + echo "PR_NUMBER=$EXISTING_PR" >> $GITHUB_ENV + else + echo "📝 Creating new PR" + + sleep 2 # Wait for GitHub to sync + + PR_URL=$(gh pr create \ + --title "docs(studio): release $VERSION - $NAME" \ + --body "$PR_BODY" \ + --base "$TARGET_BRANCH" \ + --head "$BRANCH") + + PR_NUMBER=$(echo "$PR_URL" | grep -oE '[0-9]+$') + echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV + echo "✅ Created PR #$PR_NUMBER: $PR_URL" + fi + + # ------------------------------------------------- + # Enable auto-merge (safe with branch protection) + # ------------------------------------------------- + - name: Enable auto-merge + if: steps.changes.outputs.has_changes == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + continue-on-error: true + run: | + echo "🔄 Attempting to enable auto-merge for PR #$PR_NUMBER" + + gh pr merge "$PR_NUMBER" \ + --auto \ + --squash \ + --delete-branch || { + echo "⚠️ Auto-merge not available (branch protection or permissions)" + echo " PR #$PR_NUMBER is ready for manual review" + } + + # ------------------------------------------------- + # Summary + # ------------------------------------------------- + - name: Workflow summary + if: always() + env: + VERSION: ${{ steps.payload.outputs.version }} + run: | + echo "## 📚 ABP Studio Docs Update Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Version**: $VERSION" >> $GITHUB_STEP_SUMMARY + echo "**Release**: ${{ steps.payload.outputs.name }}" >> $GITHUB_STEP_SUMMARY + echo "**Target Branch**: ${{ steps.payload.outputs.target_branch }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + if [ "${{ steps.changes.outputs.has_changes }}" = "true" ]; then + echo "### ✅ Changes Applied" >> $GITHUB_STEP_SUMMARY + echo "- Release notes updated: ${{ env.VERSION_UPDATED }}" >> $GITHUB_STEP_SUMMARY + echo "- Version mapping updated: ${{ env.MAPPING_UPDATED }}" >> $GITHUB_STEP_SUMMARY + echo "- ABP Framework version: ${{ env.ABP_VERSION }}" >> $GITHUB_STEP_SUMMARY + echo "- PR: #${{ env.PR_NUMBER }}" >> $GITHUB_STEP_SUMMARY + else + echo "### ⚠️ No Changes" >> $GITHUB_STEP_SUMMARY + echo "Version $VERSION already exists in documentation." >> $GITHUB_STEP_SUMMARY + fi diff --git a/Directory.Packages.props b/Directory.Packages.props index bd5a55694f..e89f989794 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -89,8 +89,8 @@ - - + + @@ -122,7 +122,7 @@ - + diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/de.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/de.json index 6dc8e69ea3..5a05316e96 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/de.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/de.json @@ -261,7 +261,7 @@ "Enum:EntityChangeType:0": "Erstellt", "Enum:EntityChangeType:1": "Aktualisiert", "Enum:EntityChangeType:2": "Gelöscht", - "TenantId": "Mieter-ID", + "TenantId": "Mandanten-ID", "ChangeTime": "Zeit ändern", "EntityTypeFullName": "Vollständiger Name des Entitätstyps", "AuditLogsFor{0}Organization": "Audit-Logs für die Organisation \"{0}\"", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json index 210f46ff8b..4733b5f9ef 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json @@ -162,7 +162,7 @@ "WhatIsTheABPCommercial": "Was ist der ABP-Werbespot?", "WhatAreDifferencesThanAbpFramework": "Was sind die Unterschiede zwischen dem Open Source ABP Framework und dem ABP Commercial?", "ABPCommercialExplanation": "ABP Commercial ist eine Reihe von Premium-Modulen, Tools, Themen und Diensten, die auf dem Open-Source-ABP-Framework aufbauen. ABP Commercial wird von demselben Team entwickelt und unterstützt, das hinter dem ABP-Framework steht.", - "WhatAreDifferencesThanABPFrameworkExplanation": "

ABP-Framework ist ein modulares, thematisches, Microservice-kompatibles Anwendungsentwicklungsframework für ASP.NET Core. Es bietet eine vollständige Architektur und eine starke Infrastruktur, damit Sie sich auf Ihren eigenen Geschäftscode konzentrieren können, anstatt sich für jedes neue Projekt zu wiederholen. Es basiert auf Best Practices für die Softwareentwicklung und beliebten Tools, die Sie bereits kennen.

Das ABP-Framework ist völlig kostenlos, Open Source und wird von der Community betrieben. Es bietet auch ein kostenloses Thema und einige vorgefertigte Module (z. B. Identitätsmanagement und Mieterverwaltung).

", + "WhatAreDifferencesThanABPFrameworkExplanation": "

ABP-Framework ist ein modulares, thematisches, Microservice-kompatibles Anwendungsentwicklungsframework für ASP.NET Core. Es bietet eine vollständige Architektur und eine starke Infrastruktur, damit Sie sich auf Ihren eigenen Geschäftscode konzentrieren können, anstatt sich für jedes neue Projekt zu wiederholen. Es basiert auf Best Practices für die Softwareentwicklung und beliebten Tools, die Sie bereits kennen.

Das ABP-Framework ist völlig kostenlos, Open Source und wird von der Community betrieben. Es bietet auch ein kostenloses Thema und einige vorgefertigte Module (z. B. Identitätsmanagement und Mandanten-Verwaltung).

", "VisitTheFrameworkVSCommercialDocument": "Besuchen Sie den folgenden Link für weitere Informationen {1} ", "ABPCommercialFollowingBenefits": "ABP Commercial fügt dem ABP-Framework die folgenden Vorteile hinzu;", "Professional": "Fachmann", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/de.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/de.json index d125dbded4..f0f5aa1b89 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/de.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/de.json @@ -332,7 +332,7 @@ "ConnectionResolver": "Verbindungslöser", "TenantBasedDataFilter": "Mandantenbasierter Datenfilter", "ApplicationCode": "Anwendungscode", - "TenantResolution": "Mieterbeschluss", + "TenantResolution": "Mandanten-Ermittlung", "TenantUser": "Mandant {0} Benutzer", "CardTitle": "Kartentitel", "View": "Sicht", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 981500451a..945c39e78e 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -1229,6 +1229,7 @@ "Pricing_Page_HurryUp": "Hurry Up!", "Pricing_Page_BuyLicense": "Buy a license at 2021 prices until January 16!", "Pricing_Page_ValidForExistingCustomers": "Also valid for existing customers and license renewals.", + "Pricing_Page_AdditionalDevCost": "The cost of an additional developer seat for the {0} License is {1}.", "Pricing_Page_Hint1": "The license price includes a certain number of developer seats. If you have more developers, you can always purchase additional seats.", "Pricing_Page_Hint2": "You can purchase more developer licenses now or in the future. Licenses are seat-based, so you can transfer a seat from one developer to another.", "Pricing_Page_Hint3": "You can develop an unlimited count of different products with your license.", @@ -1434,6 +1435,8 @@ "Facebook": "Facebook", "Youtube": "YouTube", "Google": "Google", + "GoogleOrganic": "Google Organic", + "GoogleAds": "Google Ads", "Github": "GitHub", "Friend": " From a friend", "Other": "Other", diff --git a/ai-rules/common/application-layer.mdc b/ai-rules/common/application-layer.mdc index 7df134c590..8c5050d4bc 100644 --- a/ai-rules/common/application-layer.mdc +++ b/ai-rules/common/application-layer.mdc @@ -1,6 +1,10 @@ --- description: "ABP Application Services, DTOs, validation, and error handling patterns" -globs: "**/*.Application/**/*.cs,**/Application/**/*.cs,**/*AppService*.cs,**/*Dto*.cs" +globs: + - "**/*.Application/**/*.cs" + - "**/Application/**/*.cs" + - "**/*AppService*.cs" + - "**/*Dto*.cs" alwaysApply: false --- diff --git a/ai-rules/common/authorization.mdc b/ai-rules/common/authorization.mdc index b7885271c1..300cda28ee 100644 --- a/ai-rules/common/authorization.mdc +++ b/ai-rules/common/authorization.mdc @@ -1,6 +1,9 @@ --- description: "ABP permission system and authorization patterns" -globs: "**/*Permission*.cs,**/*AppService*.cs,**/*Controller*.cs" +globs: + - "**/*Permission*.cs" + - "**/*AppService*.cs" + - "**/*Controller*.cs" alwaysApply: false --- diff --git a/ai-rules/common/cli-commands.mdc b/ai-rules/common/cli-commands.mdc index 3e406898a1..4968e2ce9e 100644 --- a/ai-rules/common/cli-commands.mdc +++ b/ai-rules/common/cli-commands.mdc @@ -1,6 +1,8 @@ --- description: "ABP CLI commands: generate-proxy, install-libs, add-package-ref, new-module, install-module, update, clean, suite generate (CRUD pages)" -globs: "**/*.csproj,**/appsettings*.json" +globs: + - "**/*.csproj" + - "**/appsettings*.json" alwaysApply: false --- diff --git a/ai-rules/common/ddd-patterns.mdc b/ai-rules/common/ddd-patterns.mdc index 7eccbdbcbe..0e6220a4b6 100644 --- a/ai-rules/common/ddd-patterns.mdc +++ b/ai-rules/common/ddd-patterns.mdc @@ -1,6 +1,9 @@ --- description: "ABP DDD patterns - Entities, Aggregate Roots, Repositories, Domain Services" -globs: "**/*.Domain/**/*.cs,**/Domain/**/*.cs,**/Entities/**/*.cs" +globs: + - "**/*.Domain/**/*.cs" + - "**/Domain/**/*.cs" + - "**/Entities/**/*.cs" alwaysApply: false --- diff --git a/ai-rules/common/dependency-rules.mdc b/ai-rules/common/dependency-rules.mdc index 3210b7436a..32b95d10d4 100644 --- a/ai-rules/common/dependency-rules.mdc +++ b/ai-rules/common/dependency-rules.mdc @@ -1,6 +1,8 @@ --- description: "ABP layer dependency rules and project structure guardrails" -globs: "**/*.csproj,**/*Module*.cs" +globs: + - "**/*.csproj" + - "**/*Module*.cs" alwaysApply: false --- diff --git a/ai-rules/common/development-flow.mdc b/ai-rules/common/development-flow.mdc index 22ee69687a..692d0e72a6 100644 --- a/ai-rules/common/development-flow.mdc +++ b/ai-rules/common/development-flow.mdc @@ -1,6 +1,14 @@ --- description: "ABP development workflow - adding features, entities, and migrations" -globs: "**/*AppService*.cs,**/*Application*/**/*.cs,**/*Application.Contracts*/**/*.cs,**/*Dto*.cs,**/*DbContext*.cs,**/*.EntityFrameworkCore/**/*.cs,**/*.MongoDB/**/*.cs,**/*Permission*.cs" +globs: + - "**/*AppService*.cs" + - "**/*Application*/**/*.cs" + - "**/*Application.Contracts*/**/*.cs" + - "**/*Dto*.cs" + - "**/*DbContext*.cs" + - "**/*.EntityFrameworkCore/**/*.cs" + - "**/*.MongoDB/**/*.cs" + - "**/*Permission*.cs" alwaysApply: false --- diff --git a/ai-rules/common/infrastructure.mdc b/ai-rules/common/infrastructure.mdc index 1a2c555581..81d3cb7a20 100644 --- a/ai-rules/common/infrastructure.mdc +++ b/ai-rules/common/infrastructure.mdc @@ -1,6 +1,11 @@ --- description: "ABP infrastructure services - Settings, Features, Caching, Events, Background Jobs" -globs: "**/*Setting*.cs,**/*Feature*.cs,**/*Cache*.cs,**/*Event*.cs,**/*Job*.cs" +globs: + - "**/*Setting*.cs" + - "**/*Feature*.cs" + - "**/*Cache*.cs" + - "**/*Event*.cs" + - "**/*Job*.cs" alwaysApply: false --- diff --git a/ai-rules/common/multi-tenancy.mdc b/ai-rules/common/multi-tenancy.mdc index 54574a1c31..2bf1e5fd32 100644 --- a/ai-rules/common/multi-tenancy.mdc +++ b/ai-rules/common/multi-tenancy.mdc @@ -1,6 +1,9 @@ --- description: "ABP Multi-Tenancy patterns - tenant-aware entities, data isolation, and tenant switching" -globs: "**/*Tenant*.cs,**/*MultiTenant*.cs,**/Entities/**/*.cs" +globs: + - "**/*Tenant*.cs" + - "**/*MultiTenant*.cs" + - "**/Entities/**/*.cs" alwaysApply: false --- diff --git a/ai-rules/data/ef-core.mdc b/ai-rules/data/ef-core.mdc index 6ca6a423d2..84d71596f6 100644 --- a/ai-rules/data/ef-core.mdc +++ b/ai-rules/data/ef-core.mdc @@ -1,6 +1,9 @@ --- description: "ABP Entity Framework Core patterns - DbContext, migrations, repositories" -globs: "**/*.EntityFrameworkCore/**/*.cs,**/EntityFrameworkCore/**/*.cs,**/*DbContext*.cs" +globs: + - "**/*.EntityFrameworkCore/**/*.cs" + - "**/EntityFrameworkCore/**/*.cs" + - "**/*DbContext*.cs" alwaysApply: false --- diff --git a/ai-rules/data/mongodb.mdc b/ai-rules/data/mongodb.mdc index 671d2052c4..10526a41ba 100644 --- a/ai-rules/data/mongodb.mdc +++ b/ai-rules/data/mongodb.mdc @@ -1,6 +1,9 @@ --- description: "ABP MongoDB patterns - MongoDbContext and repositories" -globs: "**/*.MongoDB/**/*.cs,**/MongoDB/**/*.cs,**/*MongoDb*.cs" +globs: + - "**/*.MongoDB/**/*.cs" + - "**/MongoDB/**/*.cs" + - "**/*MongoDb*.cs" alwaysApply: false --- diff --git a/ai-rules/template-specific/app-nolayers.mdc b/ai-rules/template-specific/app-nolayers.mdc index 4d9a00458f..5bcc3d39cf 100644 --- a/ai-rules/template-specific/app-nolayers.mdc +++ b/ai-rules/template-specific/app-nolayers.mdc @@ -1,6 +1,10 @@ --- description: "ABP Single-Layer (No-Layers) application template specific patterns" -globs: "**/src/*/*Module.cs,**/src/*/Entities/**/*.cs,**/src/*/Services/**/*.cs,**/src/*/Data/**/*.cs" +globs: + - "**/src/*/*Module.cs" + - "**/src/*/Entities/**/*.cs" + - "**/src/*/Services/**/*.cs" + - "**/src/*/Data/**/*.cs" alwaysApply: false --- diff --git a/ai-rules/testing/patterns.mdc b/ai-rules/testing/patterns.mdc index 07c9307448..a1c49a320a 100644 --- a/ai-rules/testing/patterns.mdc +++ b/ai-rules/testing/patterns.mdc @@ -1,6 +1,10 @@ --- description: "ABP testing patterns - unit tests and integration tests" -globs: "test/**/*.cs,tests/**/*.cs,**/*Tests*/**/*.cs,**/*Test*.cs" +globs: + - "test/**/*.cs" + - "tests/**/*.cs" + - "**/*Tests*/**/*.cs" + - "**/*Test*.cs" alwaysApply: false --- diff --git a/ai-rules/ui/angular.mdc b/ai-rules/ui/angular.mdc index e61881fb28..eabbfce512 100644 --- a/ai-rules/ui/angular.mdc +++ b/ai-rules/ui/angular.mdc @@ -1,6 +1,9 @@ --- description: "ABP Angular UI patterns and best practices" -globs: "**/angular/**/*.ts,**/angular/**/*.html,**/*.component.ts" +globs: + - "**/angular/**/*.ts" + - "**/angular/**/*.html" + - "**/*.component.ts" alwaysApply: false --- diff --git a/ai-rules/ui/blazor.mdc b/ai-rules/ui/blazor.mdc index 68b8051109..d339744d65 100644 --- a/ai-rules/ui/blazor.mdc +++ b/ai-rules/ui/blazor.mdc @@ -1,6 +1,9 @@ --- description: "ABP Blazor UI patterns and components" -globs: "**/*.razor,**/Blazor/**/*.cs,**/*.Blazor*/**/*.cs" +globs: + - "**/*.razor" + - "**/Blazor/**/*.cs" + - "**/*.Blazor*/**/*.cs" alwaysApply: false --- diff --git a/ai-rules/ui/mvc.mdc b/ai-rules/ui/mvc.mdc index 1bc423010d..80525fab17 100644 --- a/ai-rules/ui/mvc.mdc +++ b/ai-rules/ui/mvc.mdc @@ -1,6 +1,10 @@ --- description: "ABP MVC and Razor Pages UI patterns" -globs: "**/*.cshtml,**/Pages/**/*.cs,**/Views/**/*.cs,**/Controllers/**/*.cs" +globs: + - "**/*.cshtml" + - "**/Pages/**/*.cs" + - "**/Views/**/*.cs" + - "**/Controllers/**/*.cs" alwaysApply: false --- diff --git a/common.props b/common.props index 9df5767555..2b274e5d75 100644 --- a/common.props +++ b/common.props @@ -1,8 +1,8 @@ latest - 10.1.0-rc.2 - 5.1.0-rc.2 + 10.2.0-preview + 5.2.0-preview $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ diff --git a/delete-bin-obj.ps1 b/delete-bin-obj.ps1 index 6a6741b767..e4a0fe9437 100644 --- a/delete-bin-obj.ps1 +++ b/delete-bin-obj.ps1 @@ -10,4 +10,3 @@ Get-ChildItem -Path . -Include bin,obj -Recurse -Directory | ForEach-Object { } Write-Host "BIN and OBJ folders have been successfully deleted." -ForegroundColor Green - diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/POST.md b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/POST.md new file mode 100644 index 0000000000..db18ecde7e --- /dev/null +++ b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/POST.md @@ -0,0 +1,342 @@ +# ABP Platform 10.1 RC Has Been Released + +We are happy to release [ABP](https://abp.io) version **10.1 RC** (Release Candidate). This blog post introduces the new features and important changes in this new version. + +Try this version and provide feedback for a more stable version of ABP v10.1! Thanks to you in advance. + +## Get Started with the 10.1 RC + +You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli). + +By default, ABP Studio uses stable versions to create solutions. Therefore, if you want to create a solution with a preview version, first you need to create a solution and then switch your solution to the preview version from the ABP Studio UI: + +![studio-switch-to-preview.png](studio-switch-to-preview.png) + +## Migration Guide + +There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v10.0 or earlier: [ABP Version 10.1 Migration Guide](https://abp.io/docs/10.1/release-info/migration-guides/abp-10-1). + +## What's New with ABP v10.1? + +In this section, I will introduce some major features released in this version. +Here is a brief list of titles explained in the next sections: + +- Resource-Based Authorization +- Introducing the TickerQ Background Worker Provider +- Angular UI: Improving Authentication Token Handling +- Angular Version Upgrade to v21 +- File Management Module: Public File Sharing Support +- Payment Module: Public Page Implementation for Blazor & Angular UIs +- AI Management Module: Blazor & Angular UIs +- Identity PRO Module: Password History Support +- Account PRO Module: Introducing WebAuthn Passkeys + +### Resource-Based Authorization + +ABP v10.1 introduces **Resource-Based Authorization**, a powerful feature that enables fine-grained access control based on specific resource instances. This enhancement addresses a long-requested feature ([#236](https://github.com/abpframework/abp/issues/236)) that allows you to implement authorization logic that depends on the resource being accessed, not just static roles or permissions. + +**What is Resource-Based Authorization?** + +Unlike traditional permission-based authorization where you check if a user has a general permission (like "CanEditDocuments"), resource-based authorization allows you to make authorization decisions based on the specific resource instance. For example: + +- Allow users to edit only their own blog posts +- Grant access to documents based on ownership or sharing settings +- Implement complex authorization rules that depend on resource properties + +![](ai-management-demo.gif) + +#### How It Works? + +**1. Define resource permissions (`AddResourcePermission`)**: + +```csharp +public class MyPermissionDefinitionProvider : PermissionDefinitionProvider +{ + public override void Define(IPermissionDefinitionContext context) + { + //other permissions... + + context.AddResourcePermission( + name: BookManagementPermissions.Manage.Resources.Consume, + resourceName: BookManagementPermissions.Manage.Resources.Name, + managementPermissionName: BookManagementPermissions.Manage.ManagePermissions, + L("LocalizedPermissionDisplayName") + ); + } +} +``` + +**2. Use `IResourcePermissionChecker.IsGrantedAsync` in your code to perform the resource permission check**: + +```csharp +protected IResourcePermissionChecker ResourcePermissionChecker { get; } + +public async Task MyService() +{ + if(await ResourcePermissionChecker.IsGrantedAsync( + BookManagementPermissions.Manage.Resources.Consume, + BookManagementPermissions.Manage.Resources.Name, + workspaceConfiguration.WorkspaceId!.Value.ToString())) + { + return; + } + + //... +} +``` + +**3. Use the relevant `ResourcePermissionManagementModel` in your UI:** + +> The following code block demonstrates its usage in the Blazor UI, but the same component is also implemented for MVC & Angular UIs (however, component name might be different, please refer to the documentation before using the component). + +```xml + + +@code { + ResourcePermissionManagementModal PermissionManagementModal { get; set; } = null!; + + private Task OpenResourcePermissionModel() + { + await PermissionManagementModal.OpenAsync( + resourceName: BookManagementPermissions.Manage.Resources.Name, + resourceKey: entity.Id.ToString(), + resourceDisplayName: entity.Name + ); + } +} +``` + +This feature integrates perfectly with ABP's existing authorization infrastructure and provides a standard way to implement complex, context-aware authorization scenarios in your applications. + +### Introducing the TickerQ Background Worker Provider + +ABP v10.1 now includes **[TickerQ](https://tickerq.net/)** as a new background job and background worker provider option. TickerQ is a fast, reflection-free background task scheduler for .NET — built with source generators, EF Core integration, cron + time-based execution, and a real-time dashboard. It offers reliable job execution with built-in retry mechanisms, persistent job storage, and efficient resource usage. + +To use TickerQ in your ABP-based solution, refer to the following documentation: + +- [TickerQ Background Job Integration](https://abp.io/docs/10.1/framework/infrastructure/background-jobs/tickerq) +- [TickerQ Background Worker Integration](https://abp.io/docs/10.1/framework/infrastructure/background-workers/tickerq) + +### Angular UI: Improving Authentication Token Handling + +ABP v10.1 brings significant improvements to **Angular authentication token handling**, making token refresh more reliable and providing better error handling for expired or invalid tokens. + +#### What's Improved? + +Prior to this version, access tokens issued by the auth-server were stored in localStorage, making them vulnerable to XSS attacks. We've made the following enhancements to improve safety and reduce security risks: + +- Store sensitive tokens in memory +- Use web-workers for state sharing between tabs + +These enhancements are automatically available in new Angular projects and can be applied to existing projects by updating ABP packages. + +> See [#23930](https://github.com/abpframework/abp/issues/23930) for more details. + +### Angular Version Upgrade to v21 + +ABP v10.1 **upgrades Angular to version 21**, bringing the latest improvements and features from the Angular ecosystem to your ABP applications. We've upgraded the relevant core Angular packages and 3rd party packages such as **angular-oauth2-oidc** and **ng-bootstrap**. We will also update the ABP Studio templates along with the stable v10.1 release. + +> See [#24384](https://github.com/abpframework/abp/issues/24384) for the complete change list. + +### File Management Module: Public File Sharing Support + +_This is a **PRO** feature available for ABP Commercial customers._ + +The **File Management Module** now supports **public file sharing** via shareable links, similar to popular cloud storage services like Google Drive or Dropbox. This feature enables you to generate public URLs for files that can be accessed without authentication. + +![](file-sharing.gif) + +**Example Share URL:** + +```text +https://abp.io/api/file-management/file-descriptor/share?shareToken=CfDJ8AK%2BOEpCD... +``` + +**Configuration:** + +You can configure the public share domain through options: + +```csharp +Configure(options => +{ + options.FileDownloadRootUrl = "https://files.yourdomain.com"; +}); +``` + +This feature is available for all supported UI types (MVC, Angular, Blazor) and integrates seamlessly with the existing [File Management Module](https://abp.io/docs/latest/modules/file-management). + +### Payment Module: Public Page Implementation for Blazor & Angular UIs + +The **Payment Module** now includes **public page implementations for Angular and Blazor UIs**, completing UI coverage across all ABP-supported frameworks. Previously, public payment pages (payment gateway selection, pre-payment, and post-payment pages) were only available for MVC/Razor Pages UI. With this version, both admin and public pages are now available for MVC, Angular, and Blazor UIs. + +The public payment pages seamlessly integrate with ABP's [Payment Module](https://abp.io/docs/latest/modules/payment) and support all configured payment gateways. The documentation will be updated soon with detailed integration guides and examples at [abp.io/docs/latest/modules/payment](https://abp.io/docs/latest/modules/payment). + +### AI Management Module: Blazor & Angular UIs + +With this version, Angular and Blazor UIs for the [AI Management module](https://abp.io/docs/latest/modules/ai-management) have been implemented, completing the cross-platform support for this powerful AI integration module. + +![AI Management Workspaces](ai-management-workspaces.png) + +The AI Management Module builds on top of [ABP's AI Infrastructure](https://abp.io/docs/latest/framework/infrastructure/artificial-intelligence) and provides: + +- **Multi-Provider Support**: Integrate with OpenAI, Google Gemini, Anthropic Claude, and more from a unified API +- **Workspace-Based Organization**: Organize AI capabilities into separate workspaces for different use cases +- **Built-In Chat Interface**: Ready-to-use chat UI for conversational AI +- **Chat Widget**: Drop-in chat widget component for customer support or AI assistance +- **Resource-Based Permissions**: Control access to specific AI workspaces for users, roles, or clients + +Learn more about the AI Management Module in the [announcement post](https://abp.io/community/announcements/introducing-the-ai-management-module-nz9404a9) and [official documentation](https://abp.io/docs/latest/modules/ai-management). + +### Identity PRO Module: Password History Support + +The [**Identity PRO Module**](https://abp.io/docs/latest/modules/identity-pro) now includes **Password History** support, preventing users from reusing previous passwords. This security feature helps enforce stronger password policies and meet compliance requirements for your organization. + +Administrators can enable password reuse prevention by toggling the related setting on the _Administration -> Settings -> Identity Management_ page: + +![Password History Settings](password-history-settings.png) + +When changing a password, the system checks the specified number of previous passwords and displays an error message if the new password matches any of them: + +![](set-password-error-modal.png) + +![](reset-password-error-modal.png) + +### Account PRO Module: Introducing WebAuthn Passkeys + +ABP v10.1 introduces **Passkey authentication**, enabling passwordless sign-in using modern biometric authentication methods. Built on the **WebAuthn standard (FIDO2)**, this feature allows users to authenticate using Face ID, Touch ID, Windows Hello, Android biometrics, security keys, or other platform authenticators. + +**What are Passkeys?** + +Passkeys are a modern, phishing-resistant authentication method that replaces traditional passwords: + +- **Passwordless**: No passwords to remember, type, or manage +- **Secure**: Uses public/private key cryptography stored on the user's device +- **Convenient**: Sign in with a fingerprint, face scan, or device PIN +- **Cross-Platform**: Can sync across devices depending on platform support (Apple, Google, Microsoft) + +**How It Works:** + +**1. Enable or disable the WebAuthn passkeys feature in the _Settings -> Account -> Passkeys_ page:** + +![Passkey Setting](passkey-setting.png) + +**2. Add your passkeys in the _Account/Manage_ page:** + +![My Passkeys](my-passkey.png) + +![Passkey registration](passkey-registration.png) + +**3. Use the _Passkey login_ option for passwordless authentication the next time you log in:** + +![Passkey Login](passkey-login.png) + +> For more information, refer to the [Web Authentication API (WebAuthn) passkeys](https://abp.io/docs/10.1/modules/account/passkey) documentation. + +## Community News + +### Special Offer: Level Up Your ABP Skills with 33% Off Live Trainings! + +![ABP Live Training Discount](./live-training-discount.png) + +We're excited to announce a special limited-time offer for developers looking to master the ABP Platform! Get **33% OFF** on all ABP live training sessions and accelerate your learning journey with hands-on guidance from ABP experts. + +**Why Join ABP Live Trainings?** + +Our live training sessions provide an immersive learning experience where you can: + +- **Learn from the Experts**: Get direct instruction from ABP team members and experienced trainers who know the platform inside and out. +- **Hands-On Practice**: Work through real-world scenarios and build actual applications during the sessions. +- **Interactive Q&A**: Ask questions in real-time and get immediate answers to your specific challenges. +- **Comprehensive Coverage**: From fundamentals to advanced topics, our trainings cover everything you need to build production-ready applications with ABP. +- **Certificate of Completion**: Receive a certificate upon completing the training to showcase your ABP expertise. + +Don't miss this opportunity to invest in your skills and career. Whether you're new to ABP or looking to advance your expertise, our live trainings provide the structured learning path you need to succeed. + +> 👉 [Learn more and claim your discount here](https://abp.io/community/announcements/improve-your-abp-skills-with-33-off-live-trainings-hjnw57xu) + +### Introducing the ABP Referral Program + +![ABP.IO Referral Program](./referral-program.png) + +We're thrilled to announce the launch of the **ABP.IO Referral Program**, a new way for our community members to earn rewards while helping others discover the ABP Platform! + +**How It Works:** + +ABP's Referral Program is simple and rewarding: + +1. **Get Your Unique Referral Link**: Sign up for the program and receive your personalized referral link. +2. **Share with Your Network**: Share your link with colleagues, friends, and fellow developers who could benefit from ABP. +3. **Earn Rewards**: When someone purchases an ABP Commercial license through your referral link, **you earn 5% commission**! + +By joining the referral program, you're not just earning rewards and also you're helping other developers discover a platform that can significantly improve their productivity and project success. + +> 👉 [Join the ABP.IO Referral Program](https://abp.io/community/announcements/introducing-abp.io-referral-program-b59obhe7) + +### Announcing AI Management Module + +We are excited to announce the [AI Management Module](https://abp.io/docs/10.0/modules/ai-management), a powerful new module to the ABP Platform that makes managing AI capabilities in your applications easier than ever! + +![ABP - AI Management Module Workspaces](ai-management-workspaces.png) + +**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. + +**Key Features:** + +- **Multi-Provider Support**: Allows integrating with multiple AI providers including OpenAI, Google Gemini, Anthropic Claude, and more from a single unified API. +- **Buit-In Chat Interface** +- **Ready to Use Chat Widget** +- and more... (RAG & MCP supports are on the way!) + +👉 [Read the announcement post for more...](https://abp.io/community/announcements/introducing-the-ai-management-module-nz9404a9) + +### We Were At .NET Conf China 2025! + +![.NET Conf China 2025](./dotnet-conf-china-2025.png) + +The ABP team participated in **.NET Conf China 2025** in Shanghai, celebrating the release of .NET 10 (LTS) and the achievements of the .NET community in China. + +**Event Highlights:** + +The conference brought together hundereds of developers and featured Scott Hanselman's opening keynote announcing .NET 10's availability, focused on four pillars: AI, cloud-native, cross-platform, and performance. The event covered three main themes: performance improvements, AI integration, and cross-platform development, with in-depth sessions on topics ranging from Avalonia and Blazor to AI agents and enterprise adoption. + +**ABP's Participation:** + +At the ABP booth, we showcased our developer platform with live demonstrations of modular architecture, multi-tenancy support, and built-in authentication systems. We hosted interactive raffles with prizes including ABP stickers, the _Mastering ABP Framework_ book, and Bluetooth headphones. The booth was a hub for sharing experiences, impromptu code walkthroughs, and meaningful conversations with Chinese developers about ABP's future. + +> 👉 [Read the full event recap](https://abp.io/community/announcements/.net-conf-china-2025-fz03gfge) + +### Community Talks 2025.10: AI-Powered .NET Apps with ABP & Microsoft Agent Framework + +![ABP Community Talks - AI-Powered .NET Apps](./community-talk-2025-10-ai.png) + +In our latest ABP Community Talks session, we dove deep into the world of **Artificial Intelligence** and its integration with the ABP Framework. This session explored Microsoft's cutting-edge AI libraries: **Extensions AI**, **Semantic Kernel**, and the **Microsoft Agent Framework**. + +**What We Covered:** + +We introduced the new **AI Management Module**, discussing its current status and roadmap. The session included practical demonstrations on building intelligent applications with the Microsoft Agent Framework within ABP projects, showing how these technologies empower developers to create AI-powered .NET applications. + +> 👉 [Missed the live session? Click here to watch the full session](https://www.youtube.com/live/tEcd2H6yXQk) + +### New ABP Community Articles + +There are exciting articles contributed by the ABP community as always. I will highlight some of them here: + +- [Salih Özkara](https://github.com/salihozkara) has published 3 new articles: + - [Building Dynamic XML Sitemaps with ABP Framework](https://abp.io/community/articles/building-dynamic-xml-sitemaps-with-abp-framework-n3q6schd) + - [Implement Automatic Method-Level Caching in ABP Framework](https://abp.io/community/articles/implement-automatic-methodlevel-caching-in-abp-framework-4uzd3wx8) + - [Building Production-Ready LLM Applications with .NET: A Practical Guide](https://abp.io/community/articles/building-production-ready-llm-applications-with-net-ya7qemfa) +- [Adnan Ali](https://abp.io/community/members/adnanaldaim) has published 2 new articles: + - [Integrating AI into ABP.IO Applications: The Complete Guide to Volo.Abp.AI and AI Management Module](https://abp.io/community/articles/integrating-ai-into-abp.io-applications-the-complete-guide-jc9fbjq0) + - [How ABP.IO Framework Cuts Your MVP Development Time by 60%](https://abp.io/community/articles/how-abp.io-framework-cuts-your-mvp-development-time-by-60-8l7m3ugj) +- [My First Look and Experience with Google AntiGravity](https://abp.io/community/articles/my-first-look-and-experience-with-google-antigravity-0hr4sjtf) by [Alper Ebiçoğlu](https://twitter.com/alperebicoglu) +- [TOON vs JSON for LLM Prompts in ABP: Token-Efficient Structured Context](https://abp.io/community/articles/toon-vs-json-b4rn2avd) by [Suhaib Mousa](https://abp.io/community/members/suhaib-mousa) + +Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://abp.io/community/posts/create) to the ABP Community. + +## Conclusion + +This version comes with some new features and a lot of enhancements to the existing features. You can see the [Road Map](https://abp.io/docs/10.1/release-info/road-map) documentation to learn about the release schedule and planned features for the next releases. Please try ABP v10.1 RC and provide feedback to help us release a more stable version. + +Thanks for being a part of this community! \ No newline at end of file diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/ai-management-demo.gif b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/ai-management-demo.gif new file mode 100644 index 0000000000..7b1a7f54cc Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/ai-management-demo.gif differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/ai-management-workspaces.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/ai-management-workspaces.png new file mode 100644 index 0000000000..b8924e5045 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/ai-management-workspaces.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/community-talk-2025-10-ai.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/community-talk-2025-10-ai.png new file mode 100644 index 0000000000..c370086279 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/community-talk-2025-10-ai.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/cover-image.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/cover-image.png new file mode 100644 index 0000000000..b2d4353f40 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/cover-image.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/dotnet-conf-china-2025.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/dotnet-conf-china-2025.png new file mode 100644 index 0000000000..634657310f Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/dotnet-conf-china-2025.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/file-sharing.gif b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/file-sharing.gif new file mode 100644 index 0000000000..c959b4aad2 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/file-sharing.gif differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/live-training-discount.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/live-training-discount.png new file mode 100644 index 0000000000..1b11e0efab Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/live-training-discount.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/my-passkey.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/my-passkey.png new file mode 100644 index 0000000000..5137a43633 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/my-passkey.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-login.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-login.png new file mode 100644 index 0000000000..676f06a491 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-login.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-registration.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-registration.png new file mode 100644 index 0000000000..4fd070dbe5 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-registration.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-setting.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-setting.png new file mode 100644 index 0000000000..1d017e5f06 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-setting.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/password-history-settings.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/password-history-settings.png new file mode 100644 index 0000000000..9faefc859d Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/password-history-settings.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/password-history-warning.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/password-history-warning.png new file mode 100644 index 0000000000..78cbe8c20f Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/password-history-warning.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/referral-program.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/referral-program.png new file mode 100644 index 0000000000..f6db6b1dc4 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/referral-program.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/reset-password-error-modal.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/reset-password-error-modal.png new file mode 100644 index 0000000000..78cbe8c20f Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/reset-password-error-modal.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/set-password-error-modal.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/set-password-error-modal.png new file mode 100644 index 0000000000..680a840420 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/set-password-error-modal.png differ diff --git a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/studio-switch-to-preview.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/studio-switch-to-preview.png new file mode 100644 index 0000000000..2174f17746 Binary files /dev/null and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/studio-switch-to-preview.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/articles.md b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/articles.md new file mode 100644 index 0000000000..d9ed5336e5 --- /dev/null +++ b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/articles.md @@ -0,0 +1,377 @@ +# Building a Multi-Agent AI System with A2A, MCP, and ADK in .NET + +> How we combined three open AI protocols — Google's A2A & ADK with Anthropic's MCP — to build a production-ready Multi-Agent Research Assistant using .NET 10. + +--- + +## Introduction + +The AI space is constantly changing and improving. Once again, we've moved past the single LLM calls and into the future of **Multi-Agent Systems**, in which expert AI agents act in unison as a collaborative team. + +But here is the problem: **How do you make agents communicate with each other? How do you equip agents with tools? How do you control them?** + +Three open protocols have emerged for answering these questions: + +- **MCP (Model Context Protocol)** by Anthropic — The "USB-C for AI" +- **A2A (Agent-to-Agent Protocol)** by Google — The "phone line between agents" +- **ADK (Agent Development Kit)** by Google — The "organizational chart for agents" + +In this article, I will briefly describe each protocol, highlight the benefits of the combination, and walk you through our own project: a **Multi-Agent Research Assistant** developed via ABP Framework. + +--- + +## The Problem: Why Single-Agent Isn't Enough + +Imagine you ask an AI: *"Research the latest AI agent frameworks and give me a comprehensive analysis report."* + +A single LLM call would: +- Hallucinate search results (can't actually browse the web) +- Produce a shallow analysis (no structured research pipeline) +- Lose context between steps (no state management) +- Can't save results anywhere (no tool access) + +What you actually need is a **team of specialists**: + +1. A **Researcher** who searches the web and gathers raw data +2. An **Analyst** who processes that data into a structured report +3. **Tools** that let agents interact with the real world (web, database, filesystem) +4. An **Orchestrator** that coordinates everything + +This is exactly what we built. + +!["single-vs-multiagent system"](images/image.png) +--- + +## Protocol #1: MCP — Giving Agents Superpowers + +### What is MCP? + +**MCP (Model Context Protocol)**: Anthropic's standardized protocol allows AI models to be connected to all external tools and data sources. MCP can be thought of as **the USB-C of AI** – one port compatible with everything. + +Earlier, before MCP, if you wanted your LLM to do things such as search the web, query a database, and store files, you would need to write your own integration code for each capability. MCP lets you define your tools one time, and any agent that is MCP-compatible can make use of them. + +!["mcp"](images/image-1.png) + +### How MCP Works + +MCP follows a simple **Client-Server architecture**: + +![mcp client server](images/mcp-client-server-1200x700.png) + +The flow is straightforward: + +1. **Discovery**: The agent asks "What tools do you have?" (`tools/list`) +2. **Invocation**: The agent calls a specific tool (`tools/call`) +3. **Result**: The tool returns data back to the agent + +### MCP in Our Project + +We built three MCP tool servers: + +| MCP Tool | Purpose | Used By | +|----------|---------|---------| +| `web_search` | Searches the web via Tavily API | Researcher Agent | +| `fetch_url_content` | Fetches content from a URL | Researcher Agent | +| `save_research_to_file` | Saves reports to the filesystem | Analysis Agent | +| `save_research_to_database` | Persists results in SQL Server | Analysis Agent | +| `search_past_research` | Queries historical research | Analysis Agent | + +The beauty of MCP is that you do not need to know how these tools are implemented inside the tool. You simply need to call them by their names as given in the description. + +--- + +## Protocol #2: A2A — Making Agents Talk to Each Other + +### What is A2A? + +**A2A (Agent to Agent)**, formerly proposed by Google and now presented under the Linux Foundation, describes a protocol allowing **one AI agent to discover another and trade tasks**. MCP fits as helping agents acquire tools; A2A helps them acquire the ability to speak. + +Think of it this way: +- **MCP** = "What can this agent *do*?" (capabilities) +- **A2A** = "How do agents *talk*?" (communication) + +### The Agent Card: Your Agent's Business Card + +Every A2A-compatible agent publishes an **Agent Card** — a JSON document that describes who it is and what it can do. It's like a business card for AI agents: + +```json +{ + "name": "Researcher Agent", + "description": "Searches the web to collect comprehensive research data", + "url": "https://localhost:44331/a2a/researcher", + "version": "1.0.0", + "capabilities": { + "streaming": false, + "pushNotifications": false + }, + "skills": [ + { + "id": "web-research", + "name": "Web Research", + "description": "Searches the web on a given topic and collects raw data", + "tags": ["research", "web-search", "data-collection"] + } + ] +} +``` + +Other agents can discover this card at `/.well-known/agent.json` and immediately know: +- What this agent does +- Where to reach it +- What skills it has + +![What is A2A?](images/image-2.png) + +### How A2A Task Exchange Works + +Once an agent discovers another agent, it can send tasks: + +![orchestrator](images/orchestrator-researcher-seq-1200x700.png) + +The key concepts: + +- **Task**: A unit of work sent between agents (like an email with instructions) +- **Artifact**: The output produced by an agent (like an attachment in the reply) +- **Task State**: `Submitted → Working → Completed/Failed` + +### A2A in Our Project + +Agent communication in our system uses A2A: + +- The **Orchestrator** finds all agents through the Agent Cards +- It sends a research task to the **Researcher Agent** +- The Researcher’s output (artifacts) is used as input by **Analysis Agent** - The Analysis Agent creates the final structured report + +--- + +## Protocol #3: ADK — Organizing Your Agent Team + +### What is ADK? + +**ADK (Agent Development Kit)**, created by Google, provides patterns for **organizing and orchestrating multiple agents**. It answers the question: "How do you build a team of agents that work together efficiently?" + +ADK gives you: +- **BaseAgent**: A foundation every agent inherits from +- **SequentialAgent**: Runs agents one after another (pipeline) +- **ParallelAgent**: Runs agents simultaneously +- **AgentContext**: Shared state that flows through the pipeline +- **AgentEvent**: Control flow signals (escalate, transfer, state updates) + +> **Note**: ADK's official SDK is Python-only. We ported the core patterns to .NET for our project. + +### The Pipeline Pattern + +The most powerful ADK pattern is the **Sequential Pipeline**. Think of it as an assembly line in a factory: + +![agent state flow](images/agent-state-flow.png) + +Each agent: +1. Receives the shared **AgentContext** (with state from previous agents) +2. Does its work +3. Updates the state +4. Passes it to the next agent + +### AgentContext: The Shared Memory + +`AgentContext` is like a shared whiteboard that all agents can read from and write to: + +![agent context](images/agent-context.png) + +This pattern eliminates the need for complex inter-agent messaging — agents simply read and write to a shared context. + +### ADK Orchestration Patterns + +ADK supports multiple orchestration patterns: + +| Pattern | Description | Use Case | +|---------|-------------|----------| +| **Sequential** | A → B → C | Research → Analysis pipeline | +| **Parallel** | A, B, C simultaneously | Multiple searches at once | +| **Fan-Out/Fan-In** | Split → Process → Merge | Distributed research | +| **Conditional Routing** | If/else agent selection | Route by query type | + +--- + +## How the Three Protocols Work Together + +Here's the key insight: **MCP, A2A, and ADK are not competitors — they're complementary layers of a complete agent system.** + +![agent ecosystem](images/agent-ecosystem.png) + +Each protocol handles a different concern: + +| Layer | Protocol | Question It Answers | +|-------|----------|-------------------| +| **Top** | ADK | "How are agents organized?" | +| **Middle** | A2A | "How do agents communicate?" | +| **Bottom** | MCP | "What tools can agents use?" | + +--- + +## Our Project: Multi-Agent Research Assistant + +### Built With + +- **.NET 10.0** — Latest runtime +- **ABP Framework 10.0.2** — Enterprise .NET application framework +- **Semantic Kernel 1.70.0** — Microsoft's AI orchestration SDK +- **Azure OpenAI (GPT)** — LLM backbone +- **Tavily Search API** — Real-time web search +- **SQL Server** — Research persistence +- **MCP SDK** (`ModelContextProtocol` 0.8.0-preview.1) +- **A2A SDK** (`A2A` 0.3.3-preview) + + +### How It Works (Step by Step) + +**Step 1: User Submits a Query** + +For example, the user specifies a field of research in the dashboard: *“Compare the latest AI agent frameworks: LangChain, Semantic Kernel, and AutoGen”*, and then specifies execution mode as ADK-Sequential or A2A. + +**Step 2: Orchestrator Activates** + +The `ResearchOrchestrator` receives the query and constructs the `AgentContext`. In ADK mode, it constructs a `SequentialAgent` with two sub-agents; in A2A mode, it uses the `A2AServer` to send the tasks. + +**Step 3: Researcher Agent Goes to Work** + +The Researcher Agent: +- Receives the query from the context +- Uses GPT to formulate optimal search queries +- Calls the `web_search` MCP tool (powered by Tavily API) +- Collects and synthesizes raw research data +- Stores results in the shared `AgentContext` + +**Step 4: Analysis Agent Takes Over** + +The Analysis Agent: +- Reads the Researcher's raw data from `AgentContext` +- Uses GPT to perform deep analysis +- Generates a structured Markdown report with sections: + - Executive Summary + - Key Findings + - Detailed Analysis + - Comparative Assessment + - Conclusion and Recommendations +- Calls MCP tools to save the report to both filesystem and database + +**Step 5: Results Returned** + +The orchestrator collects all results and returns them to the user via the REST API. The dashboard displays the research report, analysis report, agent event timeline, and raw data. + + +### Two Execution Modes + +Our system supports two execution modes, demonstrating both ADK and A2A approaches: + +#### Mode 1: ADK Sequential Pipeline + +Agents are organized as a `SequentialAgent`. State flows automatically through the pipeline via `AgentContext`. This is an in-process approach — fast and simple. + +![sequential agent context flow](images/sequential-agent-context-flow-1200x700.png) + +#### Mode 2: A2A Protocol-Based + +Agents communicate via the A2A protocol. The Orchestrator sends `AgentTask` objects to each agent through the `A2AServer`. Each agent has its own `AgentCard` for discovery. + +![orchestrator a2a routing](images/orchestrator-a2a-routing-1200x700.png) + +### The Dashboard + +The UI provides a complete research experience: + +- **Hero Section** with system description and protocol badges +- **Architecture Cards** showing all four components (Researcher, Analyst, MCP Tools, Orchestrator) +- **Research Form** with query input and mode selection +- **Live Pipeline Status** tracking each stage of execution +- **Tabbed Results** view: Research Report, Analysis Report, Raw Data, Agent Events +- **Research History** table with past queries and their results + + +![Dashboard 1](images/image-3.png) + +![Dashboard 2](images/image-4.png) + +--- + +## Why ABP Framework? + +We chose ABP Framework as our .NET application foundation. Here's why it was a natural fit: + +| ABP Feature | How We Used It | +|-------------|---------------| +| **Auto API Controllers** | `ResearchAppService` automatically becomes REST API endpoints | +| **Dependency Injection** | Clean registration of agents, tools, orchestrator, Semantic Kernel | +| **Repository Pattern** | `IRepository` for database operations in MCP tools | +| **Module System** | All agent ecosystem config encapsulated in `AgentEcosystemModule` | +| **Entity Framework Core** | Research record persistence with code-first migrations | +| **Built-in Auth** | OpenIddict integration for securing agent endpoints | +| **Health Checks** | Monitoring agent ecosystem health | + +ABP's single layer template provided us the best .NET groundwork, which had all the enterprise features without any unnecessary complexity for a focused AI project. Of course, the agent architecture (MCP, A2A, ADK) is actually framework-agnostic and can be implemented with any .NET application. + +--- + +## Key Takeaways + +### 1. Protocols Are Complementary, Not Competing + +MCP, A2A, and ADK solve different problems. Using them together creates a complete agent system: +- **MCP**: Standardize tool access +- **A2A**: Standardize inter-agent communication +- **ADK**: Standardize agent orchestration + +### 2. Start Simple, Scale Later + +Our approach runs all of that in a single process, which is in-process A2A. Using A2A allowed us to design the code so that each agent can be extracted into its own microservice later on without affecting the code logic. + +### 3. Shared State > Message Passing (For Simple Cases) + +ADK's `AgentContext` with shared state is simpler and faster than A2A message passing for in-process scenarios. Use A2A when agents need to run as separate services. + +### 4. MCP is the Real Game-Changer + +The ability to define tools once and have any agent use them — with automatic discovery and structured invocations — eliminates enormous amounts of boilerplate code. + +### 5. LLM Abstraction is Critical + +Using Semantic Kernel's `IChatCompletionService` lets you swap between Azure OpenAI, OpenAI, Ollama, or any provider without touching agent code. + +--- + +## What's Next? + +This project demonstrates the foundation of a multi-agent system. Future enhancements could include: + +- **Streaming responses** — Real-time updates as agents work (A2A supports this) +- **More specialized agents** — Code analysis, translation, fact-checking agents +- **Distributed deployment** — Each agent as a separate microservice with HTTP-based A2A +- **Agent marketplace** — Discover and integrate third-party agents via A2A Agent Cards +- **Human-in-the-loop** — Using A2A's `InputRequired` state for human approval steps +- **RAG integration** — MCP tools for vector database search + +--- + +## Resources + +| Resource | Link | +|----------|------| +| **MCP Specification** | [modelcontextprotocol.io](https://modelcontextprotocol.io) | +| **A2A Specification** | [google.github.io/A2A](https://google.github.io/A2A) | +| **ADK Documentation** | [google.github.io/adk-docs](https://google.github.io/adk-docs) | +| **ABP Framework** | [abp.io](https://abp.io) | +| **Semantic Kernel** | [github.com/microsoft/semantic-kernel](https://github.com/microsoft/semantic-kernel) | +| **MCP .NET SDK** | [NuGet: ModelContextProtocol](https://www.nuget.org/packages/ModelContextProtocol) | +| **A2A .NET SDK** | [NuGet: A2A](https://www.nuget.org/packages/A2A) | +| **Our Source Code** | [GitHub Repository](https://github.com/fahrigedik/agent-ecosystem-in-abp) | + +--- + +## Conclusion + +Developing a multi-agent AI system is no longer a futuristic dream; it’s something that can actually be achieved today by using open protocols and available frameworks. In this manner, by using **MCP** for access to tools, **A2A** for communicating between agents, and **ADK** for orchestration, we have actually built a Research Assistant. + +ABP Framework and .NET turned out to be an excellent choice, delivering us the infrastructure we needed to implement DI, repositories, auto APIs, and modules, allowing us to work completely on the AI agent architecture. + +The era of single LLM calls is ending, and the era of agent ecosystems begins now. + +--- \ No newline at end of file diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/agent-context.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/agent-context.png new file mode 100644 index 0000000000..955bfbd4f5 Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/agent-context.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/agent-ecosystem.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/agent-ecosystem.png new file mode 100644 index 0000000000..9d23ff605d Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/agent-ecosystem.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/agent-state-flow.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/agent-state-flow.png new file mode 100644 index 0000000000..a0f931ae23 Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/agent-state-flow.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-1.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-1.png new file mode 100644 index 0000000000..6c3dc299a4 Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-1.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-2.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-2.png new file mode 100644 index 0000000000..d59ae03432 Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-2.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-3.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-3.png new file mode 100644 index 0000000000..40a70e4743 Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-3.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-4.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-4.png new file mode 100644 index 0000000000..74f7a054b7 Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image-4.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image.png new file mode 100644 index 0000000000..cd261b6bbe Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/image.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/mcp-client-server-1200x700.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/mcp-client-server-1200x700.png new file mode 100644 index 0000000000..f10ab9783c Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/mcp-client-server-1200x700.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/orchestrator-a2a-routing-1200x700.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/orchestrator-a2a-routing-1200x700.png new file mode 100644 index 0000000000..b11f8a7683 Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/orchestrator-a2a-routing-1200x700.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/orchestrator-researcher-seq-1200x700.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/orchestrator-researcher-seq-1200x700.png new file mode 100644 index 0000000000..dc372df380 Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/orchestrator-researcher-seq-1200x700.png differ diff --git a/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/sequential-agent-context-flow-1200x700.png b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/sequential-agent-context-flow-1200x700.png new file mode 100644 index 0000000000..607048670e Binary files /dev/null and b/docs/en/Community-Articles/09-02-2026-building-multiagent-system-in-dotnet/images/sequential-agent-context-flow-1200x700.png differ diff --git a/docs/en/Community-Articles/2025-09-02-training-campaign/post.md b/docs/en/Community-Articles/2025-09-02-training-campaign/post.md index 20f2bcf4bd..40314695aa 100644 --- a/docs/en/Community-Articles/2025-09-02-training-campaign/post.md +++ b/docs/en/Community-Articles/2025-09-02-training-campaign/post.md @@ -1,6 +1,6 @@ # IMPROVE YOUR ABP SKILLS WITH 33% OFF LIVE TRAININGS! -We have exciting news to share\! As you know, we offer live training packages to help you improve your skills and knowledge of ABP. From September 8th to 19th, we are giving you 33% OFF our live trainings, so you can learn more about the product at a discounted price\! +We have exciting news to share\! As you know, we offer live training packages to help you improve your skills and knowledge of ABP. For a limited time, we are giving you 33% OFF our live trainings, so you can learn more about the product at a discounted price\! #### Why Join ABP.IO Training? 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 index 80c4a8fbeb..4eb82e0f9e 100644 --- a/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/post.md +++ b/docs/en/Community-Articles/2025-12-18-Announcement-AIMAnagement/post.md @@ -76,7 +76,7 @@ Installation is straightforward using the [ABP Studio](https://abp.io/studio). Y - Client Components - Integration to Startup Templates -### v10.1 +### v10.1 ✅ - Blazor UI - Angular UI - Resource based authorization on Workspaces @@ -103,4 +103,4 @@ The AI Management Module is available now for ABP Team and higher license holder --- -*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 +*The AI Management Module is currently in preview. We're excited to hear your feedback as we continue to improve and add new features!* diff --git a/docs/en/Community-Articles/2025-12-18-Implementing-Multiple-Global-Query-Filters-With-Entity-Framework-Core/images/cover.png b/docs/en/Community-Articles/2025-12-18-Implementing-Multiple-Global-Query-Filters-With-Entity-Framework-Core/images/cover.png new file mode 100644 index 0000000000..4ceba1f399 Binary files /dev/null and b/docs/en/Community-Articles/2025-12-18-Implementing-Multiple-Global-Query-Filters-With-Entity-Framework-Core/images/cover.png differ diff --git a/docs/en/Community-Articles/2025-12-18-Implementing-Multiple-Global-Query-Filters-With-Entity-Framework-Core/post.md b/docs/en/Community-Articles/2025-12-18-Implementing-Multiple-Global-Query-Filters-With-Entity-Framework-Core/post.md new file mode 100644 index 0000000000..120600fc87 --- /dev/null +++ b/docs/en/Community-Articles/2025-12-18-Implementing-Multiple-Global-Query-Filters-With-Entity-Framework-Core/post.md @@ -0,0 +1,728 @@ +# Implementing Multiple Global Query Filters with Entity Framework Core + +Global query filters are one of Entity Framework Core's most powerful features for automatically filtering data based on certain conditions. They allow you to define filter criteria at the entity level that are automatically applied to all LINQ queries, making it impossible for developers to accidentally forget to include important filtering logic. In this article, we'll explore how to implement multiple global query filters in ABP Framework, covering built-in filters, custom filters, and performance optimization techniques. + +By the end of this guide, you'll understand how ABP Framework's data filtering system works, how to create custom global query filters for your specific business requirements, how to combine multiple filters effectively, and how to optimize filter performance using user-defined functions. + +## Understanding Global Query Filters in EF Core + +Global query filters were introduced in EF Core 2.0 and allow you to automatically append LINQ predicates to queries generated for an entity type. This is particularly useful for scenarios like multi-tenancy, soft delete, data isolation, and row-level security. + +In traditional applications, developers must remember to add filter conditions manually to every query: + +```csharp +// Manual filtering - error-prone and tedious +var activeBooks = await _bookRepository + .GetListAsync(b => b.IsDeleted == false && b.TenantId == currentTenantId); +``` + +With global query filters, this logic is applied automatically: + +```csharp +// Filter is applied automatically - no manual filtering needed +var activeBooks = await _bookRepository.GetListAsync(); +``` + +ABP Framework provides a sophisticated data filtering system built on top of EF Core's global query filters, with built-in support for soft delete, multi-tenancy, and the ability to easily create custom filters. + +### Important: Plain EF Core vs ABP Composition + +In plain EF Core, calling `HasQueryFilter` multiple times for the same entity does **not** create multiple active filters. The last call replaces the previous one (unless you use newer named-filter APIs in recent EF Core versions). + +ABP provides `HasAbpQueryFilter` to compose query filters safely. This method combines your custom filter with ABP's built-in filters (such as `ISoftDelete` and `IMultiTenant`) and with other `HasAbpQueryFilter` calls. + +## ABP Framework's Data Filtering System + +ABP's data filtering system is defined in the `Volo.Abp.Data` namespace and provides a consistent way to manage filters across your application. The core interface is `IDataFilter`, which allows you to enable or disable filters programmatically. + +### Built-in Filters + +ABP Framework comes with several built-in filters: + +1. **ISoftDelete**: Automatically filters out soft-deleted entities +2. **IMultiTenant**: Automatically filters entities by current tenant (for SaaS applications) +3. **IIsActive**: Filters entities based on active status + +Let's look at how these are implemented in the ABP framework: + +The `ISoftDelete` interface is straightforward: + +```csharp +namespace Volo.Abp; + +public interface ISoftDelete +{ + bool IsDeleted { get; } +} +``` + +Any entity implementing this interface will automatically have deleted records filtered out of queries. + +### Enabling and Disabling Filters + +ABP provides the `IDataFilter` service to control filter behavior at runtime: + +```csharp +public class BookAppService : ApplicationService +{ + private readonly IDataFilter _softDeleteFilter; + private readonly IRepository _bookRepository; + + public BookAppService( + IDataFilter softDeleteFilter, + IRepository bookRepository) + { + _softDeleteFilter = softDeleteFilter; + _bookRepository = bookRepository; + } + + public async Task> GetAllBooksIncludingDeletedAsync() + { + // Temporarily disable the soft delete filter + using (_softDeleteFilter.Disable()) + { + return await _bookRepository.GetListAsync(); + } + } + + public async Task> GetActiveBooksAsync() + { + // Filter is enabled by default - soft-deleted items are excluded + return await _bookRepository.GetListAsync(); + } +} +``` + +You can also check if a filter is enabled and enable/disable it programmatically: + +```csharp +public async Task ProcessBooksAsync() +{ + // Check if filter is enabled + if (_softDeleteFilter.IsEnabled) + { + // Enable or disable explicitly + _softDeleteFilter.Enable(); + // or + _softDeleteFilter.Disable(); + } +} +``` + +## Creating Custom Global Query Filters + +Now let's create custom global query filters for a real-world scenario. Imagine we have a library management system where we need to filter books based on: + +1. **Publication Status**: Only show published books in public areas +2. **User's Department**: Users can only see books from their department +3. **Approval Status**: Only show approved content + +### Step 1: Define Filter Interfaces + +First, create the filter interfaces. You can define them in the same file as your entity or in separate files: + +```csharp +// Can be placed in the same file as Book entity or in separate files +namespace Library; + +public interface IPublishable +{ + bool IsPublished { get; } + DateTime PublishDate { get; set; } +} + +public interface IDepartmentRestricted +{ + Guid DepartmentId { get; } +} + +public interface IApproveable +{ + bool IsApproved { get; } +} + +public interface IPublishedFilter +{ +} + +public interface IApprovedFilter +{ +} +``` + +`IPublishable` / `IApproveable` are implemented by entities and define entity properties. +`IPublishedFilter` / `IApprovedFilter` are filter-state interfaces used with `IDataFilter` so you can enable/disable those filters at runtime. + +### Step 2: Add Filter Expressions to DbContext + +Now let's add the filter expressions to your existing DbContext. First, here's how to use `HasAbpQueryFilter` to create **always-on** filters (they cannot be toggled at runtime): + +```csharp +// MyProjectDbContext.cs +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.GlobalFeatures; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Authorization; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore.Modeling; + +namespace Library; + +public class LibraryDbContext : AbpDbContext +{ + public DbSet Books { get; set; } + public DbSet Departments { get; set; } + public DbSet Authors { get; set; } + + public LibraryDbContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + builder.Entity(b => + { + b.ToTable("Books"); + b.ConfigureByConvention(); + + // HasAbpQueryFilter creates ALWAYS-ACTIVE filters + // These cannot be toggled at runtime via IDataFilter + b.HasAbpQueryFilter(book => + book.IsPublished && + book.PublishDate <= DateTime.UtcNow); + + b.HasAbpQueryFilter(book => book.IsApproved); + }); + + builder.Entity(b => + { + b.ToTable("Departments"); + b.ConfigureByConvention(); + }); + } +} +``` + +> **Note:** Using `HasAbpQueryFilter` alone creates filters that are always active and cannot be toggled at runtime. This approach is simpler but less flexible. For toggleable filters, see Step 3 below. + +### Step 3: Make Filters Toggleable (Optional) + +If you need filters that can be enabled/disabled at runtime via `IDataFilter`, override `ShouldFilterEntity` and `CreateFilterExpression` instead of (or in addition to) `HasAbpQueryFilter`: + +```csharp +// MyProjectDbContext.cs +using System; +using System.Linq.Expressions; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Volo.Abp.EntityFrameworkCore; + +namespace Library; + +public class LibraryDbContext : AbpDbContext +{ + protected bool IsPublishedFilterEnabled => DataFilter?.IsEnabled() ?? false; + protected bool IsApprovedFilterEnabled => DataFilter?.IsEnabled() ?? false; + + protected override bool ShouldFilterEntity(IMutableEntityType entityType) + { + if (typeof(IPublishable).IsAssignableFrom(typeof(TEntity))) + { + return true; + } + + if (typeof(IApproveable).IsAssignableFrom(typeof(TEntity))) + { + return true; + } + + return base.ShouldFilterEntity(entityType); + } + + protected override Expression>? CreateFilterExpression( + ModelBuilder modelBuilder, + EntityTypeBuilder entityTypeBuilder) + where TEntity : class + { + var expression = base.CreateFilterExpression(modelBuilder, entityTypeBuilder); + + if (typeof(IPublishable).IsAssignableFrom(typeof(TEntity))) + { + Expression> publishFilter = e => + !IsPublishedFilterEnabled || + ( + EF.Property(e, nameof(IPublishable.IsPublished)) && + EF.Property(e, nameof(IPublishable.PublishDate)) <= DateTime.UtcNow + ); + + expression = expression == null + ? publishFilter + : QueryFilterExpressionHelper.CombineExpressions(expression, publishFilter); + } + + if (typeof(IApproveable).IsAssignableFrom(typeof(TEntity))) + { + Expression> approvalFilter = e => + !IsApprovedFilterEnabled || EF.Property(e, nameof(IApproveable.IsApproved)); + + expression = expression == null + ? approvalFilter + : QueryFilterExpressionHelper.CombineExpressions(expression, approvalFilter); + } + + return expression; + } +} +``` + +This mapping step is what connects `IDataFilter` and `IDataFilter` to entity-level predicates. Without this step, `HasAbpQueryFilter` expressions remain always active. + +> **Important:** Note that we use `DateTime` (not `DateTime?`) in the filter expression to match the entity property type. Adjust accordingly if your entity uses nullable `DateTime?`. + +### Step 4: Disable Custom Filters with IDataFilter + +Once custom filters are mapped to the ABP data-filter pipeline, you can disable them just like built-in filters: + +```csharp +public class BookAppService : ApplicationService +{ + private readonly IRepository _bookRepository; + private readonly IDataFilter _publishedFilter; + private readonly IDataFilter _approvedFilter; + + public BookAppService( + IRepository bookRepository, + IDataFilter publishedFilter, + IDataFilter approvedFilter) + { + _bookRepository = bookRepository; + _publishedFilter = publishedFilter; + _approvedFilter = approvedFilter; + } + + public async Task> GetIncludingUnpublishedAndUnapprovedAsync() + { + using (_publishedFilter.Disable()) + using (_approvedFilter.Disable()) + { + return await _bookRepository.GetListAsync(); + } + } +} +``` + +## Advanced: Multiple Filters with User-Defined Functions + +Starting from ABP v8.3, you can use user-defined function (UDF) mapping for better performance. This approach generates more efficient SQL and allows EF Core to create better execution plans. + +### Step 1: Enable UDF Mapping + +First, configure your module to use UDF mapping: + +```csharp +// MyProjectModule.cs +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.GlobalFilters; +using Microsoft.Extensions.DependencyInjection; + +namespace Library; + +[DependsOn( + typeof(AbpEntityFrameworkCoreModule), + typeof(AbpDddDomainModule) +)] +public class LibraryModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.UseDbFunction = true; // Enable UDF mapping + }); + } +} +``` + +### Step 2: Define DbFunctions + +Create static methods that EF Core will map to database functions: + +```csharp +// LibraryDbFunctions.cs +using Microsoft.EntityFrameworkCore; + +namespace Library; + +public static class LibraryDbFunctions +{ + public static bool IsPublishedFilter(bool isPublished, DateTime? publishDate) + { + return isPublished && (publishDate == null || publishDate <= DateTime.UtcNow); + } + + public static bool IsApprovedFilter(bool isApproved) + { + return isApproved; + } + + public static bool DepartmentFilter(Guid entityDepartmentId, Guid userDepartmentId) + { + return entityDepartmentId == userDepartmentId; + } +} +``` + +### Step 4: Apply UDF Filters + +Update your DbContext to use the UDF-based filters: + +```csharp +// MyProjectDbContext.cs +protected override void OnModelCreating(ModelBuilder builder) +{ + base.OnModelCreating(builder); + + // Map CLR methods to SQL scalar functions. + // Create matching SQL functions in a migration. + var isPublishedMethod = typeof(LibraryDbFunctions).GetMethod( + nameof(LibraryDbFunctions.IsPublishedFilter), + new[] { typeof(bool), typeof(DateTime?) })!; + builder.HasDbFunction(isPublishedMethod); + + var isApprovedMethod = typeof(LibraryDbFunctions).GetMethod( + nameof(LibraryDbFunctions.IsApprovedFilter), + new[] { typeof(bool) })!; + builder.HasDbFunction(isApprovedMethod); + + builder.Entity(b => + { + b.ToTable("Books"); + b.ConfigureByConvention(); + + // ABP way: define separate filters. HasAbpQueryFilter composes them. + b.HasAbpQueryFilter(book => + LibraryDbFunctions.IsPublishedFilter(book.IsPublished, book.PublishDate)); + + b.HasAbpQueryFilter(book => + LibraryDbFunctions.IsApprovedFilter(book.IsApproved)); + }); +} +``` + +This approach generates cleaner SQL and improves query performance, especially in complex scenarios with multiple filters. + +## Working with Complex Filter Combinations + +When combining multiple filters, it's important to understand how they interact. Let's explore some common scenarios. + +### Combining Tenant and Department Filters + +In a multi-tenant application, you might need to combine tenant isolation with department-level access control: + +```csharp +public class BookAppService : ApplicationService +{ + private readonly IRepository _bookRepository; + private readonly IDataFilter _tenantFilter; + private readonly ICurrentUser _currentUser; + + public BookAppService( + IRepository bookRepository, + IDataFilter tenantFilter, + ICurrentUser currentUser) + { + _bookRepository = bookRepository; + _tenantFilter = tenantFilter; + _currentUser = currentUser; + } + + public async Task> GetMyDepartmentBooksAsync() + { + var currentUser = _currentUser; + var userDepartmentId = GetUserDepartmentId(currentUser); + + // Get all books without department filter, then filter in memory + // (for scenarios where you need custom filter logic) + using (_tenantFilter.Disable()) // Optional: disable tenant filter if needed + { + var allBooks = await _bookRepository.GetListAsync(); + + // Apply department filter in memory (custom logic) + var departmentBooks = allBooks + .Where(b => b.DepartmentId == userDepartmentId) + .ToList(); + + return ObjectMapper.Map, List>(departmentBooks); + } + } + + private Guid GetUserDepartmentId(ICurrentUser currentUser) + { + // Get user's department from claims or database + var departmentClaim = currentUser.FindClaim("DepartmentId"); + return Guid.Parse(departmentClaim.Value); + } +} +``` + +### Filter Priority and Override + +Sometimes you need to override filters in specific scenarios. ABP provides a flexible way to handle this: + +```csharp +public async Task GetBookForEditingAsync(Guid id) +{ + // Disable soft delete filter to get deleted records for restoration + using (DataFilter.Disable()) + { + return await _bookRepository.GetAsync(id); + } +} + +public async Task GetBookIncludingUnpublishedAsync(Guid id) +{ + // Use GetQueryableAsync to customize the query + var query = await _bookRepository.GetQueryableAsync(); + + // Manually apply or bypass filters + var book = await query + .FirstOrDefaultAsync(b => b.Id == id); + + return book; +} +``` + +## Best Practices for Multiple Global Query Filters + +When implementing multiple global query filters, consider these best practices: + +### 1. Keep Filters Simple + +Complex filter expressions can significantly impact query performance. Keep each condition focused on a single concern. In ABP, you can define them separately with `HasAbpQueryFilter`, which composes with ABP's built-in filters: + +```csharp +// Good (ABP): separate, focused filters composed by HasAbpQueryFilter +b.HasAbpQueryFilter(b => b.IsPublished); +b.HasAbpQueryFilter(b => b.IsApproved); +b.HasAbpQueryFilter(b => b.DepartmentId == userDeptId); + +// Avoid: calling HasQueryFilter multiple times for the same entity +// in plain EF Core (the last call replaces the previous one) +b.HasQueryFilter(b => b.IsPublished); +b.HasQueryFilter(b => b.IsApproved); +``` + +### 2. Use Indexing + +Ensure your database has appropriate indexes for filtered columns: + +```csharp +builder.Entity(b => +{ + b.HasIndex(b => b.IsPublished); + b.HasIndex(b => b.IsApproved); + b.HasIndex(b => b.DepartmentId); + b.HasIndex(b => new { b.IsPublished, b.PublishDate }); +}); +``` + +### 3. Consider Performance Impact + +Use UDF mapping for better performance with complex filters. Profile your queries and analyze execution plans. + +### 4. Document Filter Behavior + +Clearly document which filters are applied to each entity to help developers understand the behavior: + +```csharp +/// +/// Book entity with the following global query filters: +/// - ISoftDelete: Automatically excludes soft-deleted books +/// - IMultiTenant: Automatically filters by current tenant +/// - IPublishable: Excludes unpublished books (based on IsPublished and PublishDate) +/// - IApproveable: Excludes unapproved books (based on IsApproved) +/// +/// +/// Filter interfaces (IPublishable, IApproveable, IPublishedFilter, IApprovedFilter) +/// are defined in Step 1: Define Filter Interfaces +/// +public class Book : AuditedAggregateRoot, ISoftDelete, IMultiTenant, IPublishable, IApproveable +{ + public string Name { get; set; } + + public BookType Type { get; set; } + + public DateTime PublishDate { get; set; } + + public float Price { get; set; } + + public bool IsPublished { get; set; } + + public bool IsApproved { get; set; } + + public Guid? TenantId { get; set; } + + public bool IsDeleted { get; set; } + + public Guid DepartmentId { get; set; } +} +``` + +## Testing Global Query Filters + +Testing with global query filters can be challenging. Here's how to do it effectively: + +### Unit Testing Filters + +```csharp +[Fact] +public void Book_QueryFilter_Should_Filter_Unpublished() +{ + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "TestDb") + .Options; + + using (var context = new BookStoreDbContext(options)) + { + context.Books.Add(new Book { Name = "Published Book", IsPublished = true }); + context.Books.Add(new Book { Name = "Unpublished Book", IsPublished = false }); + context.SaveChanges(); + } + + using (var context = new BookStoreDbContext(options)) + { + // Query with filter enabled (default) + var publishedBooks = context.Books.ToList(); + Assert.Single(publishedBooks); + Assert.Equal("Published Book", publishedBooks[0].Name); + } +} +``` + +### Integration Testing with Filter Control + +```csharp +[Fact] +public async Task Should_Get_Deleted_Book_When_Filter_Disabled() +{ + var dataFilter = GetRequiredService(); + + // Arrange + var book = await _bookRepository.InsertAsync( + new Book { Name = "Test Book" }, + autoSave: true + ); + + await _bookRepository.DeleteAsync(book); + + // Act - with filter disabled + using (dataFilter.Disable()) + { + var deletedBook = await _bookRepository + .FirstOrDefaultAsync(b => b.Id == book.Id); + + deletedBook.ShouldNotBeNull(); + deletedBook.IsDeleted.ShouldBeTrue(); + } +} +``` + +### Testing Custom Global Query Filters + +Here's a complete example of testing custom toggleable filters: + +```csharp +[Fact] +public async Task Should_Filter_Unpublished_Books_By_Default() +{ + // Default: filters are enabled + var result = await WithUnitOfWorkAsync(async () => + { + var bookRepository = GetRequiredService>(); + return await bookRepository.GetListAsync(); + }); + + // Only published and approved books should be returned + result.All(b => b.IsPublished).ShouldBeTrue(); + result.All(b => b.IsApproved).ShouldBeTrue(); +} + +[Fact] +public async Task Should_Return_All_Books_When_Filter_Disabled() +{ + var result = await WithUnitOfWorkAsync(async () => + { + // Disable the published filter to see unpublished books + using (_publishedFilter.Disable()) + { + var bookRepository = GetRequiredService>(); + return await bookRepository.GetListAsync(); + } + }); + + // Should include unpublished books + result.Any(b => b.Name == "Unpublished Book").ShouldBeTrue(); +} + +[Fact] +public async Task Should_Combine_Filters_Correctly() +{ + // Test combining multiple filter disables + using (_publishedFilter.Disable()) + using (_approvedFilter.Disable()) + { + var bookRepository = GetRequiredService>(); + var allBooks = await bookRepository.GetListAsync(); + + // All books should be visible + allBooks.Count.ShouldBe(5); + } +} +``` + +> **Tip:** When using ABP's test base, inject `IDataFilter` and `IDataFilter` to control filters in your tests. + +## Key Takeaways + +✅ **Global query filters automatically apply filter criteria to all queries**, reducing developer error and ensuring consistent data filtering across your application. + +✅ **ABP Framework provides a sophisticated data filtering system** with built-in support for soft delete (`ISoftDelete`) and multi-tenancy (`IMultiTenant`), plus the ability to create custom filters. + +✅ **Use `IDataFilter` to control filters at runtime**, enabling or disabling filters as needed for specific operations. + +✅ **To make custom filters toggleable, override `ShouldFilterEntity` and `CreateFilterExpression`** in your DbContext. Using only `HasAbpQueryFilter` creates filters that are always active. + +✅ **Combine multiple filters carefully** and consider performance implications, especially with complex filter expressions. + +✅ **Leverage user-defined function (UDF) mapping** for better SQL generation and query performance, available since ABP v8.3. + +✅ **Always test filter behavior** to ensure filters work as expected in different scenarios, including edge cases. + +## Conclusion + +Global query filters are essential for building secure, well-isolated applications. ABP Framework's data filtering system provides a robust foundation that builds on EF Core's capabilities while adding convenient features like runtime filter control and UDF mapping optimization. + +By implementing multiple global query filters strategically, you can ensure data isolation, simplify your query logic, and reduce the risk of accidentally exposing unauthorized data. Remember to keep filters simple, add appropriate database indexes, and test thoroughly to maintain optimal performance. + +Start implementing global query filters in your ABP applications today to leverage automatic data filtering across all your repositories and queries. + +### See Also + +- [ABP Data Filtering Documentation](https://abp.io/docs/latest/framework/fundamentals/data-filtering) +- [EF Core Global Query Filters](https://learn.microsoft.com/en-us/ef/core/querying/filters) +- [ABP Multi-Tenancy Documentation](https://abp.io/docs/latest/framework/fundamentals/multi-tenancy) +- [Using User-defined function mapping for global filters](https://abp.io/docs/latest/framework/infrastructure/data-filtering#using-user-defined-function-mapping-for-global-filters) + +--- + +## References + +- [ABP Framework Documentation](https://docs.abp.io) +- [Entity Framework Core Documentation](https://docs.microsoft.com/en-us/ef/core/) +- [EF Core Global Query Filters](https://learn.microsoft.com/en-us/ef/core/querying/filters) +- [User-defined Function Mapping](https://learn.microsoft.com/en-us/ef/core/querying/user-defined-function-mapping) diff --git a/docs/en/Community-Articles/2025-12-18-Implementing-Multiple-Global-Query-Filters-With-Entity-Framework-Core/summary.md b/docs/en/Community-Articles/2025-12-18-Implementing-Multiple-Global-Query-Filters-With-Entity-Framework-Core/summary.md new file mode 100644 index 0000000000..85c96c2a16 --- /dev/null +++ b/docs/en/Community-Articles/2025-12-18-Implementing-Multiple-Global-Query-Filters-With-Entity-Framework-Core/summary.md @@ -0,0 +1 @@ +Global query filters in Entity Framework Core allow automatic data filtering at the entity level. This article covers ABP Framework's data filtering system, including built-in filters (ISoftDelete, IMultiTenant), custom filter implementation, and performance optimization using user-defined functions. \ No newline at end of file diff --git a/docs/en/Community-Articles/2026-01-11/article.md b/docs/en/Community-Articles/2026-01-11/article.md new file mode 100644 index 0000000000..2f1f25db45 --- /dev/null +++ b/docs/en/Community-Articles/2026-01-11/article.md @@ -0,0 +1,170 @@ +# Async Chain of Persistence Pattern: Designing for Failure in Event-Driven Systems + +## Introduction +Messages can get lost while being processed when you use asynchronous messaging or event handling. +The Async Chain of Persistence Pattern makes sure that no message is ever lost from the system by making sure that the message is always stored at every step of the workflow. + +## The Fundamental Principle of Pattern +The Async Chain of Persistence Pattern guarantees that no message is ever lost by ensuring that the message is always persistently stored at every step of the workflow. This is where the pattern gets its name. A message cannot be removed from its previous location until it is confirmed to be persistently stored in the subsequent stages of the chain. + +It is commonly used in event-driven systems and message-driven systems. + +### Event-Driven versus Message-Driven Systems +To understand the pattern, it's important to know the differences between events and messages. + +#### The Core Difference + +**Event:** Says "something happened", describes the past. Example: `OrderPlaced`, `PaymentCompleted` + +**Message:** Says "do this", commands for the future. Example: `CreateOrder`, `SendEmail` + +| Property | Event | Message | +|----------|-------|---------| +| **Coupling** | Loose - no one knows who's listening | Tighter - there's a specific receiver | +| **Publishing** | Pub/Sub - 0-N services listen | Point-to-Point - usually 1 service | +| **Tense** | Past tense, immutable | Present/future tense | +| **Error Handling** | If one consumer fails, others continue | If not processed, system breaks | + + +### Relationship with Async Chain of Persistence + +**In event-driven systems:** Each service receives the event → persists it → publishes a new event + +![Event-Driven Systems](event-driven-systems.png) + +**In message-driven systems:** At each step, the message is kept safe on queue + disk + +In both systems, the goal is the same: no message should be lost! + +![Message-Driven Systems](message-driven-systems.png) + +--- + +## When Do Messages Get Lost? +There are 3 main scenarios for message loss: + +### 1. While Processing a Message (Receiving a Message) +While processing a message in a reply, by default, there is an automatic acknowledgment and subsequent deletion of a message that is in a queue. But in cases where there is a fatal or unrecoverable error in the message processing operation or a service instance crashes, this message gets lost. + +### 2. Message Broker Crashes +In the majority of message brokers, the default option for the message persistence state is set to nonpersisting. In other words, the message will be held in the memory of the message broker without any persistence. It has been used for the purpose of obtaining rapid responses and improved throughput. However, in the event of failure of the message broker process, the nonpersistent message will be lost permanently. + +### 3. Event Chaining +In event-driven systems, an event is published as a derived message after an operation is done by a service. Message loss in two ways is possible in this scenario: +1. **Risk of Asynchronous Send:** The publish operation is often carried out using the asynchronous send feature. When a fatal error takes place prior to the receipt of acknowledgment of the message publish operation by the publish services, it becomes difficult to determine if the message has been successfully transmitted to the message broker. +2. **Transaction Coordination:** In case an error is detected after the commit of the database but before the derived event is published, the derived event might be lost. + +## Implementing the Pattern: 4 Critical Steps +Four critical steps are required to implement the Async Chain of Persistence Pattern: + +### 1. Message Persistence +The initial step to ensure that there are no lost messages is to specify the messages as PERSISTENT: When the message broker receives the message, it is saved on disk. + +```javascript +var delivery_mode = PERSISTENT +var producer = create_producer(delivery_mode) + +// All sent messages are persisted on the message broker +producer.send_message(APPLY_PAYMENT) + +// Alternatively +var delivery_mode = PERSISTENT +var producer = create_producer() +producer.send_message(APPLY_PAYMENT, delivery_mode) +``` +With this approach, even if the message broker crashes, all messages will still be there when it comes back up. + +### 2. Client Acknowledgement Mode +Instead, client-acknowledgement mode needs to be employed. When a message is received in this mode, that message will be retained in the queue until a proper acknowledgment from the processing service has been made. Instead of "auto acknowledge" mode, "client-acknowledgement" mode + +Client acknowledgement mode ensures that the message is not lost while processing by the service. When a fatal error is detected during message processing, the service exits without sending an acknowledgement message and thus results in a message redispatched. + +**Important Note:** The message has to be acknowledged while the message processing operation is completed so that a repeat message will not be processed. + +### 3. Synchronous Send +The synchronous send must be preferred over the asynchronous send. + +Although it takes longer to send via synchronous send, since it's a blocking call, it ensures that the message broker received and persisted the message on disk. + +```javascript +// Blocking call to publish the derived event +var ack = publish_event(PAYMENT_APPLIED) +if (ack not_successful) { + retry_or_persist(PAYMENT_APPLIED) +} +``` +With this approach, the risk of message loss during event chaining is eliminated. + +### 4. Last Participant Support +This is the most complex step of the Async Chain of Persistence pattern. It determines when the message should be acknowledged. + +#### For Message-Driven Systems: +```javascript +var message = receive_message() +process_message(message) +database.commit() +message.acknowledge() +``` +Recommended order: **commit first, ack last.** Otherwise, if the database operation fails, the message will be lost because it has already been removed from the queue. + +#### For Event-Driven Systems +In event-driven systems, there are two distinct parties involved: one that acknowledges an event and another that publishes the event that’s been derived. The party that publishes the event that’s been derived should be treated as “last participant.” +```javascript +var event = receive_event() +process_event(event) +database.commit() +message.acknowledge() + +var ack = publish_event(PAYMENT_APPLIED) +if (ack not_successful) { + retry_or_persist(PAYMENT_APPLIED) +} +``` +In this sequence, the original event is acknowledged after it is completed. If publishing the derived event fails, it can be retried or persisted for later delivery. + +--- + +## Trade-offs + +### Advantages + +**Preventing Message Loss:** +The major benefit of this pattern is that it doesn't let a message get lost while messages are under processing. This issue, being a serious concern in asynchronous systems, is ruled out due to the pattern. + +### Disadvantages + +#### 1. Possible Duplicate Messages +Enabling the client-acknowledgement mode can result in the processing of the same message multiple times. If the service instance fails after the database commit but before the message could be acknowledged, the message will be repeated and duplicates can be processed. + +**Solution:** In order to determine whether the arriving messages are previously processed or not, the message IDs can be logged and traced back. This also has the drawback of requiring one extra read operation per message in the system. + +#### 2. Performance and Throughput +It has also been noted that the time duration in which the persistent message takes to be sent from the message broker could be **up to four times longer** than in the nonpersistent message transmission. + +Persisted messages also affect performance in terms of sending and reading the message. It is also common for message brokers to maintain message data in their memory for efficient reading, but there is no assurance that messages will always be resident in memory, depending on memory size, among other factors. + +#### 3. Impact of Synchronous Send +Because a synchronous send makes a blocking call until a confirmation is received, there is no other work that can be accomplished before a confirmation is received from the broker for a synchronous send. A persisted message makes this even more apparent. + +#### 4. Overall Scalability +This is because, upon receipt, the message broker has to spend more time persisting messages to disk, thus negatively affecting scalability. Persistent messages always give lower total throughput, which can limit scalability under high usage loads and high message volumes. + +--- + +## Conclusion + +The Async Chain of Persistence Pattern provides a powerful solution for preventing message loss. Although it has negative effects on performance, throughput, and scalability, these trade-offs are generally acceptable in systems where data loss is critical. + +Before implementing the pattern, carefully analyze your system requirements: + +- **How critical is message loss?** +- **What are the performance and throughput requirements?** +- **How should the system behave in case of duplicate processing?** + +The answers to these questions will help you determine whether the Async Chain of Persistence Pattern is suitable for your system. + +## Sample Project + +To see an example project where this pattern is implemented, you can check out the repository: + +🔗 **[GitHub Repository](https://github.com/fahrigedik/SoftwareArchitecturePatterns)** diff --git a/docs/en/Community-Articles/2026-01-11/event-driven-systems.png b/docs/en/Community-Articles/2026-01-11/event-driven-systems.png new file mode 100644 index 0000000000..b593ceceed Binary files /dev/null and b/docs/en/Community-Articles/2026-01-11/event-driven-systems.png differ diff --git a/docs/en/Community-Articles/2026-01-11/message-driven-systems.png b/docs/en/Community-Articles/2026-01-11/message-driven-systems.png new file mode 100644 index 0000000000..9424aa2974 Binary files /dev/null and b/docs/en/Community-Articles/2026-01-11/message-driven-systems.png differ diff --git a/docs/en/Community-Articles/2026-01-16-meet-abio-at-ndc-london/post.md b/docs/en/Community-Articles/2026-01-16-meet-abio-at-ndc-london/post.md new file mode 100644 index 0000000000..4890b42174 --- /dev/null +++ b/docs/en/Community-Articles/2026-01-16-meet-abio-at-ndc-london/post.md @@ -0,0 +1,17 @@ +We are thrilled to announce that **ABP.IO will be sponsoring [NDC London 2026](https://ndclondon.com/),** making the start of 2026 a very exciting time for us\! + +NDC London is going to take place from **26th-30th January 2026 at Queen Elizabeth II Center.** This 5-Day event for software developers will have over 90 speakers and 100 sessions. We are excited to be a part of this amazing event once more as devoted supporters of the software development community\! + +## Conference Tracks, Topics, and What Developers Can Expect + +Developers attending **NDC London 2026** can expect five focused tracks packed with practical, real-world sessions. The conference covers the modern development stack, including **.NET, JavaScript, Cloud, DevOps, Security, Testing, UX, Web**, and emerging technologies, delivered by industry experts with actionable insights developers can apply immediately. + +## Discover Previous NDC Events + +We have shared **our takeaways from past NDC events** and other conferences [**here**](https://abp.io/community/events/sponsored#gsc.tab=0). You can check them out to learn what we discovered along the way\! + +## Stop By Our Booth and Say Hello + +We can’t wait to meet fellow developers at NDC London 2026, have meaningful conversations and connect in person. **If you are stopping by our booth, don’t miss our raffle\!** We will be giving away a nice surprise during the event\! + +We are looking forward to meeting you there and sharing a few great days focused on software development. See you there\! diff --git a/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/PuppeteerSharp.png b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/PuppeteerSharp.png new file mode 100644 index 0000000000..0a2b72ab1c Binary files /dev/null and b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/PuppeteerSharp.png differ diff --git a/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/QuestPDF.png b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/QuestPDF.png new file mode 100644 index 0000000000..ef93db3d48 Binary files /dev/null and b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/QuestPDF.png differ diff --git a/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/article.md b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/article.md new file mode 100644 index 0000000000..ff613b0aed --- /dev/null +++ b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/article.md @@ -0,0 +1,153 @@ +# Which Open-Source PDF Libraries Are Recently Popular ? A Data-Driven Look At PDF Topic + +So you're looking for a PDF library in .NET, right? Here's the thing - just because something has a million downloads doesn't mean it's what you should use *today*. I'm looking at **recent download momentum** (how many people are actually using it NOW via NuGet) and **GitHub activity** (are they still maintaining this thing or did they abandon it?). + +I pulled data from the last ~90 days for the main players in the .NET PDF space. Here's what's actually happening: + +## Popularity Comparison of .NET PDF Libraries (*ordered by score*) + +| Library | GitHub Stars | Avg Daily NuGet Downloads | Total NuGet Downloads | **Popularity Score** | +|---------|---------------|-----------------------------|----------------------------|---------------------| +| **[Microsoft.Playwright](https://github.com/microsoft/playwright-dotnet)** | [2.9k](https://github.com/microsoft/playwright-dotnet) | [23k](https://www.nuget.org/packages/Microsoft.Playwright) | 39M | **71/100** | +| **[QuestPDF](https://github.com/QuestPDF/QuestPDF)** | [13.7k](https://github.com/QuestPDF/QuestPDF) | [8.2k](https://www.nuget.org/packages/QuestPDF) | 15M | **54/100** | +| **[PDFsharp](https://github.com/empira/PDFsharp)** | [862](https://github.com/empira/PDFsharp) | [9k](https://www.nuget.org/packages/PdfSharp) | 47M | **48/100** | +| **[iText](https://github.com/itext/itext-dotnet)** | [1.9k](https://github.com/itext/itext-dotnet) | [17.2k](https://www.nuget.org/packages/itext) | 16M | **44/100** | +| **[PuppeteerSharp](https://github.com/hardkoded/puppeteer-sharp)** | [3.8k](https://github.com/hardkoded/puppeteer-sharp) | [8.7k](https://www.nuget.org/packages/PuppeteerSharp) | 26M | **40/100** | + +**How I calculated the score:** I weighted GitHub Stars (30%), Daily Downloads (40% - because that's what matters NOW), and Total Downloads (30% - for historical context). Everything normalized to 0-100 before weighting. Higher = better momentum overall. + +## The Breakdown - What You Actually Need to Know + +### [PDFsharp](https://docs.pdfsharp.net/) + +![pdfsharp](pdfsharp.png) + +**NuGet:** [PdfSharp](https://www.nuget.org/packages/PdfSharp) | **GitHub:** [empira/PDFsharp](https://github.com/empira/PDFsharp) + +**What it does:** Code-first PDF stuff - drawing, manipulating, merging, that kind of thing. Not for HTML/browser rendering though, so don't try to convert your React app to PDF with this. + +**What's the vibe?** **Stable, but kinda old school.** It's got the biggest total download count (47M!) but only pulling ~9k/day now. They updated it 2 weeks ago (Jan 6) so it's alive, and it supports .NET 8-10 which is nice. The GitHub stars (862) are pretty low compared to the shiny new kids, but honestly? It's been around forever and people still use it. It's the reliable old workhorse. + +**Pick this if:** +- You need to build PDFs from scratch with code (not HTML) +- You want to draw graphics, manipulate existing PDFs, merge files +- You don't want browser engines anywhere near your project + +--- + +### [iText](https://itextpdf.com/) + +![iText Logo](itext.jpg) + +**NuGet:** [itext](https://www.nuget.org/packages/itext/) | **GitHub:** [itext/itext-dotnet](https://github.com/itext/itext-dotnet) + +**What it does:** The enterprise beast. Digital signatures, PDF compliance (PDF/A, PDF/UA), forms, all that fancy stuff. Can do HTML-to-PDF too if you need it. + +**What's the vibe?** **Actually doing pretty well!** ~17.2k downloads/day (highest for code-first libs), updated literally yesterday (Jan 18). They're moving fast. 1.9k stars isn't huge but the community seems active. The catch? This is the enterprise option - check the licensing before you commit if you're doing commercial work. + +**Pick this if:** +- You need digital signatures, PDF compliance, or advanced form stuff +- Your company is cool with licensing fees (or you're doing open source) +- You need serious PDF manipulation features +- You want HTML-to-PDF AND code-based generation in one package + +--- + +### [Microsoft.Playwright](https://playwright.dev/dotnet/) + +![Playwright Logo](playwright.png) + +**NuGet:** [Microsoft.Playwright](https://www.nuget.org/packages/Microsoft.Playwright) | **GitHub:** [microsoft/playwright-dotnet](https://github.com/microsoft/playwright-dotnet) + +**What it does:** Browser automation that can turn HTML/CSS/JS into PDFs. Uses real browser engines (Chromium, WebKit, Firefox) so your PDFs look exactly like they would in a browser. + +**What's the vibe?** **Killing it.** ~23k downloads/day (highest in this whole list!). It's Microsoft-backed so you know they're not gonna abandon it anytime soon. Last commit was December 3rd but honestly that's fine, they're actively maintaining. 2.9k stars and climbing. If you need to turn web pages into PDFs, this is probably your best bet right now. + +**Pick this if:** +- You need to convert HTML/CSS/JS to PDF and want it to look EXACTLY like the browser +- You're working with SPAs, dynamic content, or web templates +- You also need browser automation/testing (bonus!) +- Layout accuracy is critical (forms, dashboards, etc.) + +--- + +### [PuppeteerSharp](https://www.puppeteersharp.com/) + +![PuppeteerSharp Logo](PuppeteerSharp.png) + +**NuGet:** [PuppeteerSharp](https://www.nuget.org/packages/PuppeteerSharp) | **GitHub:** [hardkoded/puppeteer-sharp](https://github.com/hardkoded/puppeteer-sharp) + +**What it does:** Basically Playwright's older sibling. Uses headless Chromium to turn HTML into PDFs. Same idea, different API. + +**What's the vibe?** **Stable but losing ground.** Got updated last week (Jan 12) so it's maintained, but ~8.7k/day is way less than Playwright's ~23k. 3.8k stars is decent though. It works fine, but Playwright is eating its lunch. Still, if you know Puppeteer already or only need Chromium, this might be fine. + +**Pick this if:** +- You already know Puppeteer from Node.js and want the same vibe in .NET +- You only need Chromium (don't care about Firefox/WebKit) +- You have existing Puppeteer code you're porting + +--- + + + +### [QuestPDF](https://github.com/QuestPDF/QuestPDF) + +![QuestPDF Logo](QuestPDF.png) + +**NuGet:** [QuestPDF](https://www.nuget.org/packages/QuestPDF) | **GitHub:** [QuestPDF/QuestPDF](https://github.com/QuestPDF/QuestPDF) + +**What it does:** Build PDFs with fluent C# APIs. Think of it like building a UI layout, but for PDFs. No HTML needed - it's all code, all .NET. + +**What's the vibe?** **The community favorite.** 13.7k stars (most by far!), updated yesterday (Jan 18). ~8.2k downloads/day isn't the highest but the community is clearly excited about it. Modern API, active dev, people seem to actually enjoy using it. If you're building reports/invoices from code and want something that feels modern, this is it. + +**Pick this if:** +- You want to build PDFs with code (not HTML) and you like fluent APIs +- You're generating reports, invoices, structured documents +- You want zero browser dependencies +- You care about type safety and maintainable code +- You want something that feels modern and well-designed + + + +## Who's Winning Right Now? + +Here's what the numbers are telling us: + +### Code-First Libraries (Building PDFs with Code) + +**[QuestPDF](https://github.com/QuestPDF/QuestPDF)** - Score: 54/100 +The people's choice. Most GitHub stars (13.7k), updated yesterday, community loves it. Downloads aren't the highest but the engagement is real. This is what people are excited about. + +**[iText](https://github.com/itext/itext-dotnet)** - Score: 44/100 +Actually pulling the most daily downloads (~17.2k/day) for code-first libs, also updated yesterday. The enterprise crowd is still using this heavily. Just watch that licensing. + +**[PDFsharp](https://github.com/empira/PDFsharp)** - Score: 48/100 +The old reliable. 47M total downloads but only ~9k/day now. It works, it's stable, but it's not where the momentum is. Still a solid choice if you need something battle-tested. + +### HTML/Browser-Based Libraries (Turning Web Pages into PDFs) + +**[Microsoft.Playwright](https://github.com/microsoft/playwright-dotnet)** - Score: 71/100 +Winner winner. ~23k downloads/day (highest overall), Microsoft backing, actively maintained. If you need HTML-to-PDF, this is probably the move. + +**[PuppeteerSharp](https://github.com/hardkoded/puppeteer-sharp)** - Score: 40/100 +Still kicking around at ~8.7k/day but Playwright is clearly the future. Updated last week so it's not dead, just... less popular. + + + +## TL;DR - What Should You Actually Use? + +**Building PDFs from code (not HTML):** +- **QuestPDF** - If you want something modern and the community is raving about it (13.7k stars!) +- **iText** - If you need enterprise features and can handle the licensing +- **PDFsharp** - If you want the battle-tested option that's been around forever + +**Converting HTML/web pages to PDF:** +- **Playwright** - Just use this. It's winning right now (~23k/day), Microsoft-backed, actively maintained. Game over. +- **PuppeteerSharp** - Only if you really need Chromium-only or you're migrating from Node.js Puppeteer + +**Bottom line:** For HTML-to-PDF, Playwright is dominating. For code-first, QuestPDF has the hype but iText has the downloads. Choose your fighter. + +--- + +*Numbers from GitHub and NuGet as of January 19, 2026. Daily downloads are from the last 90 days.* + diff --git a/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/cover.png b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/cover.png new file mode 100644 index 0000000000..bd40d5d2d8 Binary files /dev/null and b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/cover.png differ diff --git a/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/itext.jpg b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/itext.jpg new file mode 100644 index 0000000000..f0b2df04e2 Binary files /dev/null and b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/itext.jpg differ diff --git a/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/pdfsharp.png b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/pdfsharp.png new file mode 100644 index 0000000000..b9f1c0c203 Binary files /dev/null and b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/pdfsharp.png differ diff --git a/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/playwright.png b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/playwright.png new file mode 100644 index 0000000000..71a50d9e82 Binary files /dev/null and b/docs/en/Community-Articles/2026-01-19-Trend-PDF-Libraries-For-CSharp/playwright.png differ diff --git a/docs/en/Community-Articles/2026-01-24-How-AI-Is-Changing-Developers/POST.md b/docs/en/Community-Articles/2026-01-24-How-AI-Is-Changing-Developers/POST.md new file mode 100644 index 0000000000..398cb41f73 --- /dev/null +++ b/docs/en/Community-Articles/2026-01-24-How-AI-Is-Changing-Developers/POST.md @@ -0,0 +1,167 @@ +# How AI Is Changing Developers + +In the last few years, AI has moved from “nice to have” to “hard to live without” for developers. At first it was just code completion and smart hints. Now it’s getting deep into how we build software: the methods, the toolchain, and even the job itself. + +Here are some structured thoughts on how AI is affecting developers, based on trends and personal experience. + +## Every library will have AI-first docs + +Future libraries and frameworks won’t just have docs for humans. They’ll also have a manual for AI: + +- How to use +- Why it is designed this way +- What NOT to do +- Conventions & Best Practices + +Once these rules are written in a structured way, AI can onboard to a library faster and more consistently than a junior developer. + +Docs won’t just be knowledge anymore. They’ll be instructions AI can execute. + +## AI will be a must-have for developers + +Soon, “writing code without AI” will feel as strange as “writing code without an IDE.” + +- It won’t be about whether you use AI +- It’ll be about how well you use it and where + +AI will become: + +- A standard productivity tool +- An extension of a developer’s thinking +- A second brain + +Developers who don’t use AI will fall behind in both speed and understanding. + +## As AI gets smarter, it replaces “time” + +AI isn’t replacing developers right away. It’s replacing: + +- Lots of repetitive time +- Basic development costs +- Higher output per hour + +Boilerplate, CRUD, basic validation, simple logic — all of that will get swallowed fast. + +It’s not people being replaced. It’s waste. + +## Orchestrating multiple AIs becomes real + +The future isn’t “one AI does everything.” It’s more like: + +- Claude writes core code +- Copilot generates and maintains unit tests +- Codex and similar tools write docs and examples +- Other AIs handle refactoring, performance analysis, security checks + +The dev process itself becomes an AI orchestration system. + +The developer’s role looks more like: + +Architect + conductor + quality gatekeeper + +## Only great infrastructure gets amplified by AI + +Even if AI can teach you “how to use it correctly,” it still can’t invent mature infrastructure for you. + +We still rely on: + +- Stable base frameworks (like [ABP](https://abp.io)) +- Engineering capability proven by many projects +- Long-term maintenance and evolution + +AI is an accelerator, not the foundation. + +For open source, AI is actually a better companion: + +- Helps understand the source code +- Helps learn design thinking +- Helps ship faster + +The stronger the infrastructure, the more value AI can amplify. + +## Frontend feels mature; backend still evolving + +From personal experience: + +- AI is already very strong in frontend work (Bootstrap / UI components, layout, styling, interaction) +- Backend is still learning and improving (business boundaries, architecture trade-offs, implicit constraints) + +This shows: the clearer the rules and the faster the feedback, the faster AI improves. + +## Writing rules for AI is productivity itself + +In the ABP libraries, we’ve already written lots of rules for AI: + +- Conventions +- Usage limits +- Recommended patterns + +As rules grow: + +- AI becomes more stable +- More predictable +- Base development work can be largely automated + +Future engineering skill will be, in large part: how to design a rules system for AI. + +## The real advantage is better feedback loops + +AI gets much stronger when there’s clear feedback: + +- Tests that run fast and fail loudly +- Logs and metrics that explain behavior +- Code review that checks for edge cases and security + +The teams that win are the ones who can quickly verify, correct, and learn. + +## About a developer’s career + +Sometimes I think: I’m glad I didn’t enter the software industry just in the last few years. + +If you’re just starting out, you really feel: + +- The barrier is lower +- The competition is tougher + +But whenever I see AI generate confident but wrong code, I’m reminded: + +- The industry still has a future +- It still needs judgment, taste, and experience + +There will always be people who love coding. If AI does it and we watch, that’s fine too. + +## Chaos everywhere, but the experience is moving fast + +Big companies, platforms, tools: + +- GitHub +- OpenAI +- Claude +- All kinds of IDEs / agents + +New AI tools, apps, and platforms keep popping up. New concepts show up almost every week. It’s noisy, but the big picture is clear: AI keeps getting better, and the overall developer experience is improving fast. + +## Get ready for the AI revolution + +Looking back at personal experience: + +- Before: Google +- Now: ChatGPT +- Before: manual translation +- Now: fully automatic +- Before: writing unit tests by hand +- Now: AI does it all +- Before: human replies to customers +- Now: AI-assisted or even AI-led + +From code completion to agents running tasks, and now deep IDE integration — the pace is shocking. + +## Closing + +AI is not the end of software engineering. It is: + +- A leap in cognition +- A restructure of how work gets done +- An upgrade of roles + +What matters most isn’t how much code AI can write, but how we redefine the value of “developers” in the AI era. diff --git a/docs/en/Community-Articles/2026-01-24-How-AI-Is-Changing-Developers/image.png b/docs/en/Community-Articles/2026-01-24-How-AI-Is-Changing-Developers/image.png new file mode 100644 index 0000000000..03a2e61455 Binary files /dev/null and b/docs/en/Community-Articles/2026-01-24-How-AI-Is-Changing-Developers/image.png differ diff --git a/docs/en/Community-Articles/2026-02-02-ndc-london-article/post.md b/docs/en/Community-Articles/2026-02-02-ndc-london-article/post.md new file mode 100644 index 0000000000..eeab7b79e1 --- /dev/null +++ b/docs/en/Community-Articles/2026-02-02-ndc-london-article/post.md @@ -0,0 +1,50 @@ + +The software development world converged on the **Queen Elizabeth II Centre** in Westminster from **January 26-30** for **NDC London 2026**. As one of the most anticipated tech conferences in Europe, this year’s event delivered a masterclass in the future of the stack. + +We have spent five days immersed in workshops and sessions. Here is our comprehensive recap of the highlights and the technical shifts that will define 2026\. + +![enter image description here](https://abp.io/api/file-management/file-descriptor/share?shareToken=CfDJ8NqaJZr2oLpIuRyHVjJk1BBjsk292Ejh%2b5X2yeS2pD9uibmq8qxh50b9eOg5U5Ib2jAFaeCHItbTyOpajIeaUzNKg/p0WHohjf1iac2%2bVL6kT/Y3ORSKpRQrdE22QJTwAxBMUryUgTQJ989hYtsvF%2bkReDR03k0gIl4ApUaji6Tg) + +## **1\. High-Performance .NET and C\# Evolution** + +A major focus this year was the continued evolution of the .NET ecosystem. Experts delivered standout sessions on high-performance coding patterns, it’s clear that efficiency and "Native AOT" (Ahead-of-Time compilation) are no longer niche topics, they are becoming industry standards. + +## **1\. Moving Beyond the AI Hype** + +If 2025 was about experimenting with LLMs, NDC London 2026 was about AI integration. Sessions from experts showcased how developers are moving past simple chatbots and integrating AI directly into the CI/CD pipeline and automated testing suites. + +![enter image description here](https://abp.io/api/file-management/file-descriptor/share?shareToken=CfDJ8NqaJZr2oLpIuRyHVjJk1BDxx%2FqqZ08tgIxCPsAnDDD2w5yJPjVXwUJrbGHpSln3npfpJEBQ78chKoSlZS1cz1nbigNQtRq60dlbyMLwnAgE52tBwUJz481PcBgNtyFMW7rm7oKhFV9c7tK8bEcK%2FscRudaV8w7%2FPO8U5KJv%2BQal) + +![enter image description here](https://abp.io/api/file-management/file-descriptor/share?shareToken=CfDJ8NqaJZr2oLpIuRyHVjJk1BBdNXgjnu7HIGgX//VJrh3XzjPns4ODHMUhZ%2bDQCcZa2Nc0%2b%2bshyt2UXqaIKEJMPHh6JIDGBtUrdQZ1EzmGn3pingGKiw7YTbh0Z%2bLRZSmcY6pEXkd1S/7VVncmICIHrQgjg%2b7eb2uO28qadIWGbD99) + +## **3\. The "Hallway Track" and Community Networking** + +One of the biggest draws of **NDC London** is the community. Between the 100+ sessions, the exhibitor hall was buzzing with live demos and networking. + +Watch the video: + +[![Watch the Hallway Track video](https://img.youtube.com/vi/yb-FILkqL7U/hqdefault.jpg)](https://www.youtube.com/watch?v=yb-FILkqL7U) + +![enter image description here](https://abp.io/api/file-management/file-descriptor/share?shareToken=CfDJ8NqaJZr2oLpIuRyHVjJk1BCLbkSK3YZDZZhBGi/IBZOCXgcWHwTyS/s5v6U%2bSeQnY5yCTzMJFTu/mA4xX%2bL5tjbMPfEI8gvCwmVEfSymGFIiJLtAbP8T2zFZev%2bm74sTsQ%2b4sdsLKbdijiae3G%2b45ijWep7yFJx9BWMgV263zzvI) +![enter image description here](https://abp.io/api/file-management/file-descriptor/share?shareToken=CfDJ8NqaJZr2oLpIuRyHVjJk1BCrCACVWDlDjOgl9ASMeZNMVBGye%2bfya4aO6UW5Kyg9MCVLswzckRWS%2bT71AcQuWMGfiousZlSCrKNAGrosPXzuWAsxnNai3xBcj061TWjGAGX4u1AtrD0eknRxuKe2ba%2bVO7r0sZqle%2bUyZa305hhO) + +## **4\. The Big Giveaway: Our Xbox Series S Raffle** + +One of our favorite moments of the week was our Raffle Session. We love giving back to the community that inspires us, and this year, the energy at our booth was higher than ever. + +We were thrilled to give away a brand-new Xbox Series S to one lucky winner\! It was fantastic to meet so many of you who stopped by to enter, chat about your current projects, and share your thoughts on the future of the industry. + +**Congratulations again to our 2026 winner\!** We hope you enjoy some well-deserved gaming time after a long week of learning. + +![enter image description here](https://abp.io/api/file-management/file-descriptor/share?shareToken=CfDJ8NqaJZr2oLpIuRyHVjJk1BBozHxXhCL7qMtx5LAxvafvPOKaZJepGlR7tgHVvw6wGpuR4Ervipym%2busZ7eMl3uook15K1874RYEwUenBfoZSJBm33MdaHFduha9iJ7tnfTmW12QbdYM77yqfVJ7EonuJsRrNySdYrQuRI0H2RkZr) + +Watch the video: + +[![Watch the Xbox Series S giveaway](https://img.youtube.com/vi/W5HRwys8dpE/hqdefault.jpg)](https://www.youtube.com/watch?v=W5HRwys8dpE) + + +## **Final Thoughts: See You at NDC London 2027\!** + +NDC London 2026 proved once again why it is a cornerstone event for the global developer community. We are returning to our projects with a refreshed roadmap and a deeper understanding of the tools shaping our industry. + +![enter image description here](https://abp.io/api/file-management/file-descriptor/share?shareToken=CfDJ8NqaJZr2oLpIuRyHVjJk1BDJq%2bG7yg1jtoY3gGH8mFMZen%2bncuL%2bKrQHY4/FPOF2KXcLyEjJymhk0JAVwJ76lPeqBchrfsAK3TOUTKY15tC7jm3uwgcH9IWRxCM2ouqxVGqGPd8YIRdG7H7QgyuknBkS4wsdYI9gl1EGqgPtTXJd) diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/0.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/0.png new file mode 100644 index 0000000000..a0cf7c166d Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/0.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/1.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/1.png new file mode 100644 index 0000000000..da57dc3bb9 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/1.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/2.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/2.png new file mode 100644 index 0000000000..95634840d7 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/2.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/3.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/3.png new file mode 100644 index 0000000000..398d89e6de Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/3.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/4.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/4.png new file mode 100644 index 0000000000..d2ba557ec7 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/4.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/4_1.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/4_1.png new file mode 100644 index 0000000000..09e3faacb7 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/4_1.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/4_2.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/4_2.png new file mode 100644 index 0000000000..fd0965bb99 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/4_2.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/5.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/5.png new file mode 100644 index 0000000000..70863a30df Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/5.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/6.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/6.png new file mode 100644 index 0000000000..0c2926ca25 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/6.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/7.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/7.png new file mode 100644 index 0000000000..929b642340 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/7.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/Post.md b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/Post.md new file mode 100644 index 0000000000..960ad2ec66 --- /dev/null +++ b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/Post.md @@ -0,0 +1,325 @@ +![Cover](0.png) + +This year we attended NDC London as a sponsor for [ABP](https://abp.io). The conference was held at the same place [Queen Elizabeth II](https://qeiicentre.london/) as previous years. I guess this is the best conf for .NET developers around the world (thanks to the NDC team). And we attend last 5 years. It was 3 full days started from 28 to 30 January 2026. As an exhibitor we talked a lot with the attendees who stopped by our booth or while we were eating or in the conf rooms. + +This is the best opportunity to know what everyone is doing in software society. While I was explaining ABP to the people who first time heard, I also ask about what they do in their work. Developers mostly work on web platforms. And as you know, there's an AI transformation in our sector. That's why I wonder if other people also stick to the latest AI trend! Well... not as I expected. In Volosoft, we are tightly following AI trends, using in our daily development, injecting this new technology to our product and trying to benefit this as much as possible. + +![Our booth](1.png) + +This new AI trend is same as the invention of printing (by Johannes Gutenberg in 1450) or it's similar to invention of calculators (by William S. Burroughs in 1886). The countries who benefit these inventions got a huge increase in their welfare level. So, we welcome this new AI invention in software development, design, devops and testing. I also see this as a big wave in the ocean, if you are prepared and develop your skills, you can play with it 🌊 and it's called surfing or you'll die against the AI wave in this ocean. But not all the companies react this transformation quickly. Many developers use it like ChatGpt conversation (copy-paste from it) or using GitHub Co-Pilot in a limited manner. But as I heard from Steven Sanderson's session and other Microsoft employees, they are already using it to reproduce the bugs reported in the issues or creating even feature PRs via Co-Pilot. That's a good! + +Here're some pictures from the conf and that's me on the left side with brown shoes :) + +![Alper & Halil](2.png) + +Another thing I see, there's a decrease in the number of attendees'. I don't know the real reason but probably the IT companies cut the budget for conferences. As you also hear, many companies layoff because of the AI replaces some of the positions. + +The food was great during the conference. It was more like eating sessions for me. Lots of good meals from different countries' kitchen. In the second day, there was a party. People grabbed their beers, wines, beverages and did some networking. + +I was expecting more AI oriented sessions but it was less then my expectations. Even though I was an exhibitor, I tried to attend some of the session. I'll tell you my notes. + +--- + +Here's a quick video from the exhibitors' area on the 3rd floor and our ABP booth's Xbox raffle: + +**Video 1: NDC Conference 2026 Environment** 👉 [https://youtu.be/U1kiYG12KgA](https://youtu.be/U1kiYG12KgA) + +[![Video 1](youtube-cover-1.png)](https://youtu.be/U1kiYG12KgA) + + +**Video 2: Our raffle for XBOX** 👉 [https://youtu.be/7o0WX70qYw0](https://youtu.be/7o0WX70qYw0) +[![Video 2](youtube-cover-2.png)](https://youtu.be/7o0WX70qYw0) + +--- + + +## Sessions / Talks + +### The Dangers of Probably-Working Software | Damian Brady + +![Damian Session](3.png) + +The first session and keynote was from Damian Brady. He's part of Developer Advocacy team at GitHub. And the topic was "The dangers of probably-working software". He started with some negative impact of how generative AI is killing software, and he ended like this a not so bad, we can benefit from the AI transformation. First time I hear "sleepwalking" term for the development. He was telling when we generate code via AI, and if we don't review well-enough, we're sleepwalkers. And that's correct! and good analogy for this case. This talk centers on a powerful lesson: *“**Don’t ship code you don’t truly understand.**”* + Damian tells a personal story from his early .NET days when he implemented a **Huffman compression algorithm** based largely on Wikipedia. The code **“worked” in small tests** but **failed in production**. The experience forced him to deeply understand the algorithm rather than relying on copied solutions. Through this story, he explores themes of trust, complexity, testing, and mental models in software engineering. + +#### Notes From This Session + +- “It seems to work” is not the same as “I understand it.” +- Code copied from Wikipedia or StackOverflow or AI platforms is inherently risky in production. +- Passing tests on small datasets does not guarantee real-world reliability (happy path ~= unhappy results) +- Performance issues often surface only in edge cases. +- Delivery pressure can discourage deep understanding — to the detriment of quality. +- Always ask: “**When does this fail?**” — not just “**Why does this work?**” + +--- + + + +### Playing The Long Game | Sheena O'Connell + +![Sheena Session](4.png) + +Sheena is a former software engineer who now trains and supports tech educators. She talks about AI tools... +AI tools are everywhere but poorly understood; there’s hype, risks, and mixed results. The key question is how individuals and organisations should play the long game (long-term strategy) so skilled human engineers—especially juniors—can still grow and thrive. +She showed some statistics about how job postings on Indeed platform dramatically decreasing for software developers. About AI generated-code, she tells, it's less secure, there might be logical problems or interesting bugs, human might not read code very well and understanding/debugging code might sometimes take much longer time. + +Being an engineer is about much more than a job title — it requires systems thinking, clear communication, dealing with uncertainty, continuous learning, discipline, and good knowledge management. The job market is shifting: demand for AI-skilled workers is rising quickly and paying premiums, and required skills are changing faster in AI-exposed roles. There’s strength in using a diversity of models instead of locking into one provider, and guardrails improve reliability. + +AI is creating new roles (like AI security, observability, and operations) and new kinds of work, while routine attrition also opens opportunities. At the same time, heavy AI use can have negative cognitive effects: people may think less, feel lonelier, and prefer talking to AI over humans. + +Organizations are becoming more dynamic and project-based, with shorter planning cycles, higher trust, and more experimentation — but also risk of “shiny new toy” syndrome. Research shows AI can boost productivity by 15–20% in many cases, especially in simpler, greenfield projects and popular languages, but it can actually reduce productivity on very complex work. Overall, the recommendation is to focus on using AI well (not just the newest model), add monitoring and guardrails, keep flexibility, and build tools that allow safe experimentation. + +![Sheena Session 2](4_1.png) + +We’re in a messy, fast-moving AI era where LLM tools are everywhere but poorly understood. There’s a lot of hype and marketing noise, making it hard even for technical people to separate reality from fantasy. Different archetypes have emerged — from AI-optimists to skeptics — and both extremes have risks. AI is great for quick prototyping but unreliable for complex work, so teams need guardrails, better practices, and a focus on learning rather than “writing more code faster.” The key question is how individuals and organizations can play the long game so strong human engineers — especially juniors — can still grow and thrive in an AI-driven world. + +![Sheena Session 3](4_2.png) + +--- + +### Crafting Intelligent Agents with Context Engineering | Carly Richmond + +![Carly Session](5.png) + +Carly is a Developer Advocate Lead at Elastic in London with deep experience in web development and agile delivery from her years in investment banking. A practical UI engineer. She brings a clear, hands-on perspective to building real-world AI systems. In her talk on **“Crafting Intelligent Agents with Context Engineering,”** she argues that prompt engineering isn’t enough — and shows how carefully shaping context across data, tools, and systems is key to creating reliable, useful AI agents. She mentioned about the context of an AI process. The context consists of Instructions, Short Memory, Long Memory, RAG, User Prompts, Tools, Structured Output. + +--- + + + +### Modular Monoliths | Kevlin Henney + +![Kevlin Session](6.png) + +Kevlin frames the “microservices vs monolith” debate as a false dichotomy. His core argument is simple but powerful: problems rarely come from *being a monolith* — they come from being a **poorly structured one**. Modularity is not a deployment choice; it is an architectural discipline. + +#### **Notes from the Talk** + +- A monolith is not inherently bad; a tangled (intertwined, complex) monolith is. +- Architecture is mostly about **boundaries**, not boxes. +- If you cannot draw clean internal boundaries, you are not ready for microservices. +- Dependencies reveal your real architecture better than diagrams. +- Teams shape systems more than tools do. +- Splitting systems prematurely increases complexity without increasing clarity. +- Good modular design makes systems **easier to change, not just easier to scale**. + +#### **So As a Developer;** + +- Start with a well-structured modular monolith before considering microservices. +- Treat modules as real first-class citizens: clear ownership, clear contracts. +- Make dependency direction explicit — no circular graphs. +- Use internal architectural tests to prevent boundary violations. +- Organize code by *capability*, not by technical layer. +- If your team structure is messy, your architecture will be messy — fix people, not tech. + +--- + +### AI Coding Agents & Skills | Steve Sanderson + +**Being productive with AI Agents** + +![Steve Session](steve-sanderson-talk.png) + +In this session, Steve started how Microsoft is excessively using AI tools for PRs, reproducing bug reports etc... He's now working on **GitHub Co-Pilot Coding Agent Runtime Team**. He says, we use brains and hands less then anytime. + +![image-20260206004021726](steve-sanderson-talk_1.png) + +**In 1 Week 293 PRs Opened by the help of AI** + +![image-20260206004403643](steve-sanderson-talk_2.png) + +**He created a new feature to Copilot with the help of Copilot in minutes** + +![Steve](steve-sanderson-talk_3.png) + +> Code is cheap! Prototypes are almost free! + +And he summarized the AI assisted development into 10 outlines. These are Subagents, Plan Mode, Skills, Delegate, Memories, Hooks, MCP, Infinite Sessions, Plugins and Git Workflow. Let's see his statements for each of these headings: + +#### **1. Subagents** + +![image-20260206005620904](steve-sanderson-talk_4.png) + +- Break big problems into smaller, specialized agents. +- Each subagent should have a clear responsibility and limited scope. +- Parallel work is better than one “smart but slow” agent. +- Reduces hallucination by narrowing context per agent. +- Easier to debug: you can inspect each agent’s output separately. + + +------ + +#### **2. Plan Mode** + +![steve-sanderson-talk_6](steve-sanderson-talk_6.png) + +- Always start with a plan before generating code. +- The plan should be explicit, human-readable, and reviewable. +- You'll align your expectations with the AI's next steps. +- Prevents wasted effort on wrong directions. +- Encourages structured thinking instead of trial-and-error coding. + +------ + +#### **3. Skills** + +![steve-sanderson-talk_7](steve-sanderson-talk_7.png) + +- These are just Markdown files but (can be also tools, scripts as well) +- Skills are reusable capabilities for AI agents. +- You cannot just give all the info (as Markdown) to the AI context (limited!), skills are being used when necessary (by their Description field) +- Treat skills like APIs: versioned, documented, and shareable. +- Prefer many small skills over one big skill set. +- Store skills in Git, not in chat history. +- Skills should integrate with real tools (CI, GitHub, browsers, etc.). + +#### 3.1 Skill > Test Your Project Skill + +![steve-sanderson-talk_8](steve-sanderson-talk_8.png) + +------ + +#### **4. Delegate** + +> didn't mention much about this topic + +- “Delegate” refers to **offloading local work to the cloud**. +- Using remote computers for AI stuff not your local resources (agent continues the task remotely) + +##### **Ralph Force Do While Over and Over Until It Finishes** + +https://awesomeclaude.ai/ralph-wiggum + +> Who knows how much tokens it uses :) + +![image-20260206010621010](steve-sanderson-talk_5.png) + +------ + +#### **5. Memories** + +> didn't mention much about this topic + +- It's like don't write tests like this but write like that, and AI will remember it among your team members. + +- Copilot Memory allows Copilot to learn about your codebase, helping Copilot coding agent, Copilot code review, and Copilot CLI to work more effectively in a repository. + +- Treat memory like documentation that evolves over time. + +- Copilot Memory is **turned off by default** + +- https://docs.github.com/en/copilot/how-tos/use-copilot-agents/copilot-memory + + + +------ + +#### **6. Hooks** + +> didn't mention much about this topic + +![image-20260206015638169](steve-sanderson-talk_10.png) + +- Execute custom shell commands at key points during agent execution. +- Examples: pre-commit checks, PR reviews, test triggers. +- Hooks make AI proactive instead of reactive. +- They reduce manual context switching for developers. +- https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/use-hooks + +------ + +#### **7. MCP** + +- Talk to external tools. + +- Enables safe, controlled access to systems (files, APIs, databases). + +- Prevents random tool usage; everything is explicit. + + + +------ + +#### **8. Infinite Sessions** + +![Infinite Sessions](steve-sanderson-talk_11.png) + +- AI should remember the “project context,” not just the last message. +- Reduces repetition and re-explaining. +- Enables deeper reasoning over time. +- Memory + skills + hooks together make “infinite sessions” possible. +- https://docs.github.com/en/copilot/how-tos/copilot-cli/cli-best-practices#3-leverage-infinite-sessions + +------ + +#### **9. Plugins** + +![Plugins](steve-sanderson-talk_12.png) + +- Extend AI capabilities beyond core model features. +- https://github.com/marketplace?type=apps&copilot_app=true + +------ + +#### **10. Git Workflow** + +- AI should operate inside your existing Git process. +- Generate small, focused commits — not giant changes. +- Use AI for PR descriptions and code reviews. +- Keep humans in the loop for design decisions. +- Branching strategy still matters; AI doesn’t replace it. +- Treat AI like a junior teammate: helpful, but needs supervision. +- CI + tests remain your primary safety net, not the model. +- Keep feedback loops fast: generate → test → review → refine. + +**Copilot as SDK** + +You can wrap GitHub CoPilot into your app as below: + +![steve-sanderson-talk_9](steve-sanderson-talk_9.png) + +#### **As a Developer What You Need to Get from Steve's Talk;** + +- Coding agents work best when you treat them like programmable teammates, not autocomplete tools. +- “Skills” are the right abstraction for scaling AI assistants across a team. +- Treat skills like shared APIs: version them, review them, and store them in source control. +- Skills can be installed from Git repos (marketplaces), not just created locally. +- Slash commands make skills fast, explicit, and reproducible in daily workflow. +- Use skills to bridge AI ↔ real systems (e.g., GitHub Actions, Playwright, build status). +- Automation skills are most valuable when they handle end-to-end flows (browser + app + data). +- Let the agent *discover* the right skill rather than hard-coding every step. +- Skills reduce hallucination risk by constraining what the agent is allowed to do. + +--- + +### My Personal Notes about AI + +- This is your code tech stack for a basic .NET project: + + - Assembly > MSIL > C# > ASP.NET Core > ...ABP... >NuGet + NPM > Your Handmade Business Code + + When we ask a development to an AI assisted IDE, AI never starts from Assembly or even it's not writing an existing NPM package. It basically uses what's there on the market. So we know frameworks like ASP.NET Core, ABP will always be there after AI evolution. + +- Software engineer is not just writing correct syntax code to explain a program to computer. As an engineer you need to understand the requirements, design the problem, make proper decisions and fix the uncertainty. Asking AI the right questions is very critical these days. + +- Tesla cars already started to go autonomous. As a driver, you don't need to care about how the car is driven. You need to choose the right way to go in the shortest time without hussle. + +- I talk with other software companies owners, they also say their docs website visits are down. I talked to another guy who's making video tutorials to Pluralsight, he's telling learning from video is decreasing nowadays... + +- Nowadays, **developers big new issue is Reviewing the AI generated-code.** In the future, developers who use AI, who inspect AI generated code well and who tells the AI exactly what's needed will be the most important topics. Others (who's typing only code) will be naturally eliminated. Invest your time for these topics. + +- We see that our brain is getting lazier, our coding muscles gets weaker day by day. Just like after calculator invention, we stopped calculate big numbers. We'll eventually forget coding. But maybe that's what it needs to be! + +- Also I don't think AI will replace developers. Think about washing machines. Since they came out, they still need humans to put the clothes in the machine, pick the best program, take out from the machine and iron. From now on, AI is our assistance in every aspect of our life from shopping, medical issues, learning to coding. Let's benefit from it. + + + +#### Software and service stocks shed $830 billion in market value in six trading days + +Software stocks fall on AI disruption fears on Feb 4, 2026 in NASDAQ. Software and service stocks shed $830 billion in market value in six trading days. Scramble to shield portfolios as AI muddies valuations, business prospects. + + + +![Reuters](7.png) + +**We need to be well prepared for this war.** diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/cover.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/cover.png new file mode 100644 index 0000000000..1cae98768d Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/cover.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/image-20260206003328436.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/image-20260206003328436.png new file mode 100644 index 0000000000..d5011d5e05 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/image-20260206003328436.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/image-20260206004046914.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/image-20260206004046914.png new file mode 100644 index 0000000000..ed58dee23d Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/image-20260206004046914.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/image-20260206012506799.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/image-20260206012506799.png new file mode 100644 index 0000000000..32afa62e31 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/image-20260206012506799.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk.png new file mode 100644 index 0000000000..0fe03dd06b Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_1.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_1.png new file mode 100644 index 0000000000..126cbd0087 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_1.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_10.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_10.png new file mode 100644 index 0000000000..6c07156bdd Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_10.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_11.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_11.png new file mode 100644 index 0000000000..13d882ef8a Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_11.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_12.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_12.png new file mode 100644 index 0000000000..bce854623f Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_12.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_2.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_2.png new file mode 100644 index 0000000000..dcacfe3ece Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_2.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_3.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_3.png new file mode 100644 index 0000000000..dac8c92fbd Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_3.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_4.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_4.png new file mode 100644 index 0000000000..e9b9922ba8 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_4.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_5.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_5.png new file mode 100644 index 0000000000..19ecee63e6 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_5.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_6.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_6.png new file mode 100644 index 0000000000..d27edb10da Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_6.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_7.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_7.png new file mode 100644 index 0000000000..fac014da97 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_7.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_8.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_8.png new file mode 100644 index 0000000000..371d7890ca Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_8.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_9.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_9.png new file mode 100644 index 0000000000..3862509f64 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/steve-sanderson-talk_9.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/youtube-cover-1.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/youtube-cover-1.png new file mode 100644 index 0000000000..9a8fb1ab31 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/youtube-cover-1.png differ diff --git a/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/youtube-cover-2.png b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/youtube-cover-2.png new file mode 100644 index 0000000000..6846be7edf Binary files /dev/null and b/docs/en/Community-Articles/2026-02-03-Impressions-of-NDC-London-2026/youtube-cover-2.png differ diff --git a/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/demo.gif b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/demo.gif new file mode 100644 index 0000000000..467a2ed0df Binary files /dev/null and b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/demo.gif differ diff --git a/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/abp-studio-ai-management.png b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/abp-studio-ai-management.png new file mode 100644 index 0000000000..d38cc7114e Binary files /dev/null and b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/abp-studio-ai-management.png differ diff --git a/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/ai-management-widget.png b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/ai-management-widget.png new file mode 100644 index 0000000000..2f396f3e5a Binary files /dev/null and b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/ai-management-widget.png differ diff --git a/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/ai-management-workspaces.png b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/ai-management-workspaces.png new file mode 100644 index 0000000000..82726fe0ae Binary files /dev/null and b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/ai-management-workspaces.png differ diff --git a/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/example-comment.png b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/example-comment.png new file mode 100644 index 0000000000..909647bf23 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/images/example-comment.png differ diff --git a/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/post.md b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/post.md new file mode 100644 index 0000000000..9f8ebd3374 --- /dev/null +++ b/docs/en/Community-Articles/2026-02-04-Omni-Moderation-in-AI-Management-Module/post.md @@ -0,0 +1,488 @@ +# Using OpenAI's Moderation API in an ABP Application with the AI Management Module + +If your application accepts user-generated content (comments, reviews, forum posts) you likely need some form of content moderation. Building one from scratch typically means training ML models, maintaining datasets, and writing a lot of code. OpenAI's `omni-moderation-latest` model offers a practical shortcut: it's free, requires no training data, and covers 13+ harm categories across text and images in 40+ languages. + +In this article, I'll show you how to integrate this model into an ABP application using the [**AI Management Module**](https://abp.io/docs/latest/modules/ai-management). We'll wire it into the [CMS Kit Module's Comment Feature](https://abp.io/docs/latest/modules/cms-kit/comments) so every comment is automatically screened before it's published. The **AI Management Module** handles the OpenAI configuration (API keys, model selection, etc.) through a runtime UI, so you won't need to hardcode any of that into your `appsettings.json` or redeploy when something changes. + +By the end, you'll have a working content moderation pipeline you can adapt for any entity in your ABP project. + +## Understanding OpenAI's Omni-Moderation Model + +Before diving into the implementation, let's understand what makes OpenAI's `omni-moderation-latest` model a game-changer for content moderation. + +### What is it? + +OpenAI's `omni-moderation-latest` is a next-generation multimodal content moderation model built on the foundation of GPT-4o. Released in September 2024, this model represents a significant leap forward in automated content moderation capabilities. + +The most remarkable aspect? **It's completely free to use** through OpenAI's Moderation API, there are no token costs, no usage limits for reasonable use cases, and no hidden fees. + +### Key Capabilities + +The **omni-moderation** model offers several compelling features that make it ideal for production applications: + +- **Multimodal Understanding**: Unlike text-only moderation systems, this model *can process both text and image inputs*, making it suitable for applications where users can upload images alongside their comments or posts. +- **High Accuracy**: Built on GPT-4o's advanced understanding capabilities, the model achieves significantly higher accuracy in detecting nuanced harmful content compared to rule-based systems or simpler ML models. +- **Multilingual Support**: The model demonstrates enhanced performance across more than 40 languages, making it suitable for global applications without requiring separate moderation systems for each language. +- **Comprehensive Category Coverage**: Rather than just detecting "spam" or "not spam," the model classifies content across 13+ distinct categories of potentially harmful content. + +### Content Categories + +The model evaluates content against the following categories, each designed to catch specific types of harmful content: + +| Category | What It Detects | +|----------|-----------------| +| `harassment` | Content that expresses, incites, or promotes harassing language towards any individual or group | +| `harassment/threatening` | Harassment content that additionally includes threats of violence or serious harm | +| `hate` | Content that promotes hate based on race, gender, ethnicity, religion, nationality, sexual orientation, disability, or caste | +| `hate/threatening` | Hateful content that includes threats of violence or serious harm towards the targeted group | +| `self-harm` | Content that promotes, encourages, or depicts acts of self-harm such as suicide, cutting, or eating disorders | +| `self-harm/intent` | Content where the speaker expresses intent to engage in self-harm | +| `self-harm/instructions` | Content that provides instructions or advice on how to commit acts of self-harm | +| `sexual` | Content meant to arouse sexual excitement, including descriptions of sexual activity or promotion of sexual services | +| `sexual/minors` | Sexual content that involves individuals under 18 years of age | +| `violence` | Content that depicts death, violence, or physical injury in graphic detail | +| `violence/graphic` | Content depicting violence or physical injury in extremely graphic, disturbing detail | +| `illicit` | Content that provides advice or instructions for committing illegal activities | +| `illicit/violent` | Illicit content that specifically involves violence or weapons | + +### API Response Structure + +When you send content to the Moderation API (through model or directly to the API), you receive a structured response containing: + +- **`flagged`**: A boolean indicating whether the content violates any of OpenAI's usage policies. This is your primary indicator for whether to block content. +- **`categories`**: A dictionary containing boolean flags for each category, telling you exactly which policies were violated. +- **`category_scores`**: Confidence scores ranging from 0 to 1 for each category, allowing you to implement custom thresholds if needed. +- **`category_applied_input_types`**: A dictionary containing information on which input types were flagged for each category. For example, if both the image and text inputs to the model are flagged for "violence/graphic", the `violence/graphic` property will be set to `["image", "text"]`. This is only available on omni models. + +> For more detailed information about the model's capabilities and best practices, refer to the [OpenAI Moderation Guide](https://platform.openai.com/docs/guides/moderation). + +## The AI Management Module: Your Dynamic AI Configuration Hub + +The [AI Management Module](https://abp.io/docs/latest/modules/ai-management) is a powerful addition to the ABP Platform that transforms how you integrate and manage AI capabilities in your applications. Built on top of the [ABP Framework's AI infrastructure](https://abp.io/docs/latest/framework/infrastructure/artificial-intelligence), it provides a complete solution for managing AI workspaces dynamically—without requiring code changes or application redeployment. + +### Why Use the AI Management Module? + +Traditional AI integrations often suffer from several pain points: + +1. **Hardcoded Configuration**: API keys, model names, and endpoints are typically stored in configuration files, requiring redeployment for any changes. +2. **No Runtime Flexibility**: Switching between AI providers or models requires code changes. +3. **Security Concerns**: Managing API keys across environments is cumbersome and error-prone. +4. **Limited Visibility**: There's no easy way to see which AI configurations are active or test them without writing code. + +The AI Management Module addresses all these concerns by providing: + +- **Dynamic Workspace Management**: Create, configure, and update AI workspaces directly from a user-friendly administrative interface—no code changes required. +- **Provider Flexibility**: Seamlessly switch between different AI providers (OpenAI, Gemini, Antrophic, Azure OpenAI, Ollama, and custom providers) without modifying your application code. +- **Built-in Testing**: Test your AI configurations immediately using the included chat interface playground before deploying to production. +- **Permission-Based Access Control**: Define granular permissions to control who can manage AI workspaces and who can use specific AI features. +- **Multi-Framework Support**: Full support for MVC/Razor Pages, Blazor (Server & WebAssembly), and Angular UI frameworks. + +### Built-in Provider Support + +The **AI Management Module** comes with built-in support for popular AI providers through dedicated NuGet packages: + +- **`Volo.AIManagement.OpenAI`**: Provides seamless integration with OpenAI's APIs, including GPT models and the *Moderation API*. +- Custom providers can be added by implementing the `IChatClientFactory` interface. (If you configured the Ollama while creating your project, then you can see the example implementation for Ollama) + +## Building the Demo Application + +Now let's put theory into practice by building a complete content moderation system. We'll create an ABP application with the **AI Management Module**, configure OpenAI as our provider, set up the CMS Kit Comment Feature, and implement automatic content moderation for all user comments. + +### Step 1: Creating an Application with AI Management Module + +> In this tutorial, I'll create a **layered MVC application** named **ContentModeration**. If you already have an existing solution, you can follow along by replacing the namespaces accordingly. Otherwise, feel free to follow the solution creation steps below. + +The most straightforward way to create an application with the AI Management Module is through **ABP Studio**. When you create a new project, you'll encounter an **AI Integration** step in the project creation wizard. This wizard allows you to: + +- Enable the AI Management Module with a single checkbox +- Configure your preferred AI provider (OpenAI and Ollama) +- Set up initial workspace configurations +- Automatically install all required NuGet packages + +> **Note:** The AI Integration tab in ABP Studio currently only supports the **MVC/Razor Pages** UI. Support for **Angular** and **Blazor** UIs will be added in upcoming versions. + +![ABP Studio AI Management](images/abp-studio-ai-management.png) + +During the wizard, select **OpenAI** as your AI provider, set the model name as `omni-moderation-latest` and provide your API key. The wizard will automatically: + +1. Install the `Volo.AIManagement.*` packages across your solution +2. Install the `Volo.AIManagement.OpenAI` package for OpenAI provider support (you can use any OpenAI compatible model here, including Gemini, Claude and GPT models) +3. Configure the necessary module dependencies +4. Set up initial database migrations + +**Alternative Installation Method:** + +If you have an existing project or prefer manual installation, you can add the module using the ABP CLI: + +```bash +abp add-module Volo.AIManagement +``` + +Or through ABP Studio by right-clicking on your solution, selecting **Import Module**, and choosing `Volo.AIManagement` from the NuGet tab. + +### Step 2: Understanding the OpenAI Workspace Configuration + +After creating your project and running the application for the first time, navigate to **AI Management > Workspaces** in the admin menu. Here you'll find the workspace management interface where you can view, create, and modify AI workspaces. + +![AI Management Workspaces](images/ai-management-workspaces.png) + +If you configured OpenAI during the project creation wizard, you'll already have a workspace set up. Otherwise, you can create a new workspace with the following configuration: + +| Property | Value | Description | +|----------|-------|-------------| +| **Name** | `OpenAIAssistant` | A unique identifier for this workspace (no spaces allowed) | +| **Provider** | `OpenAI` | The AI provider to use | +| **Model** | `omni-moderation-latest` | The specific model for content moderation | +| **API Key** | `` | Authentication credential for the OpenAI API | +| **Description** | `Workspace for content moderation` | A helpful description for administrators | + +The beauty of this approach is that you can modify any of these settings at runtime through the UI. Need to rotate your API key? Just update it in the workspace configuration. Want to test a different model? Change it without touching your code. + +### Step 3: Setting Up the CMS Kit Comment Feature + +Now let's add the CMS Kit Module to enable the Comment Feature. The CMS Kit provides a robust, production-ready commenting system that we'll enhance with our content moderation. + +**Install the CMS Kit Module:** + +Run the following command in your solution directory: + +```bash +abp add-module Volo.CmsKit --skip-db-migrations +``` + +> Also, you can add the related module through ABP Studio UI. + +**Enable the Comment Feature:** + +By default, CMS Kit features are disabled to keep your application lean. Open the `GlobalFeatureConfigurator` class in your `*.Domain.Shared` project and enable the Comment Feature: + +```csharp +using Volo.Abp.GlobalFeatures; +using Volo.Abp.Threading; + +namespace ContentModeration; + +public static class ContentModerationGlobalFeatureConfigurator +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => + { + //only enable the Comment Feature + cmsKit.Comments.Enable(); + }); + }); + } +} +``` + +**Configure the Comment Entity Types:** + +Open your `*DomainModule` class and configure which entity types can have comments. For our demo, we'll enable comments on "Article" entities: + +```csharp +using Volo.CmsKit.Comments; + +// In your ConfigureServices method: +Configure(options => +{ + options.EntityTypes.Add(new CommentEntityTypeDefinition("Article")); +}); +``` + +**Add the Comment Component to a Page:** + +Finally, let's add the commenting interface to a page. Open the `Index.cshtml` file in your `*.Web` project and add the Comment component (replace with the following content): + +```html +@page +@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Commenting +@model ContentModeration.Web.Pages.IndexModel + +
+
+
+

Welcome to Our Community

+
+
+

+ Share your thoughts in the comments below. Our AI-powered moderation system + automatically reviews all comments to ensure a safe and respectful environment + for everyone. +

+ +
+ +

Comments

+ @await Component.InvokeAsync(typeof(CommentingViewComponent), new + { + entityType = "Article", + entityId = "welcome-article", + isReadOnly = false + }) +
+
+
+``` + +At this point, you have a fully functional commenting system. Users can post comments, reply to existing comments, and interact with the community. + +![](./images/example-comment.png) + +However, there's no content moderation yet and any content, including harmful content, would be accepted. Let's fix that! + +## Implementing the Content Moderation Service + +**Now comes the exciting part:** implementing the content moderation service that leverages OpenAI's `omni-moderation` model to automatically screen all comments before they're published. + +### Understanding the Architecture + +Our implementation follows a clean, modular architecture: + +1. **`IContentModerator` Interface**: Defines the contract for content moderation, making our implementation testable and replaceable. +2. **`ContentModerator` Service**: The concrete implementation that calls OpenAI's Moderation API using the configuration from the AI Management Module. +3. **`MyCommentAppService`**: An override of the CMS Kit's comment service that integrates our moderation logic. + +This separation of concerns ensures that: + +- The moderation logic is isolated and can be unit tested independently +- You can easily swap the moderation implementation (e.g., switch to a different provider) +- The integration with CMS Kit is clean and maintainable + +### Creating the Content Moderator Interface + +First, let's define the interface in your `*.Application.Contracts` project. This interface is intentionally simple and it takes text input and throws an exception if the content is harmful: + +```csharp +using System.Threading.Tasks; + +namespace ContentModeration.Moderation; + +public interface IContentModerator +{ + Task CheckAsync(string text); +} +``` + +### Implementing the Content Moderator Service + +Now let's implement the service in your `*.Application` project. This implementation uses the `IWorkspaceConfigurationStore` from the AI Management Module to dynamically retrieve the OpenAI configuration: + +```csharp +using System.Collections.Generic; +using System.Threading.Tasks; +using OpenAI.Moderations; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.AIManagement.Workspaces.Configuration; + +namespace ContentModeration.Moderation; + +public class ContentModerator : IContentModerator, ITransientDependency +{ + private readonly IWorkspaceConfigurationStore _workspaceConfigurationStore; + + public ContentModerator(IWorkspaceConfigurationStore workspaceConfigurationStore) + { + _workspaceConfigurationStore = workspaceConfigurationStore; + } + + public async Task CheckAsync(string text) + { + // Skip moderation for empty content + if (string.IsNullOrWhiteSpace(text)) + { + return; + } + + // Retrieve the workspace configuration from AI Management Module + // This allows runtime configuration changes without redeployment + var config = await _workspaceConfigurationStore.GetOrNullAsync(); + + if(config == null) + { + throw new UserFriendlyException("Could not find the 'OpenAIAssistant' workspace!"); + } + + var client = new ModerationClient( + model: config.Model, + apiKey: config.ApiKey + ); + + // Send the text to OpenAI's Moderation API + var result = await client.ClassifyTextAsync(text); + var moderationResult = result.Value; + + // If the content is flagged, throw a user-friendly exception + if (moderationResult.Flagged) + { + var flaggedCategories = GetFlaggedCategories(moderationResult); + + throw new UserFriendlyException( + $"Your comment contains content that violates our community guidelines. " + + $"Detected issues: {string.Join(", ", flaggedCategories)}. " + + $"Please revise your comment and try again." + ); + } + } + + private static List GetFlaggedCategories(ModerationResult result) + { + var flaggedCategories = new List(); + + if (result.Harassment.Flagged) + { + flaggedCategories.Add("harassment"); + } + if (result.HarassmentThreatening.Flagged) + { + flaggedCategories.Add("threatening harassment"); + } + + //other categories... + + return flaggedCategories; + } +} +``` + +> **Note**: The `ModerationResult` class from the OpenAI .NET SDK provides properties for each moderation category (e.g., `Harassment`, `Violence`, `Sexual`), each with a `Flagged` boolean and a `Score` float (0-1). The exact property names may vary slightly between SDK versions, so check the [OpenAI .NET SDK documentation](https://github.com/openai/openai-dotnet) for the latest API. + +### Integrating with CMS Kit Comments + +The final piece of the puzzle is integrating our moderation service with the CMS Kit's comment system. We'll override the `CommentPublicAppService` to intercept all comment creation and update requests: + +```csharp +using System; +using System.Threading.Tasks; +using ContentModeration.Moderation; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; +using Volo.CmsKit.Comments; +using Volo.CmsKit.Public.Comments; +using Volo.CmsKit.Users; +using Volo.Abp.SettingManagement; + +namespace ContentModeration.Comments; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(ICommentPublicAppService), typeof(CommentPublicAppService), typeof(MyCommentAppService))] +public class MyCommentAppService : CommentPublicAppService +{ + protected IContentModerator ContentModerator { get; } + + public MyCommentAppService( + ICommentRepository commentRepository, + ICmsUserLookupService cmsUserLookupService, + IDistributedEventBus distributedEventBus, + CommentManager commentManager, + IOptionsSnapshot cmsCommentOptions, + ISettingManager settingManager, + IContentModerator contentModerator) + : base(commentRepository, cmsUserLookupService, distributedEventBus, commentManager, cmsCommentOptions, settingManager) + { + ContentModerator = contentModerator; + } + + public override async Task CreateAsync(string entityType, string entityId, CreateCommentInput input) + { + // Check for harmful content BEFORE creating the comment + // If harmful content is detected, an exception is thrown and the comment is not saved + await ContentModerator.CheckAsync(input.Text); + + return await base.CreateAsync(entityType, entityId, input); + } + + public override async Task UpdateAsync(Guid id, UpdateCommentInput input) + { + // Check for harmful content BEFORE updating the comment + // This prevents users from editing approved comments to add harmful content + await ContentModerator.CheckAsync(input.Text); + + return await base.UpdateAsync(id, input); + } +} +``` + +**How This Works:** + +1. When a user submits a new comment, the `CreateAsync` method is called. +2. Before the comment is saved to the database, we call `ContentModerator.CheckAsync()` with the comment text. +3. The moderation service sends the text to OpenAI's Moderation API. +4. If the content is flagged as harmful, a `UserFriendlyException` is thrown with a descriptive message. +5. The exception is caught by ABP's exception handling middleware and displayed to the user as a friendly error message. +6. If the content passes moderation, the comment is saved normally. + +The same flow applies to comment updates, ensuring users can't circumvent moderation by editing previously approved comments. + +Here's the full flow in action — submitting a comment with harmful content and seeing the moderation kick in: + +![Content moderation demo](demo.gif) + +## The Power of Dynamic Configuration - What AI Management Module Provides to You? + +One of the most significant advantages of using the AI Management Module is the ability to manage your AI configurations dynamically. Let's explore what this means in practice. + +### Runtime Configuration Changes + +With the AI Management Module, you can: + +- **Rotate API Keys**: Update your OpenAI API key through the admin UI without any downtime or redeployment. This is crucial for security compliance and key rotation policies. +- **Switch Models**: Want to test a newer moderation model? Simply update the model name in the workspace configuration. Your application will immediately start using the new model. +- **Adjust Settings**: Fine-tune settings like temperature or system prompts (for chat-based workspaces) without touching your codebase. +- **Enable/Disable Workspaces**: Temporarily disable a workspace for maintenance or testing without affecting other parts of your application. + +### Multi-Environment Management + +The dynamic configuration approach shines in multi-environment scenarios: + +- **Development**: Use a test API key with lower rate limits +- **Staging**: Use a separate API key for integration testing +- **Production**: Use your production API key with appropriate security measures + +All these configurations can be managed through the UI or via data seeding, without environment-specific code changes. + +### Actively Maintained & What's Coming Next + +The AI Management Module is **actively maintained** and continuously evolving. The team is working on exciting new capabilities that will further expand what you can do with AI in your ABP applications: + +- **MCP (Model Context Protocol) Support** — Coming in **v10.2**, MCP support will allow your AI workspaces to interact with external tools and data sources, enabling more sophisticated AI-powered workflows. +- **RAG (Retrieval-Augmented Generation) System** — Also planned for **v10.2**, the built-in RAG system will let you ground AI responses in your own data, making AI features more accurate and context-aware. +- **And More** — Additional features and improvements are on the roadmap to make AI integration even more seamless. + +Since the module is built on ABP's modular architecture, adopting these new capabilities will be straightforward — you can simply update the module and start using the new features without rewriting your existing AI integrations. + +### Permission-Based Access Control + +The AI Management Module integrates with ABP's permission system, allowing you to: + +- Restrict who can view AI workspace configurations +- Control who can create or modify workspaces +- Limit access to specific workspaces based on user roles + +This ensures that sensitive configurations like API keys are only accessible to authorized administrators. + +## Conclusion + +In this comprehensive guide, we've built a production-ready content moderation system that combines the power of OpenAI's `omni-moderation-latest` model with the flexibility of ABP's AI Management Module. Let's recap what makes this approach powerful: + +### Key Takeaways + +1. **Zero Training Required**: Unlike traditional ML approaches that require collecting datasets, training models, and ongoing maintenance, OpenAI's Moderation API works out of the box with state-of-the-art accuracy. +2. **Completely Free**: OpenAI's Moderation API has no token costs, making it economically viable for applications of any scale. +3. **Comprehensive Detection**: With 13+ categories of harmful content detection, you get protection against harassment, hate speech, violence, sexual content, self-harm, and more—all from a single API call. +4. **Dynamic Configuration**: The AI Management Module allows you to manage API keys, switch providers, and adjust settings at runtime without code changes or redeployment. +5. **Clean Integration**: By following ABP's service override pattern, we integrated moderation seamlessly into the existing CMS Kit comment system without modifying the original module. +6. **Production Ready**: The implementation includes proper error handling, graceful degradation, and user-friendly error messages suitable for production use. + +### Resources + +- [AI Management Module Documentation](https://abp.io/docs/latest/modules/ai-management) +- [OpenAI Moderation Guide](https://platform.openai.com/docs/guides/moderation) +- [CMS Kit Comments Feature](https://abp.io/docs/latest/modules/cms-kit/comments) +- [ABP Framework AI Infrastructure](https://abp.io/docs/latest/framework/infrastructure/artificial-intelligence) \ No newline at end of file diff --git a/docs/en/Community-Articles/2026-02-19-ABP-Framework-Hidden-Magic/images/cover.png b/docs/en/Community-Articles/2026-02-19-ABP-Framework-Hidden-Magic/images/cover.png new file mode 100644 index 0000000000..de15addde2 Binary files /dev/null and b/docs/en/Community-Articles/2026-02-19-ABP-Framework-Hidden-Magic/images/cover.png differ diff --git a/docs/en/Community-Articles/2026-02-19-ABP-Framework-Hidden-Magic/post.md b/docs/en/Community-Articles/2026-02-19-ABP-Framework-Hidden-Magic/post.md new file mode 100644 index 0000000000..6eb19b44bc --- /dev/null +++ b/docs/en/Community-Articles/2026-02-19-ABP-Framework-Hidden-Magic/post.md @@ -0,0 +1,566 @@ +# ABP Framework's Hidden Magic: Things That Just Work Without You Knowing + +The ABP Framework is famous for its Convention-over-Configuration approach, which means a lot of things work automatically without explicit configuration. In this article, I'll uncover these "hidden magics" that make ABP so powerful but often go unnoticed by developers. + +--- + +## 1. Automatic Service Registration Without Any Attributes + +**The Magic:** Any class implementing `ITransientDependency`, `ISingletonDependency`, or `IScopedDependency` is automatically registered with the corresponding lifetime. + +```csharp +// This is automatically registered as Transient - no configuration needed! +public class MyService : IMyService, ITransientDependency +{ + public void DoSomething() { } +} +``` + +**Where it happens:** `Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs` + +The framework scans all assemblies and automatically determines service lifetime from class hierarchy. This is why you rarely need to manually register services in ABP. + +--- + +## 2. All Interfaces Are Exposed By Default + +**The Magic:** When you register a service, it's automatically registered as both itself AND all its implemented interfaces. + +```csharp +public class UserService : IUserService, IValidationInterceptor +{ + // Registered as both IUserService AND IValidationInterceptor + // No ExposeServices attribute needed! +} +``` + +**Where it happens:** `Volo.Abp.Core/DependencyInjection/ExposedServiceExplorer.cs:9-14` + +```csharp +private static readonly ExposeServicesAttribute DefaultExposeServicesAttribute = + new ExposeServicesAttribute + { + IncludeDefaults = true, + IncludeSelf = true + }; +``` + +--- + +## 3. Automatic Validation on Every Method + +**The Magic:** Every application service method parameters are automatically validated - you don't need to add `[Validate]` attributes. + +**Where it happens:** `Volo.Abp.Validation/ValidationInterceptorRegistrar.cs` + +The `ValidationInterceptor` is automatically added to the interceptor pipeline for all services. Every method call triggers automatic validation of input parameters. + +--- + +## 4. Automatic Unit of Work Management + +**The Magic:** Every database operation is automatically wrapped in a transaction. You don't need to explicitly configure unit of work for most scenarios. + +**Where it happens:** The `UnitOfWorkInterceptor` is auto-registered and automatically: +- Begins transaction before method execution +- Commits on success +- Rolls back on exception + +--- + +## 5. Auditing Is Enabled By Default + +**The Magic:** Auditing is **ON** by default, even for anonymous users! + +```csharp +public class AbpAuditingOptions +{ + public AbpAuditingOptions() + { + IsEnabled = true; // Enabled by default! + IsEnabledForAnonymousUsers = true; // Anonymous users are audited! + HideErrors = true; // Errors are silently hidden + AlwaysLogOnException = true; // Exceptions always logged + } +} +``` + +**Where it happens:** `Volo.Abp.Auditing/AbpAuditingOptions.cs:73-91` + +This means every entity change and service call is logged automatically unless explicitly disabled. + +--- + +## 6. Security Logging Is Always On + +**The Magic:** Security logging is enabled by default in ABP! + +```csharp +public AbpSecurityLogOptions() +{ + IsEnabled = true; // Hidden: ON by default! +} +``` + +Every authentication attempt, authorization failure, and security-relevant action is logged automatically. + +--- + +## 7. Data Filters Are Enabled By Default + +**The Magic:** `ISoftDelete` and `IMultiTenant` filters are **enabled by default**. + +```csharp +// In DataFilter.cs - Line 103 +_filter.Value = _options.DefaultStates.GetOrDefault(typeof(TFilter))?.Clone() + ?? new DataFilterState(true); // true = enabled! +``` + +This means: +- Deleted entities are automatically filtered out +- Multi-tenant data is automatically isolated + +You must explicitly **disable** these filters when you need to access all data: + +```csharp +using (_dataFilter.Disable()) +{ + // Query all tenants +} +``` + +--- + +## 8. Object Mapping (Mapperly - The New Standard) + +**The Magic:** Starting with **ABP v9.0**, new project templates use **Mapperly** instead of AutoMapper. Any class using Mapperly attributes is automatically configured. + +```csharp +// Starting with ABP v10.0, new projects use Mapperly instead of AutoMapper + +// Inherit from MapperBase - automatically registered with IObjectMapper +public partial class UserMapper : MapperBase +{ + public override partial UserDto Map(User source); +} + +// For two-way mapping +public partial class UserTwoWayMapper : TwoWayMapperBase +{ + public override partial UserDto Map(User source); + public override partial User ReverseMap(UserDto source); +} +``` + +The mapping is done at **compile-time** (no reflection overhead), and it's automatically registered with ABP's `IObjectMapper`. + +**Where it happens:** `Volo.Abp.Mapperly/AbpMapperlyConventionalRegistrar.cs` + +```csharp +// Automatically discovers and configures all Mapperly mappers +context.Services.OnRegistered(context => +{ + if (typeof(MapperBase).IsAssignableFrom(context.ImplementationType)) + { + // Register the mapper + } +}); +``` + +--- + +## 9. Automatic Data Seed Contributor Discovery + +**The Magic:** Any class implementing `IDataSeedContributor` is automatically discovered and executed on application startup. + +```csharp +// Automatically discovered and run on startup! +public class MyDataSeeder : IDataSeedContributor +{ + public Task SeedAsync(DataSeedContext context) + { + // Seed data here + } +} +``` + +**Where it happens:** `Volo.Abp.Data/AbpDataModule.cs:40-56` + +--- + +## 10. Automatic Definition Provider Discovery + +**The Magic:** These are all auto-discovered without any configuration: + +- `ISettingDefinitionProvider` - Settings +- `IPermissionDefinitionProvider` - Permissions +- `IFeatureDefinitionProvider` - Features +- `INavigationProvider` - Navigation items + +--- + +## 11. Automatic Widget Discovery + +**The Magic:** Any class implementing `IWidget` is automatically registered and can be rendered in pages. + +**Where it happens:** `Volo.Abp.AspNetCore.Mvc.UI.Widgets/AbpAspNetCoreMvcUiWidgetsModule.cs` + +--- + +## 12. Remote Services Are Enabled By Default + +**The Magic:** All API controllers have remote service functionality enabled by default: + +```csharp +public class RemoteServiceAttribute : Attribute +{ + public bool IsEnabled { get; set; } = true; // Enabled by default! +} +``` + +--- + +## 13. Auto API Controllers - Application Services Become REST APIs Automatically + +**The Magic:** When you create an application service (class implementing an interface or inheriting from `ApplicationService`), ABP **automatically** creates REST API endpoints for it - no manual controller needed! + +```csharp +// This interface is automatically exposed as /api/app/product +public interface IProductAppService +{ + Task> GetListAsync(); + Task CreateAsync(CreateProductDto input); + Task DeleteAsync(Guid id); +} + +// The implementation automatically becomes an API Controller +public class ProductAppService : ApplicationService, IProductAppService +{ + public Task> GetListAsync() { ... } + public Task CreateAsync(CreateProductDto input) { ... } + public Task DeleteAsync(Guid id) { ... } +} + +// Available endpoints (auto-generated): +// GET /api/app/product +// POST /api/app/product +// DELETE /api/app/product/{id} +``` + +**Where it happens:** `Volo.Abp.AspNetCore.Mvc/AbpServiceConvention.cs` + +The framework: +- Converts camelCase method names to kebab-case routes +- Maps HTTP methods automatically (Get→GET, Create→POST, Delete→DELETE) +- Generates proper DTOs from parameters and return types +- Handles serialization/deserialization + +--- + +## 14. Dynamic Client Proxies - Client-Side Code Generated Automatically + +**The Magic:** On the client side, you don't need to write HTTP client code. ABP automatically generates **Dynamic JavaScript Proxies** and **Dynamic C# Proxies** that let you call your APIs as if they were local method calls! + +**JavaScript (MVC/Razor Pages):** +```javascript +// Just call it like a local function! +var products = await productAppService.getList(); +await productAppService.create({ name: "New Product" }); +await productAppService.delete(id); +``` + +**C# (Blazor/Console Apps):** +```csharp +// Inject and use like local method calls! +public class ProductListModel : PageModel +{ + private readonly IProductAppService _productAppService; + + public async Task OnGetAsync() + { + // Actually makes HTTP call to the server! + var products = await _productAppService.GetListAsync(); + } +} +``` + +**Where it happens:** +- JavaScript: `Volo.Abp.AspNetCore.Mvc.UI` - Dynamic JavaScript proxies +- C#: `Volo.Abp.AspNetCore.Mvc.Client` - Dynamic C# HTTP clients + +This is why you can inject application service interfaces directly in Blazor and call them like local methods! + +--- + +## 15. Permission Checks + +By default, all application service methods and controllers are **public** and accessible. Add `[Authorize]` or `[AbpAuthorize]` to restrict access: + +```csharp +[Authorize] +public async Task CreateAsync(CreateDto input) { } + +[AbpAuthorize("MyApp.Permissions.CanCreate")] +public async Task CreateAsync(CreateDto input) { } +``` + +The `AuthorizationInterceptor` is added only when `[Authorize]` attribute is present on the class or method. + +--- + +## 16. Background Workers Auto-Registration + +**The Magic:** Background workers are enabled by default, and any class implementing `IBackgroundWorker` or `IQuartzBackgroundWorker` is auto-registered. + +--- + +## 17. Entity ID Generation + +**The Magic:** ABP automatically detects the best ID generation strategy based on the entity type: + +- `Guid` → Auto-generates GUID +- `int`/`long` → Database identity +- `string` → No auto-generation (must provide) + +**Where it happens:** `Volo.Abp.Ddd.Domain/Entities/EntityHelper.cs` + +--- + +## 18. Anti-Forgery Token Magic + +**The Magic:** ABP automatically handles CSRF protection with these hardcoded values: + +```csharp +// Blazor Client +private const string AntiForgeryCookieName = "XSRF-TOKEN"; +private const string AntiForgeryHeaderName = "RequestVerificationToken"; +``` + +--- + +## 19. Automatic Event Handler Discovery + +**The Magic:** Any class implementing `IEventHandler` is automatically subscribed to handle events - no manual registration needed! + +```csharp +// This handler is automatically registered when the assembly loads! +public class OrderCreatedHandler : IEventHandler +{ + public Task HandleEventAsync(OrderCreatedEvent eventData) + { + // Handle the event - automatically subscribed! + } +} +``` + +--- + +## 20. Unit of Work Events - Automatic Save + +**The Magic:** Events are not fired immediately - they're collected during the unit of work and fired at the end when everything succeeds! + +```csharp +// In UnitOfWorkEventPublisher.cs +// Events are queued and published only when UOW successfully completes +await _localEventBus.PublishAsync( + entityChangeEvent, + onUnitOfWorkComplete: true // Wait for UOW to complete! +); +``` + +This ensures transactional consistency - if your UOW fails, no events are fired. + +--- + +## 21. Distributed Event Bus - Outbox Pattern + +**The Magic:** ABP implements the Outbox Pattern automatically for distributed events, ensuring no events are lost! + +```csharp +// In DistributedEventBusBase.cs +// Events are stored in outbox table and processed reliably +foreach (var outboxConfig in AbpDistributedEventBusOptions.Outboxes.Values.OrderBy(x => x.Selector is null)) +{ + // Outbox processing happens automatically +} +``` + +--- + +## 22. Automatic Object Extension Properties + +**The Magic:** Any property decorated with `[DisableAuditing]` is automatically excluded from audit logs without any configuration! + +```csharp +// This property is automatically excluded from auditing +[DisableAuditing] +public string SecretData { get; set; } +``` + +--- + +## 23. Virtual File System + +**The Magic:** ABP provides a virtual file system that merges embedded resources from all modules into a single virtual path! + +```csharp +// Any file embedded as "EmbeddedResource" is accessible virtually +// No configuration needed for module authors! +``` + +**Where it happens:** `Volo.Abp.VirtualFileSystem/AbpVirtualFileSystemModule.cs` + +This is how ABP modules include static files (CSS, JS, images) that work without copying to wwwroot. + +--- + +## 24. Automatic JSON Serialization Settings + +**The Magic:** ABP pre-configures JSON serialization with: + +- Camel case property naming +- Null value handling +- Reference loop handling +- Custom converters for common types + +All configured automatically. + +--- + +## 26. Localization Automatic Discovery + +**The Magic:** All `.json` localization files in the application are automatically discovered and loaded: + +``` +/Localization/MyApp/ + en.json + tr.json + de.json +``` + +No explicit registration needed - just add files and they're available! + +--- + +## 27. Feature Checks + +Add `[RequiresFeature]` to restrict access based on feature flags: + +```csharp +[RequiresFeature("MyApp.Features.SomeFeature")] +public async Task DoSomethingAsync() +{ +} +``` + +The `FeatureInterceptor` is added only when `[RequiresFeature]` attribute is present on the class or method. + +--- + +## 28. API Versioning Convention + +**The Magic:** ABP automatically handles API versioning with sensible defaults: + +- Default version: `1.0` +- Version from URL path: `/api/v1/...` +- Version from header: `Accept: application/json;v=1.0` + +All configured automatically unless overridden. + +--- + +## 29. Health Check Endpoints + +**The Magic:** Health check endpoints are auto-registered: + +- `/health` - Overall health status +- `/health/ready` - Readiness check +- `/health/live` - Liveness check + +Includes automatic checks for: +- Database connectivity +- Cache availability +- External services + +--- + +## 30. Swagger/OpenAPI Auto-Configuration + +**The Magic:** If you reference `Volo.Abp.AspNetCore.Mvc.UI.Swagger`, Swagger UI is automatically generated with: + +- All API endpoints documented +- Authorization support +- Versioning support +- XML documentation + +No configuration needed beyond the package reference! + +--- + +## 31. Background Job Queue Magic + +**The Magic:** Background jobs are automatically retried with exponential backoff: + +```csharp +// Jobs are automatically: +// - Queued when published +// - Retried on failure (3 times default) +// - Delayed with exponential backoff +``` + +**Where it happens:** `Volo.Abp.BackgroundJobs/AbpBackgroundJobOptions.cs` + +--- + +## Summary Table + +| # | Feature | Default Behavior | You Need to Know | +|---|---------|-----------------|------------------| +| 1 | **Service Registration** | Auto by interface | Implement `ITransientDependency` | +| 2 | **Service Exposure** | Self + all interfaces | Default is generous | +| 3 | **Validation** | All methods validated | Happens automatically | +| 4 | **Unit of Work** | Transactional by default | Auto-commits/rollbacks | +| 5 | **Auditing** | Enabled + anonymous users | Can disable per entity/method | +| 6 | **Security Log** | Always on | Can configure what to log | +| 7 | **Soft Delete Filter** | Enabled by default | Must disable to query deleted | +| 8 | **Multi-Tenancy Filter** | Enabled by default | Must disable for host data | +| 9 | **Object Mapping** | Mapperly (compile-time) | Inherit from `MapperBase` | +| 10 | **Data Seeds** | Auto-discovery | Implement `IDataSeedContributor` | +| 11 | **Remote Services** | Enabled by default | Can disable per service/method | +| 12 | **Auto API Controllers** | App services → REST APIs | No manual controller needed | +| 13 | **Dynamic Client Proxies** | Auto-generated | Call APIs like local methods | +| 14 | **Permissions** | NOT automatic | Must add `[Authorize]` | +| 15 | **Settings** | Auto-discovery | Define via `ISettingDefinitionProvider` | +| 16 | **Features** | NOT automatic | Must add `[RequiresFeature]` | +| 17 | **Background Workers** | Auto-registration | Implement `IBackgroundWorker` | +| 18 | **Entity ID Generation** | Auto by type | Guid, int, string strategies | +| 19 | **Anti-Forgery** | Auto-enabled | Token cookie/header handling | +| 20 | **Event Handlers** | Auto-discovery | Implement `IEventHandler` | +| 21 | **UOW Events** | Deferred execution | Transactional consistency | +| 22 | **Distributed Events** | Outbox pattern | Reliable messaging | +| 23 | **Virtual Files** | Module merging | Embedded resources as virtual | +| 24 | **JSON Settings** | Pre-configured | CamelCase, null handling | +| 25 | **Tenant Resolution** | Multi-source chain | Route → Query → Header → Cookie → Subdomain | +| 26 | **Localization** | Auto-discovery | JSON files in /Localization | +| 27 | **API Versioning** | Default v1.0 | URL, header, query support | +| 28 | **Health Checks** | Auto-registered | /health, /health/ready, /health/live | +| 29 | **Swagger** | Auto-generated | With authorization support | +| 30 | **Background Job Queue** | Auto with backoff | 3 retries default | +| 31 | **Widgets** | Auto-discovery | Implement `IWidget` | + +--- + +## Conclusion + +ABP Framework's hidden magic is what makes it so productive to use. These conventions allow developers to focus on business logic rather than boilerplate configuration. However, understanding these defaults is crucial for: + +1. **Debugging** - Knowing why certain behaviors happen +2. **Optimization** - Disabling what you don't need +3. **Security** - Understanding what's logged/audited by default +4. **Architecture** - Following the intended patterns + +The next time something "just works" in ABP, there's likely a hidden convention behind it! + +--- + +*What hidden ABP magic have you discovered? Share your findings in the comments!* diff --git a/docs/en/cli/index.md b/docs/en/cli/index.md index 3a3d0c2304..e376887baf 100644 --- a/docs/en/cli/index.md +++ b/docs/en/cli/index.md @@ -73,6 +73,7 @@ Here is the list of all available commands before explaining their details: * **[`clear-download-cache`](../cli#clear-download-cache)**: Clears the templates download cache. * **[`check-extensions`](../cli#check-extensions)**: Checks the latest version of the ABP CLI extensions. * **[`install-old-cli`](../cli#install-old-cli)**: Installs old ABP CLI. +* **[`mcp-studio`](../cli#mcp-studio)**: Starts ABP Studio MCP bridge for AI tools (requires ABP Studio running). * **[`generate-razor-page`](../cli#generate-razor-page)**: Generates a page class that you can use it in the ASP NET Core pipeline to return an HTML page. ### help @@ -981,6 +982,35 @@ Usage: abp install-old-cli [options] ``` +### mcp-studio + +Starts an MCP stdio bridge for AI tools (Cursor, Claude Desktop, VS Code, etc.) that connects to the local ABP Studio instance. ABP Studio must be running for this command to work. + +> You do not need to run this command manually. It is invoked automatically by your AI tool once you add the MCP configuration to your IDE. See the [Configuration](#configuration) examples below. + +> This command connects to the **local ABP Studio** instance. It is separate from the `abp mcp` command, which connects to the ABP.IO cloud MCP service and requires an active license. + +Usage: + +```bash +abp mcp-studio [options] +``` + +Options: + +* `--endpoint` or `-e`: Overrides ABP Studio MCP endpoint. Default value is `http://localhost:38280/mcp/`. + +Example: + +```bash +abp mcp-studio +abp mcp-studio --endpoint http://localhost:38280/mcp/ +``` + +For detailed configuration examples (Cursor, Claude Desktop, VS Code) and the full list of available MCP tools, see the [Model Context Protocol (MCP)](../studio/model-context-protocol.md) documentation. + +> You can also run `abp help mcp-studio` to see available options and example IDE configuration snippets directly in your terminal. + ### generate-razor-page `generate-razor-page` command to generate a page class and then use it in the ASP NET Core pipeline to return an HTML page. diff --git a/docs/en/deployment/configuring-production.md b/docs/en/deployment/configuring-production.md index 557b671614..8b3430046d 100644 --- a/docs/en/deployment/configuring-production.md +++ b/docs/en/deployment/configuring-production.md @@ -113,6 +113,6 @@ ABP uses .NET's standard [Logging services](../framework/fundamentals/logging.md ABP's startup solution templates come with [Swagger UI](https://swagger.io/) pre-installed. Swagger is a pretty standard and useful tool to discover and test your HTTP APIs on a built-in UI that is embedded into your application or service. It is typically used in development environment, but you may want to enable it on staging or production environments too. -While you will always secure your HTTP APIs with other techniques (like the [Authorization](../framework/fundamentals/authorization.md) system), allowing malicious software and people to easily discover your HTTP API endpoint details can be considered as a security problem for some systems. So, be careful while taking the decision of enabling or disabling Swagger for the production environment. +While you will always secure your HTTP APIs with other techniques (like the [Authorization](../framework/fundamentals/authorization/index.md) system), allowing malicious software and people to easily discover your HTTP API endpoint details can be considered as a security problem for some systems. So, be careful while taking the decision of enabling or disabling Swagger for the production environment. > You may also want to see the [ABP Swagger integration](../framework/api-development/swagger.md) document. diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 1cce28fa3f..3f1abf424f 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -333,13 +333,17 @@ "path": "studio/solution-explorer.md" }, { - "text": "Running Applications", + "text": "Solution Runner", "path": "studio/running-applications.md" }, { "text": "Monitoring Applications", "path": "studio/monitoring-applications.md" }, + { + "text": "Model Context Protocol (MCP)", + "path": "studio/model-context-protocol.md" + }, { "text": "Working with Kubernetes", "path": "studio/kubernetes.md" @@ -347,6 +351,10 @@ { "text": "Working with ABP Suite", "path": "studio/working-with-suite.md" + }, + { + "text": "Custom Commands", + "path": "studio/custom-commands.md" } ] }, @@ -458,12 +466,16 @@ "items": [ { "text": "Overview", - "path": "framework/fundamentals/authorization.md", + "path": "framework/fundamentals/authorization/index.md", "isIndex": true }, { "text": "Dynamic Claims", "path": "framework/fundamentals/dynamic-claims.md" + }, + { + "text": "Resource Based Authorization", + "path": "framework/fundamentals/authorization/resource-based-authorization.md" } ] }, @@ -689,6 +701,10 @@ "text": "Concurrency Check", "path": "framework/infrastructure/concurrency-check.md" }, + { + "text": "Correlation ID", + "path": "framework/infrastructure/correlation-id.md" + }, { "text": "Current User", "path": "framework/infrastructure/current-user.md" @@ -1284,7 +1300,7 @@ }, { "text": "LeptonX Lite", - "path": "ui-themes/lepton-x-lite/mvc.md" + "path": "ui-themes/lepton-x-lite/asp-net-core.md" }, { "text": "LeptonX", diff --git a/docs/en/framework/api-development/standard-apis/configuration.md b/docs/en/framework/api-development/standard-apis/configuration.md index 3fcd22f6d9..53a666546c 100644 --- a/docs/en/framework/api-development/standard-apis/configuration.md +++ b/docs/en/framework/api-development/standard-apis/configuration.md @@ -9,7 +9,7 @@ ABP provides a pre-built and standard endpoint that contains some useful information about the application/service. Here, is the list of some fundamental information at this endpoint: -* Granted [policies](../../fundamentals/authorization.md) (permissions) for the current user. +* Granted [policies](../../fundamentals/authorization/index.md) (permissions) for the current user. * [Setting](../../infrastructure/settings.md) values for the current user. * Info about the [current user](../../infrastructure/current-user.md) (like id and user name). * Info about the current [tenant](../../architecture/multi-tenancy) (like id and name). diff --git a/docs/en/framework/architecture/domain-driven-design/application-services.md b/docs/en/framework/architecture/domain-driven-design/application-services.md index a0d0c2d5fc..8683241534 100644 --- a/docs/en/framework/architecture/domain-driven-design/application-services.md +++ b/docs/en/framework/architecture/domain-driven-design/application-services.md @@ -218,7 +218,7 @@ See the [validation document](../../fundamentals/validation.md) for more. It's possible to use declarative and imperative authorization for application service methods. -See the [authorization document](../../fundamentals/authorization.md) for more. +See the [authorization document](../../fundamentals/authorization/index.md) for more. ## CRUD Application Services diff --git a/docs/en/framework/architecture/domain-driven-design/entities.md b/docs/en/framework/architecture/domain-driven-design/entities.md index df727a61ba..c0b0869461 100644 --- a/docs/en/framework/architecture/domain-driven-design/entities.md +++ b/docs/en/framework/architecture/domain-driven-design/entities.md @@ -135,6 +135,29 @@ if (book1.EntityEquals(book2)) //Check equality } ``` +### `IKeyedObject` Interface + +ABP entities implement the `IKeyedObject` interface, which provides a way to get the entity's primary key as a string: + +```csharp +public interface IKeyedObject +{ + string? GetObjectKey(); +} +``` + +The `GetObjectKey()` method returns a string representation of the entity's primary key. For entities with a single key (like `Entity` or `Entity`), it returns the `Id` property converted to a string. For entities with composite keys, it returns the keys combined with a comma separator. + +This interface is particularly useful for scenarios where you need to identify an entity by its key in a type-agnostic way, such as: + +* **Resource-based authorization**: When checking or granting permissions for specific entity instances +* **Caching**: When creating cache keys based on entity identifiers +* **Logging and auditing**: When recording entity identifiers in a consistent format + +Since all ABP entities implement this interface through the `IEntity` interface, you can use `GetObjectKey()` on any entity without additional implementation. + +> See the [Resource-Based Authorization](../../fundamentals/authorization/resource-based-authorization.md) documentation for a practical example of using `IKeyedObject` with the permission system. + ## AggregateRoot Class "*Aggregate is a pattern in Domain-Driven Design. A DDD aggregate is a cluster of domain objects that can be treated as a single unit. An example may be an order and its line-items, these will be separate objects, but it's useful to treat the order (together with its line items) as a single aggregate.*" (see the [full description](http://martinfowler.com/bliki/DDD_Aggregate.html)) diff --git a/docs/en/framework/architecture/modularity/extending/customizing-application-modules-guide.md b/docs/en/framework/architecture/modularity/extending/customizing-application-modules-guide.md index 1d6c5ffe99..77f4a70d90 100644 --- a/docs/en/framework/architecture/modularity/extending/customizing-application-modules-guide.md +++ b/docs/en/framework/architecture/modularity/extending/customizing-application-modules-guide.md @@ -112,4 +112,4 @@ Also, see the following documents: * See [the localization document](../../../fundamentals/localization.md) to learn how to extend existing localization resources. * See [the settings document](../../../infrastructure/settings.md) to learn how to change setting definitions of a depended module. -* See [the authorization document](../../../fundamentals/authorization.md) to learn how to change permission definitions of a depended module. +* See [the authorization document](../../../fundamentals/authorization/index.md) to learn how to change permission definitions of a depended module. diff --git a/docs/en/framework/fundamentals/authorization.md b/docs/en/framework/fundamentals/authorization/index.md similarity index 74% rename from docs/en/framework/fundamentals/authorization.md rename to docs/en/framework/fundamentals/authorization/index.md index 1a104ef420..6cbd1a7a6a 100644 --- a/docs/en/framework/fundamentals/authorization.md +++ b/docs/en/framework/fundamentals/authorization/index.md @@ -9,13 +9,15 @@ Authorization is used to check if a user is allowed to perform some specific operations in the application. -ABP extends [ASP.NET Core Authorization](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/introduction) by adding **permissions** as auto [policies](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies) and allowing authorization system to be usable in the **[application services](../architecture/domain-driven-design/application-services.md)** too. +ABP extends [ASP.NET Core Authorization](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/introduction) by adding **permissions** as auto [policies](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies) and allowing authorization system to be usable in the **[application services](../../architecture/domain-driven-design/application-services.md)** too. So, all the ASP.NET Core authorization features and the documentation are valid in an ABP based application. This document focuses on the features that are added on top of ASP.NET Core authorization features. +ABP supports two types of permissions: **Standard permissions** apply globally (e.g., "can create documents"), while **resource-based permissions** target specific instances (e.g., "can edit Document #123"). This document covers standard permissions; see [Resource-Based Authorization](./resource-based-authorization.md) for fine-grained, per-resource access control. + ## Authorize Attribute -ASP.NET Core defines the [**Authorize**](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/simple) attribute that can be used for an action, a controller or a page. ABP allows you to use the same attribute for an [application service](../architecture/domain-driven-design/application-services.md) too. +ASP.NET Core defines the [**Authorize**](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/simple) attribute that can be used for an action, a controller or a page. ABP allows you to use the same attribute for an [application service](../../architecture/domain-driven-design/application-services.md) too. Example: @@ -87,9 +89,11 @@ namespace Acme.BookStore.Permissions > ABP automatically discovers this class. No additional configuration required! -> You typically define this class inside the `Application.Contracts` project of your [application](../../solution-templates/layered-web-application). The startup template already comes with an empty class named *YourProjectNamePermissionDefinitionProvider* that you can start with. +> You typically define this class inside the `Application.Contracts` project of your [application](../../../solution-templates/layered-web-application/index.md). The startup template already comes with an empty class named *YourProjectNamePermissionDefinitionProvider* that you can start with. + +In the `Define` method, you first need to add a **permission group** (or get an existing group), then add **permissions** to this group using the `AddPermission` method. -In the `Define` method, you first need to add a **permission group** or get an existing group then add **permissions** to this group. +> For resource-specific fine-grained permissions, use the `AddResourcePermission` method instead. See [Resource-Based Authorization](./resource-based-authorization.md) for details. When you define a permission, it becomes usable in the ASP.NET Core authorization system as a **policy** name. It also becomes visible in the UI. See permissions dialog for a role: @@ -100,6 +104,8 @@ When you define a permission, it becomes usable in the ASP.NET Core authorizatio When you save the dialog, it is saved to the database and used in the authorization system. +> **Note:** Only standard (global) permissions are shown in this dialog. Resource-based permissions are managed through the [Resource Permission Management Dialog](../../../modules/permission-management.md#resource-permission-management-dialog) on individual resource instances. + > The screen above is available when you have installed the identity module, which is basically used for user and role management. Startup templates come with the identity module pre-installed. #### Localizing the Permission Name @@ -125,15 +131,15 @@ Then you can define texts for "BookStore" and "Permission:BookStore_Author_Creat "Permission:BookStore_Author_Create": "Creating a new author" ``` -> For more information, see the [localization document](./localization.md) on the localization system. +> For more information, see the [localization document](../localization.md) on the localization system. The localized UI will be as seen below: -![authorization-new-permission-ui-localized](../../images/authorization-new-permission-ui-localized.png) +![authorization-new-permission-ui-localized](../../../images/authorization-new-permission-ui-localized.png) #### Multi-Tenancy -ABP supports [multi-tenancy](../architecture/multi-tenancy) as a first class citizen. You can define multi-tenancy side option while defining a new permission. It gets one of the three values defined below: +ABP supports [multi-tenancy](../../architecture/multi-tenancy/index.md) as a first class citizen. You can define multi-tenancy side option while defining a new permission. It gets one of the three values defined below: - **Host**: The permission is available only for the host side. - **Tenant**: The permission is available only for the tenant side. @@ -180,7 +186,7 @@ authorManagement.AddChild("Author_Management_Delete_Books"); The result on the UI is shown below (you probably want to localize permissions for your application): -![authorization-new-permission-ui-hierarcy](../../images/authorization-new-permission-ui-hierarcy.png) +![authorization-new-permission-ui-hierarcy](../../../images/authorization-new-permission-ui-hierarcy.png) For the example code, it is assumed that a role/user with "Author_Management" permission granted may have additional permissions. Then a typical application service that checks permissions can be defined as shown below: @@ -229,7 +235,7 @@ See [policy based authorization](https://docs.microsoft.com/en-us/aspnet/core/se ### Changing Permission Definitions of a Depended Module -A class deriving from the `PermissionDefinitionProvider` (just like the example above) can also get existing permission definitions (defined by the depended [modules](../architecture/modularity/basics.md)) and change their definitions. +A class deriving from the `PermissionDefinitionProvider` (just like the example above) can also get existing permission definitions (defined by the depended [modules](../../architecture/modularity/basics.md)) and change their definitions. Example: @@ -247,12 +253,12 @@ When you write this code inside your permission definition provider, it finds th You may want to disable a permission based on a condition. Disabled permissions are not visible on the UI and always returns `prohibited` when you check them. There are two built-in conditional dependencies for a permission definition; -* A permission can be automatically disabled if a [Feature](../infrastructure/features.md) was disabled. -* A permission can be automatically disabled if a [Global Feature](../infrastructure/global-features.md) was disabled. +* A permission can be automatically disabled if a [Feature](../../infrastructure/features.md) was disabled. +* A permission can be automatically disabled if a [Global Feature](../../infrastructure/global-features.md) was disabled. In addition, you can create your custom extensions. -#### Depending on a Features +#### Depending on Features Use the `RequireFeatures` extension method on your permission definition to make the permission available only if a given feature is enabled: @@ -261,7 +267,7 @@ myGroup.AddPermission("Book_Creation") .RequireFeatures("BookManagement"); ```` -#### Depending on a Global Feature +#### Depending on Global Features Use the `RequireGlobalFeatures` extension method on your permission definition to make the permission available only if a given feature is enabled: @@ -272,13 +278,13 @@ myGroup.AddPermission("Book_Creation") #### Creating a Custom Permission Dependency -`PermissionDefinition` supports state check, Please refer to [Simple State Checker's documentation](../infrastructure/simple-state-checker.md) +`PermissionDefinition` supports state check, please refer to [Simple State Checker's documentation](../../infrastructure/simple-state-checker.md) ## IAuthorizationService -ASP.NET Core provides the `IAuthorizationService` that can be used to check for authorization. Once you inject, you can use it in your code to conditionally control the authorization. +ASP.NET Core provides the `IAuthorizationService` that can be used to check for authorization. Once you inject it, you can use it in your code to conditionally control the authorization. -Example: +**Example:** ```csharp public async Task CreateAsync(CreateAuthorDto input) @@ -295,7 +301,7 @@ public async Task CreateAsync(CreateAuthorDto input) } ``` -> `AuthorizationService` is available as a property when you derive from ABP's `ApplicationService` base class. Since it is widely used in application services, `ApplicationService` pre-injects it for you. Otherwise, you can directly [inject](./dependency-injection.md) it into your class. +> `AuthorizationService` is available as a property when you derive from ABP's `ApplicationService` base class. Since it is widely used in application services, `ApplicationService` pre-injects it for you. Otherwise, you can directly [inject](../dependency-injection.md) it into your class. Since this is a typical code block, ABP provides extension methods to simplify it. @@ -320,15 +326,15 @@ public async Task CreateAsync(CreateAuthorDto input) See the following documents to learn how to re-use the authorization system on the client side: -* [ASP.NET Core MVC / Razor Pages UI: Authorization](../ui/mvc-razor-pages/javascript-api/auth.md) -* [Angular UI Authorization](../ui/angular/authorization.md) -* [Blazor UI Authorization](../ui/blazor/authorization.md) +* [ASP.NET Core MVC / Razor Pages UI: Authorization](../../ui/mvc-razor-pages/javascript-api/auth.md) +* [Angular UI Authorization](../../ui/angular/authorization.md) +* [Blazor UI Authorization](../../ui/blazor/authorization.md) ## Permission Management Permission management is normally done by an admin user using the permission management modal: -![authorization-new-permission-ui-localized](../../images/authorization-new-permission-ui-localized.png) +![authorization-new-permission-ui-localized](../../../images/authorization-new-permission-ui-localized.png) If you need to manage permissions by code, inject the `IPermissionManager` and use as shown below: @@ -356,13 +362,13 @@ public class MyService : ITransientDependency `SetForUserAsync` sets the value (true/false) for a permission of a user. There are more extension methods like `SetForRoleAsync` and `SetForClientAsync`. -`IPermissionManager` is defined by the permission management module. See the [permission management module documentation](../../modules/permission-management.md) for more information. +`IPermissionManager` is defined by the Permission Management module. For resource-based permissions, use `IResourcePermissionManager` instead. See the [Permission Management Module documentation](../../../modules/permission-management.md) for more information. ## Advanced Topics ### Permission Value Providers -Permission checking system is extensible. Any class derived from `PermissionValueProvider` (or implements `IPermissionValueProvider`) can contribute to the permission check. There are three pre-defined value providers: +The permission checking system is extensible. Any class derived from `PermissionValueProvider` (or implements `IPermissionValueProvider`) can contribute to the permission check. There are three pre-defined value providers: - `UserPermissionValueProvider` checks if the current user is granted for the given permission. It gets user id from the current claims. User claim name is defined with the `AbpClaimTypes.UserId` static property. - `RolePermissionValueProvider` checks if any of the roles of the current user is granted for the given permission. It gets role names from the current claims. Role claims name is defined with the `AbpClaimTypes.Role` static property. @@ -412,15 +418,35 @@ Configure(options => }); ``` +### Resource Permission Value Providers + +Similar to standard permission value providers, you can extend the resource permission checking system by creating custom **resource permission value providers**. ABP provides two built-in resource permission value providers: + +* `UserResourcePermissionValueProvider`: Checks permissions granted directly to users for a specific resource. +* `RoleResourcePermissionValueProvider`: Checks permissions granted to roles for a specific resource. + +You can create custom providers by implementing `IResourcePermissionValueProvider` or inheriting from `ResourcePermissionValueProvider`. Register them using: + +```csharp +Configure(options => +{ + options.ResourceValueProviders.Add(); +}); +``` + +> See the [Permission Management Module](../../../modules/permission-management.md#resource-permission-value-providers) documentation for detailed examples. + ### Permission Store -`IPermissionStore` is the only interface that needs to be implemented to read the value of permissions from a persistence source, generally a database system. The Permission Management module implements it and pre-installed in the application startup template. See the [permission management module documentation](../../modules/permission-management.md) for more information +`IPermissionStore` is the interface that needs to be implemented to read the value of permissions from a persistence source, generally a database system. The Permission Management module implements it and is pre-installed in the application startup template. See the [Permission Management Module documentation](../../../modules/permission-management.md) for more information. + +For resource-based permissions, `IResourcePermissionStore` serves the same purpose, storing and retrieving permissions for specific resource instances. ### AlwaysAllowAuthorizationService `AlwaysAllowAuthorizationService` is a class that is used to bypass the authorization service. It is generally used in integration tests where you may want to disable the authorization system. -Use `IServiceCollection.AddAlwaysAllowAuthorization()` extension method to register the `AlwaysAllowAuthorizationService` to the [dependency injection](./dependency-injection.md) system: +Use `IServiceCollection.AddAlwaysAllowAuthorization()` extension method to register the `AlwaysAllowAuthorizationService` to the [dependency injection](../../dependency-injection.md) system: ```csharp public override void ConfigureServices(ServiceConfigurationContext context) @@ -466,11 +492,24 @@ public static class CurrentUserExtensions } ``` -> If you use OpenIddict please see [Updating Claims in Access Token and ID Token](../../modules/openiddict#updating-claims-in-access_token-and-id_token). +> If you use OpenIddict please see [Updating Claims in Access Token and ID Token](../../../modules/openiddict#updating-claims-in-access_token-and-id_token). + +## Resource-Based Authorization + +While this document covers standard (global) permissions, ABP also supports **resource-based authorization** for fine-grained access control on specific resource instances. Resource-based authorization allows you to grant permissions for a specific document, project, or any other entity rather than granting a permission for all resources of that type. + +**Example scenarios:** + +* Allow users to edit **only their own** blog posts or documents +* Grant access to **specific projects** based on team membership +* Implement document sharing where **different users have different access levels** to the same document + +> See the [Resource-Based Authorization](./resource-based-authorization.md) document for implementation details. ## See Also -* [Permission Management Module](../../modules/permission-management.md) -* [ASP.NET Core MVC / Razor Pages JavaScript Auth API](../ui/mvc-razor-pages/javascript-api/auth.md) -* [Permission Management in Angular UI](../ui/angular/Permission-Management.md) +* [Resource-Based Authorization](./resource-based-authorization.md) +* [Permission Management Module](../../../modules/permission-management.md) +* [ASP.NET Core MVC / Razor Pages JavaScript Auth API](../../ui/mvc-razor-pages/javascript-api/auth.md) +* [Permission Management in Angular UI](../../ui/angular/Permission-Management.md) * [Video tutorial](https://abp.io/video-courses/essentials/authorization) \ No newline at end of file diff --git a/docs/en/framework/fundamentals/authorization/resource-based-authorization.md b/docs/en/framework/fundamentals/authorization/resource-based-authorization.md new file mode 100644 index 0000000000..310f2d1b65 --- /dev/null +++ b/docs/en/framework/fundamentals/authorization/resource-based-authorization.md @@ -0,0 +1,241 @@ +```json +//[doc-seo] +{ + "Description": "Learn how to implement resource-based authorization in ABP Framework for fine-grained access control on specific resource instances like documents, projects, or any entity." +} +``` + +# Resource-Based Authorization + +**Resource-Based Authorization** is a powerful feature that enables fine-grained access control based on specific resource instances. While the standard [authorization system](./index.md) grants permissions at a general level (e.g., "can edit documents"), resource-based authorization allows you to grant permissions for a **specific** document, project, or any other entity rather than granting a permission for all of them. + +## When to Use Resource-Based Authorization? + +Consider resource-based authorization when you need to: + +* Allow users to edit **only their own blog posts or documents** +* Grant access to **specific projects** based on team membership +* Implement document sharing **where different users have different access levels to the same document** +* Control access to resources based on ownership or custom sharing rules + +**Example Scenarios:** + +Imagine a document management system where: + +- User A can view and edit Document 1 +- User B can only view Document 1 +- User A has no access to Document 2 +- User C can manage permissions for Document 2 + +This level of granular control is what resource-based authorization provides. + +## Usage + +Implementing resource-based authorization involves three main steps: + +1. **Define** resource permissions in your `PermissionDefinitionProvider` +2. **Check** permissions using `IResourcePermissionChecker` +3. **Manage** permissions via UI or using `IResourcePermissionManager` for programmatic usages + +### Defining Resource Permissions + +Define resource permissions in your `PermissionDefinitionProvider` class using the `AddResourcePermission` method: + +```csharp +namespace Acme.BookStore.Permissions; + +public static class BookStorePermissions +{ + public const string GroupName = "BookStore"; + + public static class Books + { + public const string Default = GroupName + ".Books"; + public const string ManagePermissions = Default + ".ManagePermissions"; + + public static class Resources + { + public const string Name = "Acme.BookStore.Books.Book"; + public const string View = Name + ".View"; + public const string Edit = Name + ".Edit"; + public const string Delete = Name + ".Delete"; + } + } +} +``` + +```csharp +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; + +namespace Acme.BookStore.Permissions +{ + public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider + { + public override void Define(IPermissionDefinitionContext context) + { + var myGroup = context.AddGroup("BookStore"); + + // Standard permissions + myGroup.AddPermission(BookStorePermissions.Books.Default, L("Permission:Books")); + + // Permission to manage resource permissions (required) + myGroup.AddPermission(BookStorePermissions.Books.ManagePermissions, L("Permission:Books:ManagePermissions")); + + // Resource-based permissions + context.AddResourcePermission( + name: BookStorePermissions.Books.Resources.View, + resourceName: BookStorePermissions.Books.Resources.Name, + managementPermissionName: BookStorePermissions.Books.ManagePermissions, + displayName: L("Permission:Books:View") + ); + + context.AddResourcePermission( + name: BookStorePermissions.Books.Resources.Edit, + resourceName: BookStorePermissions.Books.Resources.Name, + managementPermissionName: BookStorePermissions.Books.ManagePermissions, + displayName: L("Permission:Books:Edit") + ); + + context.AddResourcePermission( + name: BookStorePermissions.Books.Resources.Delete, + resourceName: BookStorePermissions.Books.Resources.Name, + managementPermissionName: BookStorePermissions.Books.ManagePermissions, + displayName: L("Permission:Books:Delete"), + multiTenancySide: MultiTenancySides.Host + ); + } + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} +``` + +The `AddResourcePermission` method requires the following parameters: + +* `name`: A unique name for the resource permission. +* `resourceName`: An identifier for the resource type. This is typically the full name of the entity class (e.g., `Acme.BookStore.Books.Book`). +* `managementPermissionName`: A standard permission that controls who can manage resource permissions. Users with this permission can grant/revoke resource permissions for specific resources. +* `displayName`: (Optional) A localized display name shown in the UI. +* `multiTenancySide`: (Optional) Specifies on which side of a multi-tenant application this permission can be used. Accepts `MultiTenancySides.Host` (only for the host side), `MultiTenancySides.Tenant` (only for tenants), or `MultiTenancySides.Both` (default, available on both sides). + +### Checking Resource Permissions + +Use the `IAuthorizationService` service to check if a user/role/client has a specific permission for a resource: + +```csharp +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; +using Volo.Abp.Authorization.Permissions.Resources; + +namespace Acme.BookStore.Books +{ + public class BookAppService : ApplicationService, IBookAppService + { + private readonly IBookRepository _bookRepository; + + public BookAppService(IBookRepository bookRepository) + { + _bookRepository = bookRepository; + } + + public virtual async Task GetAsync(Guid id) + { + var book = await _bookRepository.GetAsync(id); + + // Check if the current user can view this specific book + var isGranted = await AuthorizationService.IsGrantedAsync(book, BookStorePermissions.Books.Resources.View); // AuthorizationService is a property of the ApplicationService class and will be automatically injected. + if (!isGranted) + { + throw new AbpAuthorizationException("You don't have permission to view this book."); + } + + return ObjectMapper.Map(book); + } + + public virtual async Task UpdateAsync(Guid id, UpdateBookDto input) + { + var book = await _bookRepository.GetAsync(id); + + // Check if the current user can edit this specific book + var isGranted = await AuthorizationService.IsGrantedAsync(book, BookStorePermissions.Books.Resources.Edit); // AuthorizationService is a property of the ApplicationService class and will be automatically injected. + if (!isGranted) + { + throw new AbpAuthorizationException("You don't have permission to edit this book."); + } + + book.Title = input.Title; + book.Content = input.Content; + await _bookRepository.UpdateAsync(book); + } + } +} +``` + +In this example, the `BookAppService` uses `IAuthorizationService` to check if the current user has the required permission for a specific book before performing the operation. The method takes the `Book` entity object and resource permission name as parameters. + +#### IKeyedObject + +The `IAuthorizationService` internally uses `IResourcePermissionChecker` to check resource permissions, and gets the resource key by calling the `GetObjectKey()` method of the `IKeyedObject` interface. All ABP entities implement the `IKeyedObject` interface, so you can directly pass entity objects to the `IsGrantedAsync` method. + +> See the [Entities documentation](../../architecture/domain-driven-design/entities.md) for more information about the `IKeyedObject` interface. + +#### IResourcePermissionChecker + +You can also directly use the `IResourcePermissionChecker` service to check resource permissions which provides more advanced features, such as checking multiple permissions at once: + +> You have to pass the resource key (obtained via `GetObjectKey()`) explicitly when using `IResourcePermissionChecker`. + +```csharp +public class BookAppService : ApplicationService, IBookAppService +{ + private readonly IBookRepository _bookRepository; + private readonly IResourcePermissionChecker _resourcePermissionChecker; + + public BookAppService(IBookRepository bookRepository, IResourcePermissionChecker resourcePermissionChecker) + { + _bookRepository = bookRepository; + _resourcePermissionChecker = resourcePermissionChecker; + } + + public async Task GetPermissionsAsync(Guid id) + { + var book = await _bookRepository.GetAsync(id); + + var result = await _resourcePermissionChecker.IsGrantedAsync(new[] + { + BookStorePermissions.Books.Resources.View, + BookStorePermissions.Books.Resources.Edit, + BookStorePermissions.Books.Resources.Delete + }, + BookStorePermissions.Books.Resources.Name, + book.GetObjectKey()!); + + return new BookPermissionsDto + { + CanView = result.Result[BookStorePermissions.Books.Resources.View] == PermissionGrantResult.Granted, + CanEdit = result.Result[BookStorePermissions.Books.Resources.Edit] == PermissionGrantResult.Granted, + CanDelete = result.Result[BookStorePermissions.Books.Resources.Delete] == PermissionGrantResult.Granted + }; + } +} +``` + +### Managing Resource Permissions + +Once you have defined resource permissions, you need a way to grant or revoke them for specific users, roles, or clients. The [Permission Management Module](../../../modules/permission-management.md) provides the infrastructure for managing resource permissions: + +- **UI Components**: Built-in modal dialogs for managing resource permissions on all supported UI frameworks (MVC/Razor Pages, Blazor, and Angular). These components allow administrators to grant or revoke permissions for users and roles on specific resource instances through a user-friendly interface. +- **`IResourcePermissionManager` Service**: A service for programmatically granting, revoking, and querying resource permissions at runtime. This is useful for scenarios like automatically granting permissions when a resource is created, implementing sharing functionality, or integrating with external systems. + +> See the [Permission Management Module](../../../modules/permission-management.md#resource-permission-management-dialog) documentation for detailed information on using the UI components and the `IResourcePermissionManager` service. + +## See Also + +* [Authorization](./index.md) +* [Permission Management Module](../../../modules/permission-management.md) +* [Entities](../../architecture/domain-driven-design/entities.md) diff --git a/docs/en/framework/fundamentals/dynamic-claims.md b/docs/en/framework/fundamentals/dynamic-claims.md index 03ddc701cd..24d95755c5 100644 --- a/docs/en/framework/fundamentals/dynamic-claims.md +++ b/docs/en/framework/fundamentals/dynamic-claims.md @@ -94,6 +94,6 @@ If you want to add your own dynamic claims contributor, you can create a class t ## See Also -* [Authorization](./authorization.md) +* [Authorization](./authorization/index.md) * [Claims-based authorization in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/security/authorization/claims) * [Mapping, customizing, and transforming claims in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/security/authentication/claims) diff --git a/docs/en/framework/fundamentals/exception-handling.md b/docs/en/framework/fundamentals/exception-handling.md index 85b1c3b9c4..5ccfcf124a 100644 --- a/docs/en/framework/fundamentals/exception-handling.md +++ b/docs/en/framework/fundamentals/exception-handling.md @@ -322,7 +322,7 @@ The `context` object contains necessary information about the exception occurred Some exception types are automatically thrown by the framework: -- `AbpAuthorizationException` is thrown if the current user has no permission to perform the requested operation. See [authorization](./authorization.md) for more. +- `AbpAuthorizationException` is thrown if the current user has no permission to perform the requested operation. See [authorization](./authorization/index.md) for more. - `AbpValidationException` is thrown if the input of the current request is not valid. See [validation](./validation.md) for more. - `EntityNotFoundException` is thrown if the requested entity is not available. This is mostly thrown by [repositories](../architecture/domain-driven-design/repositories.md). diff --git a/docs/en/framework/fundamentals/index.md b/docs/en/framework/fundamentals/index.md index 6aef484c41..7ffa99fd89 100644 --- a/docs/en/framework/fundamentals/index.md +++ b/docs/en/framework/fundamentals/index.md @@ -10,7 +10,7 @@ The following documents explains the fundamental building blocks to create ABP solutions: * [Application Startup](./application-startup.md) -* [Authorization](./authorization.md) +* [Authorization](./authorization/index.md) * [Caching](./caching.md) * [Configuration](./configuration.md) * [Connection Strings](./connection-strings.md) 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 6edcee78f1..6c13f5d61d 100644 --- a/docs/en/framework/infrastructure/artificial-intelligence/microsoft-extensions-ai.md +++ b/docs/en/framework/infrastructure/artificial-intelligence/microsoft-extensions-ai.md @@ -71,7 +71,7 @@ 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. +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, the default workspace's chat client is returned. Only if both the workspace-specific and default chat clients are not configured will you 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. diff --git a/docs/en/framework/infrastructure/audit-logging.md b/docs/en/framework/infrastructure/audit-logging.md index 9811e542ab..ee2cdf7e41 100644 --- a/docs/en/framework/infrastructure/audit-logging.md +++ b/docs/en/framework/infrastructure/audit-logging.md @@ -169,6 +169,8 @@ public class HomeController : AbpController [Application service](../architecture/domain-driven-design/application-services.md) method calls also included into the audit log by default. You can use the `[DisableAuditing]` in service or method level. +> **Blazor Server limitation (Entity history):** In `Blazor Server` applications, entity change history is currently not guaranteed to be complete for every UI interaction. Blazor Server uses SignalR-based event handling, and under some flows the audit scope/action tracking may not align with `DbContext.SaveChanges`, which can cause missing or partial entity change records. This is a known platform-level limitation and not a regular configuration issue. See [#11682](https://github.com/abpframework/abp/issues/11682) for related discussions. + #### Enable/Disable for Other Services Action audit logging can be enabled for any type of class (registered to and resolved from the [dependency injection](../fundamentals/dependency-injection.md)) while it is only enabled for the controllers and the application services by default. diff --git a/docs/en/framework/infrastructure/background-jobs/hangfire.md b/docs/en/framework/infrastructure/background-jobs/hangfire.md index 61408f303d..05cd214016 100644 --- a/docs/en/framework/infrastructure/background-jobs/hangfire.md +++ b/docs/en/framework/infrastructure/background-jobs/hangfire.md @@ -149,7 +149,7 @@ namespace MyProject Hangfire Dashboard provides information about your background jobs, including method names and serialized arguments as well as gives you an opportunity to manage them by performing different actions – retry, delete, trigger, etc. So it is important to restrict access to the Dashboard. To make it secure by default, only local requests are allowed, however you can change this by following the [official documentation](http://docs.hangfire.io/en/latest/configuration/using-dashboard.html) of Hangfire. -You can integrate the Hangfire dashboard to [ABP authorization system](../../fundamentals/authorization.md) using the **AbpHangfireAuthorizationFilter** +You can integrate the Hangfire dashboard to [ABP authorization system](../../fundamentals/authorization/index.md) using the **AbpHangfireAuthorizationFilter** class. This class is defined in the `Volo.Abp.Hangfire` package. The following example, checks if the current user is logged in to the application: ```csharp diff --git a/docs/en/framework/infrastructure/correlation-id.md b/docs/en/framework/infrastructure/correlation-id.md index 6f66c93fb7..15ce5b9677 100644 --- a/docs/en/framework/infrastructure/correlation-id.md +++ b/docs/en/framework/infrastructure/correlation-id.md @@ -1,3 +1,178 @@ +```json +//[doc-seo] +{ + "Description": "Learn how the ABP Framework uses Correlation IDs to trace and correlate operations across HTTP requests, distributed events, audit logs, and microservices." +} +``` + # Correlation ID -This document is planned to be written later. \ No newline at end of file +A **Correlation ID** is a unique identifier that is assigned to a request or operation and propagated across all related processing steps. It allows you to **trace** and **correlate** logs, events, and operations that belong to the same logical transaction, even when they span multiple services or components. + +ABP provides a built-in correlation ID infrastructure that: + +- **Automatically assigns** a unique correlation ID to each incoming HTTP request (or uses the one provided by the caller). +- **Propagates** the correlation ID through distributed event bus messages, HTTP client calls, audit logs, security logs, and Serilog log entries. +- **Provides a simple API** (`ICorrelationIdProvider`) to get or change the current correlation ID in your application code. + +## `AbpCorrelationIdMiddleware` + +`AbpCorrelationIdMiddleware` is an ASP.NET Core middleware that handles correlation ID management for HTTP requests. It is automatically added to the request pipeline when you use ABP's application builder. + +The middleware performs the following steps for each incoming HTTP request: + +1. **Reads** the correlation ID from the incoming request's `X-Correlation-Id` header (configurable via `AbpCorrelationIdOptions` as explained below). +2. **Generates** a new correlation ID (`Guid.NewGuid().ToString("N")`) if the request does not contain one. +3. **Sets** the correlation ID in the current async context using `ICorrelationIdProvider`, making it available throughout the request pipeline. +4. **Writes** the correlation ID to the response header (if `SetResponseHeader` option is enabled). + +You can add the middleware to your request pipeline by calling the `UseCorrelationId` extension method: + +```csharp +app.UseCorrelationId(); +``` + +> This is already configured in the application startup template. You typically don't need to add it manually. + +## `ICorrelationIdProvider` + +`ICorrelationIdProvider` is the core service for working with correlation IDs. It allows you to retrieve the current correlation ID or temporarily change it. + +```csharp +public interface ICorrelationIdProvider +{ + string? Get(); + + IDisposable Change(string? correlationId); +} +``` + +- `Get()`: Returns the current correlation ID for the executing context. Returns `null` if no correlation ID has been set. +- `Change(string? correlationId)`: Changes the correlation ID for the current context and returns an `IDisposable` object. When the returned object is disposed, the correlation ID is restored to its previous value. + +### Using `ICorrelationIdProvider` + +You can inject `ICorrelationIdProvider` into any service to access the current correlation ID: + +```csharp +public class MyService : ITransientDependency +{ + public ILogger Logger { get; set; } + + private readonly ICorrelationIdProvider _correlationIdProvider; + + public MyService(ICorrelationIdProvider correlationIdProvider) + { + Logger = NullLogger.Instance; + _correlationIdProvider = correlationIdProvider; + } + + public async Task DoSomethingAsync() + { + // Get the current correlation ID + var correlationId = _correlationIdProvider.Get(); + + // Use it for logging, tracing, etc. + Logger.LogInformation("Processing with Correlation ID: {CorrelationId}", correlationId); + + await SomeOperationAsync(); + } +} +``` + +### Changing the Correlation ID + +You can temporarily change the correlation ID using the `Change` method. This is useful when you want to create a new scope with a different correlation ID: + +```csharp +public async Task ProcessAsync() +{ + var currentCorrelationId = _correlationIdProvider.Get(); + // currentCorrelationId = "abc123" + + using (_correlationIdProvider.Change("new-correlation-id")) + { + var innerCorrelationId = _correlationIdProvider.Get(); + // innerCorrelationId = "new-correlation-id" + } + + var restoredCorrelationId = _correlationIdProvider.Get(); + // restoredCorrelationId = "abc123" (restored to original) +} +``` + +The `Change` method returns an `IDisposable`. When disposed, the correlation ID is automatically restored to its previous value. This pattern supports nested scopes safely. + +### Default Implementation + +The default implementation (`DefaultCorrelationIdProvider`) uses `AsyncLocal` to store the correlation ID. This ensures that the correlation ID is isolated per async execution flow and is thread-safe. + +## `AbpCorrelationIdOptions` + +You can configure the correlation ID behavior using `AbpCorrelationIdOptions`: + +```csharp +Configure(options => +{ + options.HttpHeaderName = "X-Correlation-Id"; + options.SetResponseHeader = true; +}); +``` + +- `HttpHeaderName` (default: `"X-Correlation-Id"`): The HTTP header name used to read/write the correlation ID. You can change this if your infrastructure uses a different header name. +- `SetResponseHeader` (default: `true`): If `true`, the middleware automatically adds the correlation ID to the HTTP response headers. Set it to `false` if you don't want to expose the correlation ID in response headers. + +## Correlation ID Across ABP Services + +One of the most valuable aspects of ABP's correlation ID infrastructure is that it **automatically propagates** the correlation ID across various system boundaries. This allows you to trace a single user action as it flows through multiple services and components. + +### HTTP Client Calls + +When you use ABP's [dynamic client proxies](../api-development/dynamic-csharp-clients.md) to call remote services, the correlation ID is automatically added to the outgoing HTTP request headers. This means downstream services will receive the same correlation ID, enabling end-to-end tracing across microservices. + +``` +Client Request (X-Correlation-Id: abc123) + → Service A (receives abc123, sets in context) + → Service B via HTTP Client Proxy (forwards abc123 in header) + → Service C via HTTP Client Proxy (forwards abc123 in header) +``` + +No manual configuration is required. ABP's `ClientProxyBase` automatically reads the current correlation ID from `ICorrelationIdProvider` and adds it as a request header. + +### Distributed Event Bus + +When you publish a [distributed event](./event-bus/distributed/index.md), ABP automatically attaches the current correlation ID to the outgoing event message. When the event is consumed (potentially by a different service), the correlation ID is extracted from the message and set in the consumer's context. + +> This works with all supported event bus providers, including [RabbitMQ](./event-bus/distributed/rabbitmq.md), [Kafka](./event-bus/distributed/kafka.md), [Azure Service Bus](./event-bus/distributed/azure.md) and [Rebus](./event-bus/distributed/rebus.md). + +``` +Service A publishes event (CorrelationId: abc123) + → Event Bus (carries abc123 in message metadata) + → Service B receives event (CorrelationId restored to abc123) +``` + +### Audit Logging + +ABP's [audit logging](./audit-logging.md) system automatically captures the current correlation ID when creating audit log entries. This is stored in the `CorrelationId` property of `AuditLogInfo`, allowing you to query and filter audit logs by correlation ID. + +This is particularly useful for: + +- Tracing all database changes made during a single request. +- Correlating audit log entries across multiple services for the same user action. +- Debugging and investigating issues by filtering logs with a specific correlation ID. + +### Security Logging + +Similar to audit logging, ABP's security log system also captures the current correlation ID. When security-related events are logged (such as login attempts, permission checks, etc.), the correlation ID is included in the `SecurityLogInfo.CorrelationId` property. + +### Serilog Integration + +If you use the **ABP Serilog integration**, the correlation ID is automatically added to the Serilog log context as a property. This means every log entry within a request will include the correlation ID, making it easy to filter and search logs. + +The correlation ID is enriched as a log property named `CorrelationId` by default. You can use it in your Serilog output template or structured log queries. + +## See Also + +- [Audit Logging](./audit-logging.md) +- [Distributed Event Bus](./event-bus/distributed/index.md) +- [Dynamic Client Proxies](../api-development/dynamic-csharp-clients.md) diff --git a/docs/en/framework/infrastructure/interceptors.md b/docs/en/framework/infrastructure/interceptors.md index d50de3ad84..9005c3d612 100644 --- a/docs/en/framework/infrastructure/interceptors.md +++ b/docs/en/framework/infrastructure/interceptors.md @@ -42,7 +42,7 @@ Automatically begins and commits/rolls back a database transaction when entering Input DTOs are automatically validated against data annotation attributes and custom validation rules before executing the service logic, providing consistent validation behavior across all services. -### [Authorization](../fundamentals/authorization.md) +### [Authorization](../fundamentals/authorization/index.md) Checks user permissions before allowing the execution of application service methods, ensuring security policies are enforced consistently. diff --git a/docs/en/framework/infrastructure/object-to-object-mapping.md b/docs/en/framework/infrastructure/object-to-object-mapping.md index 4a54500814..39218e7c86 100644 --- a/docs/en/framework/infrastructure/object-to-object-mapping.md +++ b/docs/en/framework/infrastructure/object-to-object-mapping.md @@ -313,6 +313,34 @@ It is suggested to use the `MapExtraPropertiesAttribute` attribute if both class Mapperly requires that properties of both source and destination objects have `setter` methods. Otherwise, the property will be ignored. You can use `protected set` or `private set` to control the visibility of the `setter` method, but each property must have a `setter` method. +### Nullable Reference Types + +Mapperly respects C# nullable reference types (NRT). If your project enables NRT via `enable` in the project file, Mapperly will treat reference type properties as **non-nullable by default**. + +That means: + +- If a property can be `null`, declare it as nullable so Mapperly (and the compiler) understands it can be missing. +- If you declare a property as non-nullable, Mapperly assumes it is not `null`. + +Otherwise, the generated mapping code may throw runtime exceptions (e.g., `NullReferenceException`) if a value is actually `null` during the mapping process. + +Example: + +````xml + + + enable + +```` + +````csharp +public class PersonDto +{ + public Country? Country { get; set; } // Nullable (can be null) + public City City { get; set; } = default!; // Non-nullable (cannot be null) +} +```` + ### Deep Cloning By default, Mapperly does not create deep copies of objects to improve performance. If an object can be directly assigned to the target, it will do so (e.g., if the source and target type are both `List`, the list and its entries will not be cloned). To create deep copies, set the `UseDeepCloning` property on the `MapperAttribute` to `true`. @@ -505,6 +533,7 @@ Each solution has its own advantages: Choose the approach that best aligns with your application's architecture and maintainability requirements. + ### More Mapperly Features Most of Mapperly's features such as `Ignore` can be configured through its attributes. See the [Mapperly documentation](https://mapperly.riok.app/docs/intro/) for more details. diff --git a/docs/en/framework/ui/angular/data-table-column-extensions.md b/docs/en/framework/ui/angular/data-table-column-extensions.md index 0365336d81..81312cdd75 100644 --- a/docs/en/framework/ui/angular/data-table-column-extensions.md +++ b/docs/en/framework/ui/angular/data-table-column-extensions.md @@ -342,4 +342,5 @@ export const identityEntityPropContributors = { ## See Also +- [Extensible Table Row Detail](extensible-table-row-detail.md) - [Customizing Application Modules Guide](../../architecture/modularity/extending/customizing-application-modules-guide.md) diff --git a/docs/en/framework/ui/angular/environment.md b/docs/en/framework/ui/angular/environment.md index 4395141c13..887bd3d4ec 100644 --- a/docs/en/framework/ui/angular/environment.md +++ b/docs/en/framework/ui/angular/environment.md @@ -108,6 +108,80 @@ export interface RemoteEnv { - `method`: HTTP method to be used when retrieving environment config. Default: `GET` - `headers`: If extra headers are needed for the request, it can be set through this field. +### Example RemoteEnv Configuration + +To enable dynamic environment configuration at runtime, add the `remoteEnv` property to your environment file: + +```ts +export const environment = { + // ... other configurations + remoteEnv: { + url: '/getEnvConfig', + mergeStrategy: 'deepmerge' + } +} as Environment; +``` + +### Web Server Configuration + +When using `remoteEnv` with a URL like `/getEnvConfig`, you need to configure your web server to serve the `dynamic-env.json` file with the correct content type (`application/json`). Otherwise, the application may receive HTML (e.g., your `index.html`) instead of JSON, causing configuration to fail silently. + +#### IIS Configuration (web.config) + +```xml + + + + + + + + + + + + + + + + + + + + + +``` + +#### Nginx Configuration + +```nginx +server { + listen 80; + listen [::]:80; + server_name _; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html =404; + } + + location /getEnvConfig { + default_type 'application/json'; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; + add_header 'Content-Type' 'application/json'; + root /usr/share/nginx/html; + try_files $uri /dynamic-env.json; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} +``` + ## Configure Core Provider with Environment `environment` variable comes from angular host application. diff --git a/docs/en/framework/ui/angular/extensible-table-row-detail.md b/docs/en/framework/ui/angular/extensible-table-row-detail.md new file mode 100644 index 0000000000..0ae24e69e1 --- /dev/null +++ b/docs/en/framework/ui/angular/extensible-table-row-detail.md @@ -0,0 +1,189 @@ +```json +//[doc-seo] +{ + "Description": "Learn how to add expandable row details to data tables using the Extensible Table Row Detail component in ABP Framework Angular UI." +} +``` + +# Extensible Table Row Detail for Angular UI + +## Introduction + +The `` component allows you to add expandable row details to any ``. When users click the expand icon, additional content is revealed below the row. + +Extensible Table Row Detail Example + +## Quick Start + +### Step 1. Import the Component + +Import `ExtensibleTableRowDetailComponent` in your component: + +```typescript +import { + ExtensibleTableComponent, + ExtensibleTableRowDetailComponent +} from '@abp/ng.components/extensible'; + +@Component({ + // ... + imports: [ + ExtensibleTableComponent, + ExtensibleTableRowDetailComponent, + ], +}) +export class MyComponent { } +``` + +### Step 2. Add Row Detail Template + +Place `` inside `` with an `ng-template`: + +```html + + + +
+
{%{{{ row.name }}}%}
+

ID: {%{{{ row.id }}}%}

+

Status: {%{{{ row.isActive ? 'Active' : 'Inactive' }}}%}

+
+
+
+
+``` + +An expand/collapse chevron icon will automatically appear in the first column of each row. + +## API + +### ExtensibleTableRowDetailComponent + +| Input | Type | Default | Description | +|-------|------|---------|-------------| +| `rowHeight` | `string` | `number` | `'100%'` | Height of the expanded row detail area | + +### Template Context Variables + +| Variable | Type | Description | +|----------|------|-------------| +| `row` | `R` | The current row data object | +| `expanded` | `boolean` | Whether the row is currently expanded | + +## Usage Examples + +### Basic Example + +Display additional information when a row is expanded: + +```html + + + +
+ Details for: {%{{{ row.name }}}%} +
{%{{{ row | json }}}%}
+
+
+
+
+``` + +### With Custom Row Height + +Specify a fixed height for the detail area: + +```html + + +
Fixed 200px height content
+
+
+``` + +### Using Expanded State + +Apply conditional styling based on expansion state: + +```html + + +
+

This row is {%{{{ expanded ? 'expanded' : 'collapsed' }}}%}

+
+
+
+``` + +### With Badges and Localization + +```html + + +
+
+
+

{%{{{ 'MyModule::Name' | abpLocalization }}}%}

+

{%{{{ row.name }}}%}

+
+
+

{%{{{ 'MyModule::Status' | abpLocalization }}}%}

+

+ @if (row.isActive) { + {%{{{ 'AbpUi::Yes' | abpLocalization }}}%} + } @else { + {%{{{ 'AbpUi::No' | abpLocalization }}}%} + } +

+
+
+
+
+
+``` + +## Alternative: Direct Template Input + +For simpler use cases, you can use the `rowDetailTemplate` input on `` directly: + +```html + + + +
{%{{{ row.name }}}%}
+
+``` + +## Events + +### rowDetailToggle + +The `rowDetailToggle` output emits when a row is expanded or collapsed: + +```html + + + ... + + +``` + +```typescript +onRowToggle(row: MyDto) { + console.log('Row toggled:', row); +} +``` + +## See Also + +- [Data Table Column Extensions](data-table-column-extensions.md) +- [Entity Action Extensions](entity-action-extensions.md) +- [Extensions Overview](extensions-overall.md) diff --git a/docs/en/framework/ui/angular/images/row-detail-image.png b/docs/en/framework/ui/angular/images/row-detail-image.png new file mode 100644 index 0000000000..c99ff98ca0 Binary files /dev/null and b/docs/en/framework/ui/angular/images/row-detail-image.png differ diff --git a/docs/en/framework/ui/angular/localization.md b/docs/en/framework/ui/angular/localization.md index 9f3122529c..d50484c83a 100644 --- a/docs/en/framework/ui/angular/localization.md +++ b/docs/en/framework/ui/angular/localization.md @@ -12,7 +12,7 @@ Before exploring _the localization pipe_ and _the localization service_, you sho The localization key format consists of two sections which are **Resource Name** and **Key**. `ResourceName::Key` -> If you do not specify the resource name, the `defaultResourceName` which is declared in `environment.ts` will be considered as default. +> If you do not specify the resource name, the `defaultResourceName` will be used. The value is first retrieved from the backend API response. If the backend does not provide a `defaultResourceName`, the value declared in `environment.ts` will be used as a fallback. ```ts const environment = { diff --git a/docs/en/framework/ui/angular/permission-management.md b/docs/en/framework/ui/angular/permission-management.md index abba8843de..8d30d925bb 100644 --- a/docs/en/framework/ui/angular/permission-management.md +++ b/docs/en/framework/ui/angular/permission-management.md @@ -7,7 +7,7 @@ # Permission Management -A permission is a simple policy that is granted or prohibited for a particular user, role or client. You can read more about [authorization in ABP](../../fundamentals/authorization.md) document. +A permission is a simple policy that is granted or prohibited for a particular user, role or client. You can read more about [authorization in ABP](../../fundamentals/authorization/index.md) document. You can get permission of authenticated user using `getGrantedPolicy` or `getGrantedPolicy$` method of `PermissionService`. diff --git a/docs/en/framework/ui/blazor/authorization.md b/docs/en/framework/ui/blazor/authorization.md index fc006136b4..453f37963b 100644 --- a/docs/en/framework/ui/blazor/authorization.md +++ b/docs/en/framework/ui/blazor/authorization.md @@ -9,7 +9,7 @@ Blazor applications can use the same authorization system and permissions defined in the server side. -> This document is only for authorizing on the Blazor UI. See the [Server Side Authorization](../../fundamentals/authorization.md) to learn how to define permissions and control the authorization system. +> This document is only for authorizing on the Blazor UI. See the [Server Side Authorization](../../fundamentals/authorization/index.md) to learn how to define permissions and control the authorization system. ## Basic Usage @@ -76,7 +76,7 @@ There are some useful extension methods for the `IAuthorizationService`: ## See Also -* [Authorization](../../fundamentals/authorization.md) (server side) +* [Authorization](../../fundamentals/authorization/index.md) (server side) * [Blazor Security](https://docs.microsoft.com/en-us/aspnet/core/blazor/security/) (Microsoft documentation) * [ICurrentUser Service](../../infrastructure/current-user.md) * [Video tutorial](https://abp.io/video-courses/essentials/authorization) diff --git a/docs/en/framework/ui/blazor/page-toolbar-extensions.md b/docs/en/framework/ui/blazor/page-toolbar-extensions.md index 7e341c50fe..9c96bf90f7 100644 --- a/docs/en/framework/ui/blazor/page-toolbar-extensions.md +++ b/docs/en/framework/ui/blazor/page-toolbar-extensions.md @@ -102,7 +102,7 @@ protected override async ValueTask SetToolbarItemsAsync() #### Permissions -If your button/component should be available based on a [permission/policy](../../fundamentals/authorization.md), you can pass the permission/policy name as the `RequiredPolicyName` parameter to the `AddButton` and `AddComponent` methods. +If your button/component should be available based on a [permission/policy](../../fundamentals/authorization/index.md), you can pass the permission/policy name as the `RequiredPolicyName` parameter to the `AddButton` and `AddComponent` methods. ### Add a Page Toolbar Contributor diff --git a/docs/en/framework/ui/mvc-razor-pages/auto-complete-select.md b/docs/en/framework/ui/mvc-razor-pages/auto-complete-select.md index 69f92be3f2..7157c3ab95 100644 --- a/docs/en/framework/ui/mvc-razor-pages/auto-complete-select.md +++ b/docs/en/framework/ui/mvc-razor-pages/auto-complete-select.md @@ -78,4 +78,4 @@ It'll be automatically bound to a collection of defined value type. ## Notices If the authenticated user doesn't have permission on the given URL, the user will get an authorization error. Be careful while designing this kind of UIs. -You can create a specific, [unauthorized](../../fundamentals/authorization.md) endpoint/method to get the list of items, so the page can retrieve lookup data of dependent entity without giving the entire read permission to users. \ No newline at end of file +You can create a specific, [unauthorized](../../fundamentals/authorization/index.md) endpoint/method to get the list of items, so the page can retrieve lookup data of dependent entity without giving the entire read permission to users. \ No newline at end of file diff --git a/docs/en/framework/ui/mvc-razor-pages/javascript-api/ajax.md b/docs/en/framework/ui/mvc-razor-pages/javascript-api/ajax.md index 3ee58ca458..c710cb4c45 100644 --- a/docs/en/framework/ui/mvc-razor-pages/javascript-api/ajax.md +++ b/docs/en/framework/ui/mvc-razor-pages/javascript-api/ajax.md @@ -32,7 +32,7 @@ abp.ajax({ }); ```` -This command logs the list of users to the console, if you've **logged in** to the application and have [permission](../../../fundamentals/authorization.md) for the user management page of the [Identity Module](../../../../modules/identity.md). +This command logs the list of users to the console, if you've **logged in** to the application and have [permission](../../../fundamentals/authorization/index.md) for the user management page of the [Identity Module](../../../../modules/identity.md). ## Error Handling diff --git a/docs/en/framework/ui/mvc-razor-pages/javascript-api/auth.md b/docs/en/framework/ui/mvc-razor-pages/javascript-api/auth.md index 5f31c184ec..83677eec57 100644 --- a/docs/en/framework/ui/mvc-razor-pages/javascript-api/auth.md +++ b/docs/en/framework/ui/mvc-razor-pages/javascript-api/auth.md @@ -9,7 +9,7 @@ Auth API allows you to check permissions (policies) for the current user in the client side. In this way, you can conditionally show/hide UI parts or perform your client side logic based on the current permissions. -> This document only explains the JavaScript API. See the [authorization document](../../../fundamentals/authorization.md) to understand the ABP authorization & permission system. +> This document only explains the JavaScript API. See the [authorization document](../../../fundamentals/authorization/index.md) to understand the ABP authorization & permission system. ## Basic Usage diff --git a/docs/en/framework/ui/mvc-razor-pages/navigation-menu.md b/docs/en/framework/ui/mvc-razor-pages/navigation-menu.md index 41cc31f77f..f26d18ebbd 100644 --- a/docs/en/framework/ui/mvc-razor-pages/navigation-menu.md +++ b/docs/en/framework/ui/mvc-razor-pages/navigation-menu.md @@ -117,7 +117,7 @@ There are more options of a menu item (the constructor of the `ApplicationMenuIt As seen above, a menu contributor contributes to the menu dynamically. So, you can perform any custom logic or get menu items from any source. -One use case is the [authorization](../../fundamentals/authorization.md). You typically want to add menu items by checking a permission. +One use case is the [authorization](../../fundamentals/authorization/index.md). You typically want to add menu items by checking a permission. **Example: Check if the current user has a permission** diff --git a/docs/en/framework/ui/mvc-razor-pages/page-toolbar-extensions.md b/docs/en/framework/ui/mvc-razor-pages/page-toolbar-extensions.md index 54ad4e182c..00ac30a49d 100644 --- a/docs/en/framework/ui/mvc-razor-pages/page-toolbar-extensions.md +++ b/docs/en/framework/ui/mvc-razor-pages/page-toolbar-extensions.md @@ -134,7 +134,7 @@ Configure(options => #### Permissions -If your button/component should be available based on a [permission/policy](../../fundamentals/authorization.md), you can pass the permission/policy name as the `requiredPolicyName` parameter to the `AddButton` and `AddComponent` methods. +If your button/component should be available based on a [permission/policy](../../fundamentals/authorization/index.md), you can pass the permission/policy name as the `requiredPolicyName` parameter to the `AddButton` and `AddComponent` methods. ### Add a Page Toolbar Contributor diff --git a/docs/en/framework/ui/mvc-razor-pages/toolbars.md b/docs/en/framework/ui/mvc-razor-pages/toolbars.md index fd7160417d..2876242ff0 100644 --- a/docs/en/framework/ui/mvc-razor-pages/toolbars.md +++ b/docs/en/framework/ui/mvc-razor-pages/toolbars.md @@ -79,7 +79,7 @@ public class MyToolbarContributor : IToolbarContributor } ```` -You can use the [authorization](../../fundamentals/authorization.md) to decide whether to add a `ToolbarItem`. +You can use the [authorization](../../fundamentals/authorization/index.md) to decide whether to add a `ToolbarItem`. ````csharp if (await context.IsGrantedAsync("MyPermissionName")) diff --git a/docs/en/framework/ui/mvc-razor-pages/widgets.md b/docs/en/framework/ui/mvc-razor-pages/widgets.md index 7e894027f6..0e7d708551 100644 --- a/docs/en/framework/ui/mvc-razor-pages/widgets.md +++ b/docs/en/framework/ui/mvc-razor-pages/widgets.md @@ -12,7 +12,7 @@ ABP provides a model and infrastructure to create **reusable widgets**. Widget s * Have **scripts & styles** dependencies for your widget. * Create **dashboards** with widgets used inside. * Define widgets in reusable **[modules](../../architecture/modularity/basics.md)**. -* Co-operate widgets with **[authorization](../../fundamentals/authorization.md)** and **[bundling](bundling-minification.md)** systems. +* Co-operate widgets with **[authorization](../../fundamentals/authorization/index.md)** and **[bundling](bundling-minification.md)** systems. ## Basic Widget Definition @@ -482,7 +482,7 @@ Used to refresh the widget when needed. It has a filter argument that can be use Some widgets may need to be available only for authenticated or authorized users. In this case, use the following properties of the `Widget` attribute: * `RequiresAuthentication` (`bool`): Set to true to make this widget usable only for authentication users (user have logged in to the application). -* `RequiredPolicies` (`List`): A list of policy names to authorize the user. See [the authorization document](../../fundamentals/authorization.md) for more info about policies. +* `RequiredPolicies` (`List`): A list of policy names to authorize the user. See [the authorization document](../../fundamentals/authorization/index.md) for more info about policies. Example: diff --git a/docs/en/images/exist-user-accept.png b/docs/en/images/exist-user-accept.png new file mode 100644 index 0000000000..23f35c0904 Binary files /dev/null and b/docs/en/images/exist-user-accept.png differ diff --git a/docs/en/images/invite-admin-user-to-join-tenant-modal.png b/docs/en/images/invite-admin-user-to-join-tenant-modal.png new file mode 100644 index 0000000000..8fa9d2fee9 Binary files /dev/null and b/docs/en/images/invite-admin-user-to-join-tenant-modal.png differ diff --git a/docs/en/images/invite-admin-user-to-join-tenant.png b/docs/en/images/invite-admin-user-to-join-tenant.png new file mode 100644 index 0000000000..edfb5bedb0 Binary files /dev/null and b/docs/en/images/invite-admin-user-to-join-tenant.png differ diff --git a/docs/en/images/invite-user.png b/docs/en/images/invite-user.png new file mode 100644 index 0000000000..67a3f04073 Binary files /dev/null and b/docs/en/images/invite-user.png differ diff --git a/docs/en/images/manage-invitations.png b/docs/en/images/manage-invitations.png new file mode 100644 index 0000000000..969d09cc53 Binary files /dev/null and b/docs/en/images/manage-invitations.png differ diff --git a/docs/en/images/new-user-accept.png b/docs/en/images/new-user-accept.png new file mode 100644 index 0000000000..ffc887f1ed Binary files /dev/null and b/docs/en/images/new-user-accept.png differ diff --git a/docs/en/images/new-user-join-strategy-create-tenant-success.png b/docs/en/images/new-user-join-strategy-create-tenant-success.png new file mode 100644 index 0000000000..2d2969b631 Binary files /dev/null and b/docs/en/images/new-user-join-strategy-create-tenant-success.png differ diff --git a/docs/en/images/new-user-join-strategy-create-tenant.png b/docs/en/images/new-user-join-strategy-create-tenant.png new file mode 100644 index 0000000000..7d4a64c7c0 Binary files /dev/null and b/docs/en/images/new-user-join-strategy-create-tenant.png differ diff --git a/docs/en/images/new-user-join-strategy-inform.png b/docs/en/images/new-user-join-strategy-inform.png new file mode 100644 index 0000000000..a6a62e1c96 Binary files /dev/null and b/docs/en/images/new-user-join-strategy-inform.png differ diff --git a/docs/en/images/resource-based-permission.gif b/docs/en/images/resource-based-permission.gif new file mode 100644 index 0000000000..fbf86ad7a6 Binary files /dev/null and b/docs/en/images/resource-based-permission.gif differ diff --git a/docs/en/images/switch-tenant.png b/docs/en/images/switch-tenant.png new file mode 100644 index 0000000000..6f19de1da7 Binary files /dev/null and b/docs/en/images/switch-tenant.png differ diff --git a/docs/en/images/tenant-selection.png b/docs/en/images/tenant-selection.png new file mode 100644 index 0000000000..e40bf6aaeb Binary files /dev/null and b/docs/en/images/tenant-selection.png differ diff --git a/docs/en/images/user-accepted.png b/docs/en/images/user-accepted.png new file mode 100644 index 0000000000..5273333f6f Binary files /dev/null and b/docs/en/images/user-accepted.png differ diff --git a/docs/en/index.md b/docs/en/index.md index 46b9923b57..86b7104b06 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -68,7 +68,7 @@ There are a lot of features provided by ABP to achieve real world scenarios easi #### Cross Cutting Concerns -ABP also simplifies (and even automates wherever possible) cross cutting concerns and common non-functional requirements like [Exception Handling](./framework/fundamentals/exception-handling.md), [Validation](./framework/fundamentals/validation.md), [Authorization](./framework/fundamentals/authorization.md), [Localization](./framework/fundamentals/localization.md), [Caching](./framework/fundamentals/caching.md), [Dependency Injection](./framework/fundamentals/dependency-injection.md), [Setting Management](./framework/infrastructure/settings.md), etc. +ABP also simplifies (and even automates wherever possible) cross cutting concerns and common non-functional requirements like [Exception Handling](./framework/fundamentals/exception-handling.md), [Validation](./framework/fundamentals/validation.md), [Authorization](./framework/fundamentals/authorization/index.md), [Localization](./framework/fundamentals/localization.md), [Caching](./framework/fundamentals/caching.md), [Dependency Injection](./framework/fundamentals/dependency-injection.md), [Setting Management](./framework/infrastructure/settings.md), etc. ### Tooling diff --git a/docs/en/modules/account-pro.md b/docs/en/modules/account-pro.md index 7944c7448a..a79c3d4992 100644 --- a/docs/en/modules/account-pro.md +++ b/docs/en/modules/account-pro.md @@ -425,3 +425,5 @@ This module doesn't define any additional distributed event. See the [standard d * [Session Management](./account/session-management.md) * [Idle Session Timeout](./account/idle-session-timeout.md) * [Web Authentication API (WebAuthn) passkeys](./account/passkey.md) +* [Shared user accounts](./account/shared-user-accounts.md) +``` \ No newline at end of file diff --git a/docs/en/modules/account/shared-user-accounts.md b/docs/en/modules/account/shared-user-accounts.md new file mode 100644 index 0000000000..4df18e2fdf --- /dev/null +++ b/docs/en/modules/account/shared-user-accounts.md @@ -0,0 +1,151 @@ +```json +//[doc-seo] +{ + "Description": "Learn how Shared User Accounts work in ABP (UserSharingStrategy): login flow with tenant selection, switching tenants, inviting users, and the Pending Tenant registration flow." +} +``` + +# Shared User Accounts + +This document explains **Shared User Accounts**: a single user account can belong to multiple tenants, and the user can choose/switch the active tenant when signing in. + +> This is a **commercial** feature. It is mainly provided by Account.Pro and Identity.Pro (and related SaaS UI). + +## Introduction + +In a typical multi-tenant setup with the **Isolated** user strategy, a user belongs to exactly one tenant (or the Host), and uniqueness rules (username/email) are usually scoped per tenant. + +If you want a `one account, multiple tenants` experience (for example, inviting the same email address into multiple tenants), you should enable the **Shared** user strategy. + +## Enabling Shared User Accounts + +Enable shared accounts by configuring `AbpMultiTenancyOptions.UserSharingStrategy`: + +```csharp +Configure(options => +{ + options.IsEnabled = true; + options.UserSharingStrategy = TenantUserSharingStrategy.Shared; +}); +``` + +### Constraints and Behavior + +When you use Shared User Accounts: + +- Username/email uniqueness becomes **global** (Host + all tenants). A username/email can exist only once, but that user can be invited into multiple tenants. +- Some security/user management settings (2FA, lockout, password policies, recaptcha, etc.) are managed at the **Host** level. + +If you are migrating from an isolated strategy, ABP will validate the existing data when you switch to Shared. If there are conflicts (e.g., the same email registered as separate users in different tenants), you must resolve them before enabling the shared strategy. See the [Migration Guide](#migration-guide) section below. + +## Tenant Selection During Login + +If a user account belongs to multiple tenants, the login flow prompts the user to select the tenant to sign in to: + +![Tenant Selection](../../images/tenant-selection.png) + +## Switching Tenants + +After signing in, the user can switch between the tenants they have joined using the tenant switcher in the user menu: + +![Tenant Switching](../../images/switch-tenant.png) + +## Leaving a Tenant + +Users can leave a tenant. After leaving, the user is no longer a member of that tenant, and the tenant can invite the user again later. + +> When a user leaves and later re-joins the same tenant, the `UserId` does not change and tenant-related data (roles, permissions, etc.) is preserved. + +## Inviting Users to a Tenant + +Tenant administrators can invite existing or not-yet-registered users to join a tenant. The invited user receives an email; clicking the link completes the join process. If the user doesn't have an account yet, they can register and join through the same flow. + +While inviting, you can also assign roles so the user gets the relevant permissions automatically after joining. + +> The invitation feature is also available in the Isolated strategy, but invited users can join only a single tenant. + +![Invite User](../../images/invite-user.png) + +## Managing Invitations + +From the invitation modal, you can view and manage sent invitations, including resending an invitation email and revoking individual or all invitations. + +![Manage Invitations](../../images/manage-invitations.png) + +## Accepting an Invitation + +If the invited person already has an account, clicking the email link shows a confirmation screen to join the tenant: + +![Accept Invitation](../../images/exist-user-accept.png) + +If the invited person doesn't have an account yet, clicking the email link takes them to registration and then joins them to the tenant: + +![Accept Invitation New User](../../images/new-user-accept.png) + +After accepting the invitation, the user can sign in and switch to that tenant. + +![Accepted Invitation](../../images/user-accepted.png) + +## Inviting an Admin After Tenant Creation + +With Shared User Accounts, you typically don't create an `admin` user during tenant creation. Instead, create the tenant first, then invite an existing user (or a new user) and grant the required roles. + +![Invite tenant admin user](../../images/invite-admin-user-to-join-tenant.png) + +![Invite tenant admin user](../../images/invite-admin-user-to-join-tenant-modal.png) + +> In the Isolated strategy, tenant creation commonly seeds an `admin` user automatically. With Shared User Accounts, you usually use invitations instead. + +### Registration Strategy for New Users + +When a user registers a new account, the user is not a member of any tenant by default (and is not a Host user). You can configure `AbpIdentityPendingTenantUserOptions.Strategy` to decide what happens next. + +Available strategies: + +- **CreateTenant**: Automatically creates a tenant for the new user and adds the user to that tenant. +- **Redirect**: Redirects the user to a URL where you can implement custom logic (commonly: a tenant selection/join experience). +- **Inform** (default): Shows an informational message telling the user to contact an administrator to join a tenant. + +> In this state, the user can't proceed into a tenant context until they follow the configured strategy. + +### CreateTenant Strategy + +```csharp +Configure(options => +{ + options.Strategy = AbpIdentityPendingTenantUserStrategy.CreateTenant; +}); +``` + +![new-user--join-strategy-create-tenant](../../images/new-user-join-strategy-create-tenant.png) + +![new-user--join-strategy-create-tenant-success](../../images/new-user-join-strategy-create-tenant-success.png) + +### Redirect Strategy + +```csharp +Configure(options => +{ + options.Strategy = AbpIdentityPendingTenantUserStrategy.Redirect; + options.RedirectUrl = "/your-custom-logic-url"; +}); +``` + +### Inform Strategy + +```csharp +Configure(options => +{ + options.Strategy = AbpIdentityPendingTenantUserStrategy.Inform; +}); +``` + +![new-user--join-strategy-inform](../../images/new-user-join-strategy-inform.png) + +## Migration Guide + +If you plan to migrate an existing multi-tenant application from an isolated strategy to Shared User Accounts, keep the following in mind: + +1. **Uniqueness check**: Before enabling Shared, ensure all existing usernames and emails are unique globally. ABP performs this check when you switch the strategy and reports conflicts. +2. **Tenants with separate databases**: If some tenants use separate databases, you must ensure the Host database contains matching user records in the `AbpUsers` table (and, if you use social login / passkeys, also sync `AbpUserLogins` and `AbpUserPasskeys`) so the Host-side records match the tenant-side data. After that, the framework can create/manage the user-to-tenant associations. + diff --git a/docs/en/modules/ai-management/index.md b/docs/en/modules/ai-management/index.md index e50253c22c..7f617eafbe 100644 --- a/docs/en/modules/ai-management/index.md +++ b/docs/en/modules/ai-management/index.md @@ -9,14 +9,11 @@ > You must have an ABP Team or a higher license to use this module. -> **⚠️ Important Notice** -> The **AI Management Module** is currently in **preview**. The documentation and implementation are subject to change. - -This module implements AI (Artificial Intelligence) management capabilities on top of the [Artificial Intelligence Workspaces](../../framework/infrastructure/artificial-intelligence/index.md) feature of the ABP Framework and allows to manage workspaces dynamically from the application including UI components and API endpoints. +This module implements AI (Artificial Intelligence) management capabilities on top of the [Artificial Intelligence Workspaces](../../framework/infrastructure/artificial-intelligence/index.md) feature of the ABP Framework and allows managing workspaces dynamically from the application, including UI components and API endpoints. ## How to Install -AI Management module is not pre-installed in [the startup templates](../solution-templates/layered-web-application). You can install it using the ABP CLI or ABP Studio. +The **AI Management Module** is not included in [the startup templates](../solution-templates/layered-web-application) by default. However, when creating a new application with [ABP Studio](../../tools/abp-studio/index.md), you can easily enable it during setup via the *AI Integration* step in the project creation wizard. Alternatively, you can install it using the ABP CLI or ABP Studio: **Using ABP CLI:** @@ -28,6 +25,30 @@ abp add-module Volo.AIManagement Open ABP Studio, navigate to your solution explorer, **Right Click** on the project and select **Import Module**. Choose `Volo.AIManagement` from `NuGet` tab and check the "Install this Module" checkbox. Click the "OK" button to install the module. +### Adding an AI Provider + +> [!IMPORTANT] +> The AI Management module requires **at least one AI provider** package to be installed. Without a provider, the module won't be able to create chat clients for your workspaces. + +Install one of the built-in provider packages using the ABP CLI: + +**For OpenAI (including Azure OpenAI-compatible endpoints):** + +```bash +abp add-package Volo.AIManagement.OpenAI +``` + +**For Ollama (local AI models):** + +```bash +abp add-package Volo.AIManagement.Ollama +``` + +> [!TIP] +> You can install multiple provider packages to support different AI providers simultaneously in your workspaces. + +If you need to integrate with a provider that isn't covered by the built-in packages, you can implement your own. See the [Implementing Custom AI Provider Factories](#implementing-custom-ai-provider-factories) section for details. + ## Packages This module follows the [module development best practices guide](../../framework/architecture/best-practices) and consists of several NuGet and NPM packages. See the guide if you want to understand the packages and relations between them. @@ -38,9 +59,15 @@ AI Management module packages are designed for various usage scenarios. Packages ## User Interface +This module provides UI integration for all three officially supported UI frameworks by ABP: + +* **MVC / Razor Pages** UI +* **Angular** UI +* **Blazor** UI (Server & WebAssembly) + ### Menu Items -AI Management module adds the following items to the "Main" menu: +The **AI Management Module** adds the following items to the "Main" menu: * **AI Management**: Root menu item for AI Management module. (`AIManagement`) * **Workspaces**: Workspace management page. (`AIManagement.Workspaces`) @@ -459,8 +486,7 @@ Your application acts as a proxy, forwarding these requests to the AI Management | **4. Client Proxy** | No | Remote Service | Remote Service | Yes | API Gateway pattern, proxy services | - -## Client Usage (MVC UI) +## Client Usage AI Management uses different packages depending on the usage scenario: @@ -468,6 +494,8 @@ AI Management uses different packages depending on the usage scenario: - **`Volo.AIManagement.Client.*` packages**: These are designed for applications that need to consume AI services from a remote application. They provide both server and client side of remote access to the AI services. +### MVC / Razor Pages UI + **List of packages:** - `Volo.AIManagement.Client.Application` - `Volo.AIManagement.Client.Application.Contracts` @@ -475,10 +503,12 @@ AI Management uses different packages depending on the usage scenario: - `Volo.AIManagement.Client.HttpApi.Client` - `Volo.AIManagement.Client.Web` -### The Chat Widget +#### The Chat Widget + The `Volo.AIManagement.Client.Web` package provides a chat widget to allow you to easily integrate a chat interface into your application that uses a specific AI workspace named `ChatClientChatViewComponent`. -#### Basic Usage +##### Basic Usage + You can invoke the `ChatClientChatViewComponent` Widget in your razor page with the following code: ```csharp @@ -490,8 +520,10 @@ You can invoke the `ChatClientChatViewComponent` Widget in your razor page with ![ai-management-workspaces](../../images/ai-management-widget.png) -#### Properties +##### Properties + You can customize the chat widget with the following properties: + - `WorkspaceName`: The name of the workspace to use. - `ComponentId`: Unique identifier for accessing the component via JavaScript API (stored in abp.chatComponents). - `ConversationId`: The unique identifier for persisting and retrieving chat history from client-side storage. @@ -511,7 +543,8 @@ You can customize the chat widget with the following properties: }) ``` -#### Using the Conversation Id +##### Using the Conversation Id + You can use the `ConversationId` property to specify the id of the conversation to use. When the Conversation Id is provided, the chat will be stored at the client side and will be retrieved when the user revisits the page that contains the chat widget. If it's not provided or provided as **null**, the chat will be temporary and will not be saved, it'll be lost when the component lifetime ends. ```csharp @@ -522,7 +555,8 @@ You can use the `ConversationId` property to specify the id of the conversation }) ``` -#### JavaScript API +##### JavaScript API + The chat components are initialized automatically when the ViewComponent is rendered in the page. All the initialized components in the page are stored in the `abp.chatComponents` object. You can retrieve a specific component by its `ComponentId` which is defined while invoking the ViewComponent. ```csharp @@ -603,6 +637,141 @@ chatComponent.off('messageSent', callbackFunction); }); ``` +### Angular UI + +#### Installation + +In order to configure the application to use the AI Management module, you first need to import `provideAIManagementConfig` from `@volo/abp.ng.ai-management/config` to root application configuration. Then, you will need to append it to the `appConfig` array: + +```js +// app.config.ts +import { provideAIManagementConfig } from '@volo/abp.ng.ai-management/config'; + +export const appConfig: ApplicationConfig = { + providers: [ + // ... + provideAIManagementConfig(), + ], +}; +``` + +The AI Management module should be imported and lazy-loaded in your routing array. It has a static `createRoutes` method for configuration. It is available for import from `@volo/abp.ng.ai-management`. + +```js +// app.routes.ts +const APP_ROUTES: Routes = [ + // ... + { + path: 'ai-management', + loadChildren: () => + import('@volo/abp.ng.ai-management').then(m => m.createRoutes(/* options here */)), + }, +]; +``` + +#### Services / Models + +AI Management module services and models are generated via `generate-proxy` command of the [ABP CLI](../../cli). If you need the module's proxies, you can run the following command in the Angular project directory: + +```bash +abp generate-proxy --module aiManagement +``` + +#### Remote Endpoint URL + +The AI Management module remote endpoint URLs can be configured in the environment files. + +```js +export const environment = { + // other configurations + apis: { + default: { + url: 'default url here', + }, + AIManagement: { + url: 'AI Management remote url here', + }, + // other api configurations + }, +}; +``` + +The AI Management module remote URL configurations shown above are optional. + +> If you don't set the `AIManagement` property, the `default.url` will be used as fallback. + +#### The Chat Widget + +The `@volo/abp.ng.ai-management` package provides a `ChatInterfaceComponent` (`abp-chat-interface`) that you can use to embed a chat interface into your Angular application that communicates with a specific AI workspace. + +**Example: You can use the `abp-chat-interface` component in your template**: + +```html + +``` + +- `workspaceName` (required): The name of the workspace to use. +- `conversationId`: The unique identifier for persisting and retrieving chat history from client-side storage. When provided, the chat history is stored in the browser and restored when the user revisits the page. If `null`, the chat is ephemeral and will be lost when the component is destroyed. +- `providerName`: The name of the AI provider. Used for displaying contextual error messages. + +### Blazor UI + +#### Remote Endpoint URL + +The AI Management module remote endpoint URLs can be configured in your `appsettings.json`: + +```json +"RemoteServices": { + "Default": { + "BaseUrl": "Default url here" + }, + "AIManagement": { + "BaseUrl": "AI Management remote url here" + } +} +``` + +For **Blazor WebAssembly**, you can also configure the remote endpoint URL via `AIManagementClientBlazorWebAssemblyOptions`: + +```csharp +Configure(options => +{ + options.RemoteServiceUrl = builder.Configuration["RemoteServices:AIManagement:BaseUrl"]; +}); +``` + +> If you don't set the `BaseUrl` for AIManagement, the `Default.BaseUrl` will be used as fallback. + +#### The Chat Widget + +The `Volo.AIManagement.Client.Blazor` package provides a `ChatClientChat` Blazor component that you can use to embed a chat interface into your Blazor application that communicates with a specific AI workspace. + +**Example: You can use the `ChatClientChat` component in your Blazor page:** + +```xml + +``` + +- `WorkspaceName` (required): The name of the workspace to use. +- `ConversationId`: The unique identifier for persisting and retrieving chat history from client-side storage. When provided, the chat history is stored in the browser's local storage and restored when the user revisits the page. If not provided or `null`, the chat is ephemeral and will be lost when the component is disposed. +- `Title`: The title displayed in the chat widget header. +- `ShowStreamCheckbox`: Whether to show a checkbox that allows the user to toggle streaming on and off. Default is `false`. +- `OnFirstMessage`: An `EventCallback` that is triggered when the first message is sent in a conversation. It can be used to determine the chat title after the first prompt like applied in the chat playground. The event args contain `ConversationId` and `Message` properties. + +```xml + +``` + ## 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. diff --git a/docs/en/modules/audit-logging-pro.md b/docs/en/modules/audit-logging-pro.md index e64b39dc66..851787d390 100644 --- a/docs/en/modules/audit-logging-pro.md +++ b/docs/en/modules/audit-logging-pro.md @@ -73,6 +73,8 @@ You can export audit logs to Excel by clicking the "Export to Excel" button in t Entity changes tab is used to list, view and filter entity change logs. +> **Blazor Server note:** Entity change history can be missing or incomplete in some `Blazor Server` scenarios due to known SignalR/event-pipeline limitations. See [Audit Logging](../framework/infrastructure/audit-logging.md) and [#11682](https://github.com/abpframework/abp/issues/11682). + ![audit-logging-module-entity-changes-list-page](../images/audit-logging-module-entity-changes-list-page.png) @@ -143,7 +145,7 @@ Configure(options => // The Hangfire Cron expression is different from the Quartz Cron expression, Please refer to the following links: // https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/crontriggers.html#cron-expressions // https://docs.hangfire.io/en/latest/background-methods/performing-recurrent-tasks.html - options.ExcelFileCleanupOptions.CronExpression = "0 23 * * *"; // Quartz Cron expression is "0 23 * * * ?" + options.ExcelFileCleanupOptions.CronExpression = "0 23 * * *"; // Quartz Cron expression is "0 0 23 * * ?" }); ``` @@ -164,7 +166,7 @@ Configure(options => // The Hangfire Cron expression is different from the Quartz Cron expression, Please refer to the following links: // https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/crontriggers.html#cron-expressions // https://docs.hangfire.io/en/latest/background-methods/performing-recurrent-tasks.html - options.ExcelFileCleanupOptions.CronExpression = "0 23 * * *"; // Quartz Cron expression is "0 23 * * * ?" + options.ExcelFileCleanupOptions.CronExpression = "0 23 * * *"; // Quartz Cron expression is "0 0 23 * * ?" }); ``` diff --git a/docs/en/modules/cms-kit-pro/index.md b/docs/en/modules/cms-kit-pro/index.md index b7ce2f03d4..2aec352cab 100644 --- a/docs/en/modules/cms-kit-pro/index.md +++ b/docs/en/modules/cms-kit-pro/index.md @@ -54,6 +54,11 @@ If you want to add the CMS kit to your existing solution, you can use the ABP CL ```bash abp add-module Volo.CmsKit.Pro ``` + +> **Important**: CMS Kit Pro requires both the Pro packages **and** the base CMS Kit packages. The `add-module` command handles this automatically, but if you're adding packages manually, you need both: +> - `Volo.CmsKit.*` packages (base CMS Kit) +> - `Volo.CmsKit.Pro.*` packages (Pro features) + Open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure` method to enable all open-source and commercial features in the CMS Kit module. ```csharp diff --git a/docs/en/modules/identity-pro.md b/docs/en/modules/identity-pro.md index 0d26154932..7e66e5514c 100644 --- a/docs/en/modules/identity-pro.md +++ b/docs/en/modules/identity-pro.md @@ -75,7 +75,7 @@ You can manage permissions of a role: * A permission is an **action of the application** granted to roles and users. * A user with a role will **inherit** all the permissions granted for the role. -* Any module can **[define permissions](../framework/fundamentals/authorization.md#permission-system)**. Once you define a new permission, it will be available in this page. +* Any module can **[define permissions](../framework/fundamentals/authorization/index.md#permission-system)**. Once you define a new permission, it will be available in this page. * Left side is the **list of modules**. Once you click to a module name, you can check/uncheck permissions related to that module. ##### Role claims diff --git a/docs/en/modules/identity.md b/docs/en/modules/identity.md index 8d800fe131..b302f74428 100644 --- a/docs/en/modules/identity.md +++ b/docs/en/modules/identity.md @@ -31,7 +31,7 @@ The menu items and the related pages are authorized. That means the current user ![identity-module-permissions](../images/identity-module-permissions.png) -See the [Authorization document](../framework/fundamentals/authorization.md) to understand the permission system. +See the [Authorization document](../framework/fundamentals/authorization/index.md) to understand the permission system. ### Pages diff --git a/docs/en/modules/openiddict-pro.md b/docs/en/modules/openiddict-pro.md index f531f65531..94d8deb631 100644 --- a/docs/en/modules/openiddict-pro.md +++ b/docs/en/modules/openiddict-pro.md @@ -384,7 +384,7 @@ PreConfigure(options => #### Updating Claims In Access_token and Id_token -[Claims Principal Factory](../framework/fundamentals/authorization.md#claims-principal-factory) can be used to add/remove claims to the `ClaimsPrincipal`. +[Claims Principal Factory](../framework/fundamentals/authorization/index.md#claims-principal-factory) can be used to add/remove claims to the `ClaimsPrincipal`. The `AbpDefaultOpenIddictClaimDestinationsProvider` service will add `Name`, `Email,` and `Role` types of Claims to `access_token` and `id_token`, other claims are only added to `access_token` by default, and remove the `SecurityStampClaimType` secret claim of `Identity`. diff --git a/docs/en/modules/openiddict.md b/docs/en/modules/openiddict.md index c17b8200d2..c1ed40ff9f 100644 --- a/docs/en/modules/openiddict.md +++ b/docs/en/modules/openiddict.md @@ -332,7 +332,7 @@ Configure(options => #### Updating Claims In Access_token and Id_token -[Claims Principal Factory](../framework/fundamentals/authorization.md#claims-principal-factory) can be used to add/remove claims to the `ClaimsPrincipal`. +[Claims Principal Factory](../framework/fundamentals/authorization/index.md#claims-principal-factory) can be used to add/remove claims to the `ClaimsPrincipal`. The `AbpDefaultOpenIddictClaimsPrincipalHandler` service will add `Name`, `Email,` and `Role` types of Claims to `access_token` and `id_token`, other claims are only added to `access_token` by default, and remove the `SecurityStampClaimType` secret claim of `Identity`. diff --git a/docs/en/modules/permission-management.md b/docs/en/modules/permission-management.md index 85cefffe7d..2e5f997423 100644 --- a/docs/en/modules/permission-management.md +++ b/docs/en/modules/permission-management.md @@ -7,9 +7,9 @@ # Permission Management Module -This module implements the `IPermissionStore` to store and manage permissions values in a database. +This module implements the `IPermissionStore` and `IResourcePermissionStore` to store and manage permission values in a database. -> This document covers only the permission management module which persists permission values to a database. See the [Authorization document](../framework/fundamentals/authorization.md) to understand the authorization and permission systems. +> This document covers only the permission management module which persists permission values to a database. See the [Authorization document](../framework/fundamentals/authorization/index.md) to understand the authorization and permission systems. ## How to Install @@ -33,11 +33,87 @@ When you click *Actions* -> *Permissions* for a role, the permission management In this dialog, you can grant permissions for the selected role. The tabs in the left side represents main permission groups and the right side contains the permissions defined in the selected group. +### Resource Permission Management Dialog + +In addition to standard permissions, this module provides a reusable dialog for managing **resource-based permissions** on specific resource instances. This allows administrators to grant or revoke permissions for users, roles and clients on individual resources (e.g., a specific document, project, or any entity). + +![resource-permissions-module-dialog](../images/resource-based-permission.gif) + +The dialog displays all resource permissions defined for the resource type and allows granting them to specific users, roles or clients for the selected resource instance. + +You can integrate this dialog into your own application to manage permissions for your custom entities and resources. See the following sections to learn how to use the component in each UI framework. + +#### MVC / Razor Pages + +Use the `abp.ModalManager` to open the resource permission management dialog: + +````javascript +var _resourcePermissionsModal = new abp.ModalManager( + abp.appPath + 'AbpPermissionManagement/ResourcePermissionManagementModal' +); + +// Open the modal for a specific resource +_resourcePermissionsModal.open({ + resourceName: 'MyApp.Document', + resourceKey: documentId, + resourceDisplayName: documentTitle +}); +```` + +#### Blazor + +Use the `ResourcePermissionManagementModal` component's `OpenAsync` method to open the dialog: + +````razor +@using Volo.Abp.PermissionManagement.Blazor.Components + + + +@code { + private ResourcePermissionManagementModal ResourcePermissionModal { get; set; } + + private async Task OpenPermissionsModal() + { + await ResourcePermissionModal.OpenAsync( + resourceName: "MyApp.Document", + resourceKey: Document.Id.ToString(), + resourceDisplayName: Document.Title + ); + } +} +```` + +#### Angular + +Use the `ResourcePermissionManagementComponent`: + +````typescript +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { ResourcePermissionManagementComponent } from '@abp/ng.permission-management'; + +@Component({ + // ... +}) +export class DocumentListComponent { + constructor(private modalService: NgbModal) {} + + openPermissionsModal(document: DocumentDto) { + const modalRef = this.modalService.open( + ResourcePermissionManagementComponent, + { size: 'lg' } + ); + modalRef.componentInstance.resourceName = 'MyApp.Document'; + modalRef.componentInstance.resourceKey = document.id; + modalRef.componentInstance.resourceDisplayName = document.title; + } +} +```` + ## IPermissionManager -`IPermissionManager` is the main service provided by this module. It is used to read and change the permission values. `IPermissionManager` is typically used by the *Permission Management Dialog*. However, you can inject it if you need to set a permission value. +`IPermissionManager` is the main service provided by this module. It is used to read and change the global permission values. `IPermissionManager` is typically used by the *Permission Management Dialog*. However, you can inject it if you need to set a permission value. -> If you just want to read/check permission values for the current user, use the `IAuthorizationService` or the `[Authorize]` attribute as explained in the [Authorization document](../framework/fundamentals/authorization.md). +> If you just want to read/check permission values for the current user, use the `IAuthorizationService` or the `[Authorize]` attribute as explained in the [Authorization document](../framework/fundamentals/authorization/index.md). **Example: Grant permissions to roles and users using the `IPermissionManager` service** @@ -67,9 +143,125 @@ public class MyService : ITransientDependency } ```` +## IResourcePermissionManager + +`IResourcePermissionManager` is the service for programmatically managing resource-based permissions. It is typically used by the *Resource Permission Management Dialog*. However, you can inject it when you need to grant, revoke, or query permissions for specific resource instances. + +> If you just want to check resource permission values for the current user, use the `IResourcePermissionChecker` service as explained in the [Resource-Based Authorization](../framework/fundamentals/authorization/resource-based-authorization.md) document. + +**Example: Grant and revoke resource permissions programmatically** + +````csharp +public class DocumentPermissionService : ITransientDependency +{ + private readonly IResourcePermissionManager _resourcePermissionManager; + + public DocumentPermissionService( + IResourcePermissionManager resourcePermissionManager) + { + _resourcePermissionManager = resourcePermissionManager; + } + + public async Task GrantViewPermissionToUserAsync( + Guid documentId, + Guid userId) + { + await _resourcePermissionManager.SetAsync( + permissionName: "MyApp_Document_View", + resourceName: "MyApp.Document", + resourceKey: documentId.ToString(), + providerName: "U", // User + providerKey: userId.ToString(), + isGranted: true + ); + } + + public async Task GrantEditPermissionToRoleAsync( + Guid documentId, + string roleName) + { + await _resourcePermissionManager.SetAsync( + permissionName: "MyApp_Document_Edit", + resourceName: "MyApp.Document", + resourceKey: documentId.ToString(), + providerName: "R", // Role + providerKey: roleName, + isGranted: true + ); + } + + public async Task RevokeUserPermissionsAsync( + Guid documentId, + Guid userId) + { + await _resourcePermissionManager.DeleteAsync( + resourceName: "MyApp.Document", + resourceKey: documentId.ToString(), + providerName: "U", + providerKey: userId.ToString() + ); + } +} +```` + +## IResourcePermissionStore + +The `IResourcePermissionStore` interface is responsible for retrieving resource permission values from the database. This module provides the default implementation that stores permissions in the database. + +You can query the store directly if needed: + +````csharp +public class MyService : ITransientDependency +{ + private readonly IResourcePermissionStore _resourcePermissionStore; + + public MyService(IResourcePermissionStore resourcePermissionStore) + { + _resourcePermissionStore = resourcePermissionStore; + } + + public async Task GetGrantedResourceKeysAsync(string permissionName) + { + // Get all resource keys where the permission is granted + return await _resourcePermissionStore.GetGrantedResourceKeysAsync( + "MyApp.Document", + permissionName); + } +} +```` + +## Cleaning Up Resource Permissions + +When a resource is deleted, you should clean up its associated permissions to avoid orphaned permission records in the database. You can do this directly in your delete logic or handle it asynchronously through event handlers: + +````csharp +public async Task DeleteDocumentAsync(Guid id) +{ + // Delete the document + await _documentRepository.DeleteAsync(id); + + // Clean up all permissions for this resource + await _resourcePermissionManager.DeleteAsync( + resourceName: "MyApp.Document", + resourceKey: id.ToString(), + providerName: "U", + providerKey: null // Deletes for all users + ); + + await _resourcePermissionManager.DeleteAsync( + resourceName: "MyApp.Document", + resourceKey: id.ToString(), + providerName: "R", + providerKey: null // Deletes for all roles + ); +} +```` + +> ABP modules automatically handle permission cleanup for their own entities. For your custom entities, you are responsible for cleaning up resource permissions when resources are deleted. + ## Permission Management Providers -Permission Management Module is extensible, just like the [permission system](../framework/fundamentals/authorization.md). You can extend it by defining permission management providers. +Permission Management Module is extensible, just like the [permission system](../framework/fundamentals/authorization/index.md). You can extend it by defining permission management providers. [Identity Module](identity.md) defines the following permission management providers: @@ -111,6 +303,109 @@ Configure(options => The order of the providers are important. Providers are executed in the reverse order. That means the `CustomPermissionManagementProvider` is executed first for this example. You can insert your provider in any order in the `Providers` list. +### Resource Permission Management Providers + +Similar to standard permission management providers, you can create custom providers for resource permissions by implementing `IResourcePermissionManagementProvider` or inheriting from `ResourcePermissionManagementProvider`: + +````csharp +public class CustomResourcePermissionManagementProvider + : ResourcePermissionManagementProvider +{ + public override string Name => "Custom"; + + public CustomResourcePermissionManagementProvider( + IResourcePermissionGrantRepository resourcePermissionGrantRepository, + IGuidGenerator guidGenerator, + ICurrentTenant currentTenant) + : base( + resourcePermissionGrantRepository, + guidGenerator, + currentTenant) + { + } +} +```` + +After creating the custom provider, you need to register your provider using the `PermissionManagementOptions` in your module class: + +````csharp +Configure(options => +{ + options.ResourceManagementProviders.Add(); +}); +```` + +## Permission Value Providers + +Permission value providers are used to determine if a permission is granted. They are different from management providers: **value providers** are used when *checking* permissions, while **management providers** are used when *setting* permissions. + +> For standard permissions, see the [Authorization document](../framework/fundamentals/authorization/index.md) for details on permission value providers. + +### Resource Permission Value Providers + +Similar to the standard permission system, you can create custom value providers for resource permissions. ABP comes with two built-in resource permission value providers: + +* `UserResourcePermissionValueProvider` (`U`): Checks permissions granted directly to users +* `RoleResourcePermissionValueProvider` (`R`): Checks permissions granted to roles + +You can create your own custom value provider by implementing the `IResourcePermissionValueProvider` interface or inheriting from the `ResourcePermissionValueProvider` base class: + +````csharp +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions.Resources; + +public class OwnerResourcePermissionValueProvider : ResourcePermissionValueProvider +{ + public override string Name => "Owner"; + + public OwnerResourcePermissionValueProvider( + IResourcePermissionStore permissionStore) + : base(permissionStore) + { + } + + public override async Task CheckAsync( + ResourcePermissionValueCheckContext context) + { + // Check if the current user is the owner of the resource + var currentUserId = context.Principal?.FindUserId(); + if (currentUserId == null) + { + return PermissionGrantResult.Undefined; + } + + // Your logic to determine if user is the owner + var isOwner = await CheckIfUserIsOwnerAsync( + currentUserId.Value, + context.ResourceName, + context.ResourceKey); + + return isOwner + ? PermissionGrantResult.Granted + : PermissionGrantResult.Undefined; + } + + private Task CheckIfUserIsOwnerAsync( + Guid userId, + string resourceName, + string resourceKey) + { + // Implement your ownership check logic + throw new NotImplementedException(); + } +} +```` + +Register your custom provider in your module's `ConfigureServices` method: + +````csharp +Configure(options => +{ + options.ResourceValueProviders.Add(); +}); +```` + ## See Also -* [Authorization](../framework/fundamentals/authorization.md) \ No newline at end of file +* [Authorization](../framework/fundamentals/authorization/index.md) +* [Resource-Based Authorization](../framework/fundamentals/authorization/resource-based-authorization.md) diff --git a/docs/en/others/aspnet-zero-vs-abp.md b/docs/en/others/aspnet-zero-vs-abp.md index 3d18d51a02..dc26286b32 100644 --- a/docs/en/others/aspnet-zero-vs-abp.md +++ b/docs/en/others/aspnet-zero-vs-abp.md @@ -34,6 +34,11 @@ ABP AspNet Boilerplate + + .NET Version + .NET 10 + .NET 10 + Microservice compatible @@ -87,6 +92,11 @@ + + React UI + + + User Interface (Account / Login) @@ -188,7 +198,7 @@ OpenIddict integration - + Identity Server Management UI @@ -200,6 +210,11 @@ + + Passkeys + + + User Interface (Application) @@ -347,6 +362,71 @@ GDPR (downloading personal data & deleting accounts) + + + User Idle Session Timeout + + + + + Comment section for pages + + + + + Dynamic FAQ page + + + + + Feedback system + + + + + Desktop tool for monitoring and orchestrating projects + + + + + AI Management UI + + + + + AI Support Bot + + + + + Bunny BLOB Storage Provider + + + + + Google Cloud BLOB Storage Provider + + + + + User Registration Email Verification + + + + + Angular SSR + + + + + Mapperly integration + + + + + Elsa workflow integration + + UI Theme @@ -365,17 +445,27 @@ Mobile Application - Xamarin application - + React Native application + - React Native application + .NET MAUI + + + + .NET MAUI Code generation + - .NET MAUI + .NET MAUI QR Login + + + + + .NET MAUI Dark mode @@ -400,6 +490,11 @@ + + AI Support alongside human support + + +   Pricing diff --git a/docs/en/package-version-changes.md b/docs/en/package-version-changes.md new file mode 100644 index 0000000000..d0f7114552 --- /dev/null +++ b/docs/en/package-version-changes.md @@ -0,0 +1,9 @@ +# Package Version Changes + +## 10.1.0 + +| Package | Old Version | New Version | PR | +|---------|-------------|-------------|-----| +| Microsoft.SemanticKernel | 1.67.1 | 1.71.0 | #24891 | +| Microsoft.SemanticKernel.Abstractions | 1.67.1 | 1.71.0 | #24891 | + diff --git a/docs/en/solution-templates/layered-web-application/overview.md b/docs/en/solution-templates/layered-web-application/overview.md index 4c9678fcb2..1a091649cc 100644 --- a/docs/en/solution-templates/layered-web-application/overview.md +++ b/docs/en/solution-templates/layered-web-application/overview.md @@ -41,7 +41,7 @@ The following **libraries and services** come **pre-installed** and **configured The following features are built and pre-configured for you in the solution. * **Authentication** is fully configured based on best practices. -* **[Permission](../../framework/fundamentals/authorization.md)** (authorization), **[setting](../../framework/infrastructure/settings.md)**, **[feature](../../framework/infrastructure/features.md)** and the **[localization](../../framework/fundamentals/localization.md)** management systems are pre-configured and ready to use. +* **[Permission](../../framework/fundamentals/authorization/index.md)** (authorization), **[setting](../../framework/infrastructure/settings.md)**, **[feature](../../framework/infrastructure/features.md)** and the **[localization](../../framework/fundamentals/localization.md)** management systems are pre-configured and ready to use. * **[Background job system](../../framework/infrastructure/background-jobs/index.md)**. * **[BLOB storge](../../framework/infrastructure/blob-storing/index.md)** system is installed with the [database provider](../../framework/infrastructure/blob-storing/database.md). * **On-the-fly database migration** system (services automatically migrated their database schema when you deploy a new version). **\*** diff --git a/docs/en/solution-templates/microservice/overview.md b/docs/en/solution-templates/microservice/overview.md index 6f0e2e9399..fc322565c3 100644 --- a/docs/en/solution-templates/microservice/overview.md +++ b/docs/en/solution-templates/microservice/overview.md @@ -49,7 +49,7 @@ The following features are built and pre-configured for you in the solution. * **OpenId Connect Authentication**, if you have selected the MVC UI. * **Authorization code flow** is implemented, if you have selected a SPA UI (Angular or Blazor WASM). * Other flows (resource owner password, client credentials...) are easy to use when you need them. -* **[Permission](../../framework/fundamentals/authorization.md)** (authorization), **[setting](../../framework/infrastructure/settings.md)**, **[feature](../../framework/infrastructure/features.md)** and the **[localization](../../framework/fundamentals/localization.md)** management systems are pre-configured and ready to use. +* **[Permission](../../framework/fundamentals/authorization/index.md)** (authorization), **[setting](../../framework/infrastructure/settings.md)**, **[feature](../../framework/infrastructure/features.md)** and the **[localization](../../framework/fundamentals/localization.md)** management systems are pre-configured and ready to use. * **[Background job system](../../framework/infrastructure/background-jobs/index.md)** with [RabbitMQ integrated](../../framework/infrastructure/background-jobs/rabbitmq.md). * **[BLOB storge](../../framework/infrastructure/blob-storing/index.md)** system is installed with the [database provider](../../framework/infrastructure/blob-storing/database.md) and a separate database. * **On-the-fly database migration** system (services automatically migrated their database schema when you deploy a new version) diff --git a/docs/en/solution-templates/microservice/permission-management.md b/docs/en/solution-templates/microservice/permission-management.md index e4e721a2cd..87aa0f8757 100644 --- a/docs/en/solution-templates/microservice/permission-management.md +++ b/docs/en/solution-templates/microservice/permission-management.md @@ -27,7 +27,7 @@ Since [Permission Management](../../modules/permission-management.md) is a funda ## Permission Management -The *Administration* microservice provides a set of APIs to manage permissions. Every microservice [defines](../../framework/fundamentals/authorization.md) its own permissions. When a microservice starts, it registers its permissions to the related permission definition tables if `SaveStaticPermissionsToDatabase` option is true for `PermissionManagementOptions`. Since the default value is true, this behavior is ensured. After that, you can see the permissions from the [Permission Management Dialog](../../modules/permission-management.md#permission-management-dialog) for related provider such as *User*, *Role* or *Client (OpenIddict Applications)*. +The *Administration* microservice provides a set of APIs to manage permissions. Every microservice [defines](../../framework/fundamentals/authorization/index.md) its own permissions. When a microservice starts, it registers its permissions to the related permission definition tables if `SaveStaticPermissionsToDatabase` option is true for `PermissionManagementOptions`. Since the default value is true, this behavior is ensured. After that, you can see the permissions from the [Permission Management Dialog](../../modules/permission-management.md#permission-management-dialog) for related provider such as *User*, *Role* or *Client (OpenIddict Applications)*. ![user-permissions](images/user-permissions.png) diff --git a/docs/en/solution-templates/single-layer-web-application/overview.md b/docs/en/solution-templates/single-layer-web-application/overview.md index a0e1e50093..c7e16090a7 100644 --- a/docs/en/solution-templates/single-layer-web-application/overview.md +++ b/docs/en/solution-templates/single-layer-web-application/overview.md @@ -39,7 +39,7 @@ The following **libraries and services** come **pre-installed** and **configured The solution comes with the following built-in and pre-configured features: * **Authentication** is fully configured based on best practices. -* **[Permission](../../framework/fundamentals/authorization.md)** (authorization), **[setting](../../framework/infrastructure/settings.md)**, **[feature](../../framework/infrastructure/features.md)** and the **[localization](../../framework/fundamentals/localization.md)** management systems are pre-configured and ready to use. +* **[Permission](../../framework/fundamentals/authorization/index.md)** (authorization), **[setting](../../framework/infrastructure/settings.md)**, **[feature](../../framework/infrastructure/features.md)** and the **[localization](../../framework/fundamentals/localization.md)** management systems are pre-configured and ready to use. * **[Background job system](../../framework/infrastructure/background-jobs/index.md)**. * **[BLOB storge](../../framework/infrastructure/blob-storing/index.md)** system is installed with the [database provider](../../framework/infrastructure/blob-storing/database.md). * **On-the-fly database migration** system (services automatically migrated their database schema when you deploy a new version). **\*** diff --git a/docs/en/solution-templates/single-layer-web-application/solution-structure.md b/docs/en/solution-templates/single-layer-web-application/solution-structure.md index ffb085855f..dd24b91f09 100644 --- a/docs/en/solution-templates/single-layer-web-application/solution-structure.md +++ b/docs/en/solution-templates/single-layer-web-application/solution-structure.md @@ -56,7 +56,7 @@ This template uses a single-project structure, with concerns separated into fold * **Migrations**: Contains the database migration files. It is created automatically by EF Core. * **ObjectMapping**: Define your [object-to-object mapping](../../framework/infrastructure/object-to-object-mapping.md) classes in this folder. * **Pages**: Define your UI pages (Razor Pages) in this folder (create `Controllers` and `Views` folders yourself if you prefer the MVC pattern). -* **Permissions**: Define your [permissions](../../framework/fundamentals/authorization.md) in this folder. +* **Permissions**: Define your [permissions](../../framework/fundamentals/authorization/index.md) in this folder. * **Services**: Define your [application services](../../framework/architecture/domain-driven-design/application-services.md) in this folder. ### How to Run? diff --git a/docs/en/studio/custom-commands.md b/docs/en/studio/custom-commands.md new file mode 100644 index 0000000000..af56492f37 --- /dev/null +++ b/docs/en/studio/custom-commands.md @@ -0,0 +1,128 @@ +```json +//[doc-seo] +{ + "Description": "Learn how to create and manage custom commands in ABP Studio to automate build, deployment, and other workflows." +} +``` + +# Custom Commands + +````json +//[doc-nav] +{ + "Next": { + "Name": "Working with ABP Suite", + "Path": "studio/working-with-suite" + } +} +```` + +Custom commands allow you to define reusable terminal commands that appear in context menus throughout ABP Studio. You can use them to automate repetitive tasks such as building Docker images, installing Helm charts, running deployment scripts, or executing any custom workflow. + +> **Note:** This is an advanced feature primarily intended for teams working with Kubernetes deployments or complex build/deployment workflows. If you're developing a standard application without custom DevOps requirements, you may not need this feature. + +## Opening the Management Window + +To manage custom commands, right-click on the solution root in *Solution Explorer* and select *Manage Custom Commands*. + +![Custom Commands Management Window](images/custom-commands/management-window.png) + +The management window displays all defined commands with options to add, edit, or delete them. + +## Creating a New Command + +Click the *Add New Command* button to open the command editor dialog. + +![Create/Edit Custom Command](images/custom-commands/create-edit-command.png) + +## Command Properties + +| Property | Description | +|----------|-------------| +| **Command Name** | A unique identifier for the command (used internally) | +| **Display Name** | The text shown in context menus | +| **Terminal Command** | The PowerShell command to execute. Use `&&&` to chain multiple commands | +| **Working Directory** | Optional. The directory where the command runs (relative to solution path) | +| **Condition** | Optional. A [Scriban](https://github.com/scriban/scriban/blob/master/doc/language.md) expression that determines when the command is visible | +| **Require Confirmation** | When enabled, shows a confirmation dialog before execution | +| **Confirmation Text** | The message shown in the confirmation dialog | + +## Trigger Targets + +Trigger targets determine where your command appears in context menus. You can select multiple targets for a single command. + +| Target | Location | +|--------|----------| +| **Helm Charts Root** | *Kubernetes* panel > *Helm* tab > root node | +| **Helm Main Chart** | *Kubernetes* panel > *Helm* tab > main chart | +| **Helm Sub Chart** | *Kubernetes* panel > *Helm* tab > sub chart | +| **Kubernetes Service** | *Kubernetes* panel > *Kubernetes* tab > service | +| **Solution Runner Root** | *Solution Runner* panel > profile root | +| **Solution Runner Folder** | *Solution Runner* panel > folder | +| **Solution Runner Application** | *Solution Runner* panel > application | + +## Execution Targets + +Execution targets define where the command actually runs. This enables cascading execution: + +- When you trigger a command from a **root or parent item**, it can recursively execute on all matching children +- For example: trigger from *Helm Charts Root* with execution target *Helm Sub Chart* → the command runs on each sub chart + +## Template Variables + +Commands support [Scriban](https://github.com/scriban/scriban/blob/master/doc/language.md) template syntax for dynamic values. Use `{%{{{variable}}}%}` to insert context-specific data. + +### Available Variables by Context + +**Helm Charts:** + +| Variable | Description | +|----------|-------------| +| `profile.name` | Kubernetes profile name | +| `profile.namespace` | Kubernetes namespace | +| `chart.name` | Current chart name | +| `chart.path` | Chart directory path | +| `metadata.*` | Hierarchical metadata values (e.g., `metadata.imageName`) | +| `secrets.*` | Secret values (e.g., `secrets.registryPassword`) | + +**Kubernetes Service:** + +| Variable | Description | +|----------|-------------| +| `name` | Service name | +| `profile.name` | Kubernetes profile name | +| `profile.namespace` | Kubernetes namespace | +| `mainChart.name` | Parent main chart name | +| `chart.name` | Related sub chart name | +| `chart.metadata.*` | Chart-specific metadata | + +**Solution Runner (Root, Folder, Application):** + +| Variable | Description | +|----------|-------------| +| `profile.name` | Run profile name | +| `profile.path` | Profile file path | +| `application.name` | Application name (Application context only) | +| `application.baseUrl` | Application URL (Application context only) | +| `folder.name` | Folder name (Folder/Application context) | +| `metadata.*` | Profile metadata values | +| `secrets.*` | Profile secret values | + +## Example: Build Docker Image + +Here's an example command that builds a Docker image for Helm charts: + +**Command Properties:** +- **Command Name:** `buildDockerImage` +- **Display Name:** `Build Docker Image` +- **Terminal Command:** `./build-image.ps1 -ProjectPath {%{{{metadata.projectPath}}}%} -ImageName {%{{{metadata.imageName}}}%}` +- **Working Directory:** `etc/helm` +- **Trigger Targets:** Helm Charts Root, Helm Main Chart, Helm Sub Chart +- **Execution Targets:** Helm Main Chart, Helm Sub Chart +- **Condition:** `{%{{{metadata.projectPath}}}%}` + +This command: +1. Appears in the context menu of Helm charts root and all chart nodes +2. Executes on main charts and sub charts (cascading from root if triggered there) +3. Only shows for charts that have `projectPath` metadata defined +4. Runs the `build-image.ps1` script with dynamic parameters from metadata diff --git a/docs/en/studio/images/custom-commands/create-edit-command.png b/docs/en/studio/images/custom-commands/create-edit-command.png new file mode 100644 index 0000000000..7091516a8f Binary files /dev/null and b/docs/en/studio/images/custom-commands/create-edit-command.png differ diff --git a/docs/en/studio/images/custom-commands/management-window.png b/docs/en/studio/images/custom-commands/management-window.png new file mode 100644 index 0000000000..3a24ac8dc4 Binary files /dev/null and b/docs/en/studio/images/custom-commands/management-window.png differ diff --git a/docs/en/studio/images/overview/ai-assistant.png b/docs/en/studio/images/overview/ai-assistant.png new file mode 100644 index 0000000000..156c354680 Binary files /dev/null and b/docs/en/studio/images/overview/ai-assistant.png differ diff --git a/docs/en/studio/images/overview/kubernetes-integration-helm.png b/docs/en/studio/images/overview/kubernetes-integration-helm.png index dfd68bd0df..6931739948 100644 Binary files a/docs/en/studio/images/overview/kubernetes-integration-helm.png and b/docs/en/studio/images/overview/kubernetes-integration-helm.png differ diff --git a/docs/en/studio/images/overview/solution-runner.png b/docs/en/studio/images/overview/solution-runner.png index 956a669ea3..bfe88f607c 100644 Binary files a/docs/en/studio/images/overview/solution-runner.png and b/docs/en/studio/images/overview/solution-runner.png differ diff --git a/docs/en/studio/images/solution-explorer/solution-explorer.png b/docs/en/studio/images/solution-explorer/solution-explorer.png index 377cc6a4f3..6b5cc0ad71 100644 Binary files a/docs/en/studio/images/solution-explorer/solution-explorer.png and b/docs/en/studio/images/solution-explorer/solution-explorer.png differ diff --git a/docs/en/studio/images/solution-runner/add-task-window.png b/docs/en/studio/images/solution-runner/add-task-window.png new file mode 100644 index 0000000000..2b96f85118 Binary files /dev/null and b/docs/en/studio/images/solution-runner/add-task-window.png differ diff --git a/docs/en/studio/images/solution-runner/builtin-tasks.png b/docs/en/studio/images/solution-runner/builtin-tasks.png new file mode 100644 index 0000000000..c988687c1c Binary files /dev/null and b/docs/en/studio/images/solution-runner/builtin-tasks.png differ diff --git a/docs/en/studio/images/solution-runner/csharp-application-context-menu-run-connection.png b/docs/en/studio/images/solution-runner/csharp-application-context-menu-run-connection.png index b85a6df117..e2727570eb 100644 Binary files a/docs/en/studio/images/solution-runner/csharp-application-context-menu-run-connection.png and b/docs/en/studio/images/solution-runner/csharp-application-context-menu-run-connection.png differ diff --git a/docs/en/studio/images/solution-runner/csharp-application-context-menu.png b/docs/en/studio/images/solution-runner/csharp-application-context-menu.png index 08b79c0787..3559a17e49 100644 Binary files a/docs/en/studio/images/solution-runner/csharp-application-context-menu.png and b/docs/en/studio/images/solution-runner/csharp-application-context-menu.png differ diff --git a/docs/en/studio/images/solution-runner/folder-context-menu-add.png b/docs/en/studio/images/solution-runner/folder-context-menu-add.png index c83a54f5e0..e50e8010c8 100644 Binary files a/docs/en/studio/images/solution-runner/folder-context-menu-add.png and b/docs/en/studio/images/solution-runner/folder-context-menu-add.png differ diff --git a/docs/en/studio/images/solution-runner/folder-context-menu.png b/docs/en/studio/images/solution-runner/folder-context-menu.png index 47f56995f0..cdb9de734d 100644 Binary files a/docs/en/studio/images/solution-runner/folder-context-menu.png and b/docs/en/studio/images/solution-runner/folder-context-menu.png differ diff --git a/docs/en/studio/images/solution-runner/initial-task-properties-behavior.png b/docs/en/studio/images/solution-runner/initial-task-properties-behavior.png new file mode 100644 index 0000000000..7adb487ffc Binary files /dev/null and b/docs/en/studio/images/solution-runner/initial-task-properties-behavior.png differ diff --git a/docs/en/studio/images/solution-runner/profile-root-context-menu-add.png b/docs/en/studio/images/solution-runner/profile-root-context-menu-add.png index ec26ebcaf0..823bc622a2 100644 Binary files a/docs/en/studio/images/solution-runner/profile-root-context-menu-add.png and b/docs/en/studio/images/solution-runner/profile-root-context-menu-add.png differ diff --git a/docs/en/studio/images/solution-runner/profile-root-context-menu.png b/docs/en/studio/images/solution-runner/profile-root-context-menu.png index 355869511c..8616ffca35 100644 Binary files a/docs/en/studio/images/solution-runner/profile-root-context-menu.png and b/docs/en/studio/images/solution-runner/profile-root-context-menu.png differ diff --git a/docs/en/studio/images/solution-runner/solution-runner-edit.png b/docs/en/studio/images/solution-runner/solution-runner-edit.png index 99d0bce1d5..9449456d95 100644 Binary files a/docs/en/studio/images/solution-runner/solution-runner-edit.png and b/docs/en/studio/images/solution-runner/solution-runner-edit.png differ diff --git a/docs/en/studio/images/solution-runner/solution-runner-properties.png b/docs/en/studio/images/solution-runner/solution-runner-properties.png new file mode 100644 index 0000000000..a6641f892f Binary files /dev/null and b/docs/en/studio/images/solution-runner/solution-runner-properties.png differ diff --git a/docs/en/studio/images/solution-runner/solution-runner.png b/docs/en/studio/images/solution-runner/solution-runner.png index 5a8b123d6d..460d210e0c 100644 Binary files a/docs/en/studio/images/solution-runner/solution-runner.png and b/docs/en/studio/images/solution-runner/solution-runner.png differ diff --git a/docs/en/studio/images/solution-runner/solutioın-runner-properties.png b/docs/en/studio/images/solution-runner/solutioın-runner-properties.png deleted file mode 100644 index 9a6505a7d1..0000000000 Binary files a/docs/en/studio/images/solution-runner/solutioın-runner-properties.png and /dev/null differ diff --git a/docs/en/studio/images/solution-runner/task-context-menu-add.png b/docs/en/studio/images/solution-runner/task-context-menu-add.png new file mode 100644 index 0000000000..6ae43bf1de Binary files /dev/null and b/docs/en/studio/images/solution-runner/task-context-menu-add.png differ diff --git a/docs/en/studio/images/solution-runner/task-context-menu.png b/docs/en/studio/images/solution-runner/task-context-menu.png new file mode 100644 index 0000000000..7f4f41b2f7 Binary files /dev/null and b/docs/en/studio/images/solution-runner/task-context-menu.png differ diff --git a/docs/en/studio/images/solution-runner/task-logs-window.png b/docs/en/studio/images/solution-runner/task-logs-window.png new file mode 100644 index 0000000000..f68b59aa26 Binary files /dev/null and b/docs/en/studio/images/solution-runner/task-logs-window.png differ diff --git a/docs/en/studio/images/solution-runner/task-panel.png b/docs/en/studio/images/solution-runner/task-panel.png new file mode 100644 index 0000000000..c988687c1c Binary files /dev/null and b/docs/en/studio/images/solution-runner/task-panel.png differ diff --git a/docs/en/studio/images/solution-runner/task-properties.png b/docs/en/studio/images/solution-runner/task-properties.png new file mode 100644 index 0000000000..e1246c0c31 Binary files /dev/null and b/docs/en/studio/images/solution-runner/task-properties.png differ diff --git a/docs/en/studio/kubernetes.md b/docs/en/studio/kubernetes.md index 758a7cf55c..eca8d83c5b 100644 --- a/docs/en/studio/kubernetes.md +++ b/docs/en/studio/kubernetes.md @@ -11,8 +11,8 @@ //[doc-nav] { "Next": { - "Name": "Working with ABP Suite", - "Path": "studio/working-with-suite" + "Name": "Custom Commands", + "Path": "studio/custom-commands" } } ```` @@ -210,46 +210,12 @@ When you connect to a Kubernetes cluster, it uses the selected profile for Kuber ## Advanced Topics -### Adding a Custom Command - -Custom commands can be added to both the *Helm* and *Kubernetes* tabs within the *Kubernetes* panel. For instance, when [redeploy](#redeploy-a-chart) a chart, it involves building the Docker image and reinstalling it. However, if you are working with a different Kubernetes cluster than Docker Desktop, you'll need to push the Docker image to the registry before the installation process. This can be achieved by incorporating a custom command into the *Kubernetes services*. Custom commands can be added to the *Chart Root*, *Main Chart*, and *Subchart* in the *Helm* tab, as well as to the *Service* in the *Kubernetes* tab. - -To do that, open the ABP Solution (*.abpsln*) file with *Visual Studio Code* it's a JSON file and you'll see the existing commands in the `commands` section. Before adding a new command, create a powershell script in the `abp-solution-path/etc/helm` folder. For example, we create a `push-image.ps1` script to push the docker image to the registry. Then, add the following command to the `commands` section. - -```JSON - "kubernetesRedeployWithPushImage": { - "triggerTargets": [ - "KUBERNETES_SERVICE" - ], - "executionTargets": [ - "KUBERNETES_SERVICE" - ], - "displayName": " Redeploy with Push Image", - "workingDirectory": "etc/helm", - "terminalCommand": "./build-image.ps1 -ProjectPath {%{{{chart.metadata.projectPath}}}%} -ImageName {%{{{chart.metadata.imageName}}}%} -ProjectType {%{{{chart.metadata.projectType}}}%} &&& ./push-image.ps1 -ImageName {%{{{chart.metadata.imageName}}}%} &&& ./install.ps1 -ChartName {%{{{mainChart.name}}}%} -Namespace {%{{{profile.namespace}}}%} -ReleaseName {%{{{mainChart.name}}}%}-{%{{{profile.name}}}%} -DotnetEnvironment {%{{{mainChart.metadata.dotnetEnvironment}}}%}", - "requireConfirmation": "true", - "confirmationText": "Are you sure to redeploy with push image the related chart '{%{{{chart.name}}}%}' for the service '{%{{{name}}}%}'?", - "condition": "{%{{{chart != null && chart.metadata.projectPath != null && chart.metadata.imageName != null && chart.metadata.projectType != null}}}%}" - } -``` +### Custom Commands + +You can add custom commands to context menus in both the *Helm* and *Kubernetes* tabs. This is useful for automating workflows like pushing Docker images to a registry before installation, or running custom deployment scripts. -Once the command is added, reload the solution from *File* -> *Reload Solution* in the toolbar. After reloading, you will find the *Redeploy with Push Image* command in the context-menu of the service. +Custom commands can be added to the *Chart Root*, *Main Chart*, and *Sub Chart* in the *Helm* tab, as well as to the *Service* in the *Kubernetes* tab. ![redeploy-push-image](./images/kubernetes/redeploy-push-image.png) -The JSON object has the following properties: - -- `triggerTargets`: Specifies the trigger targets for the command. The added command will appear in these targets. You can add one or more trigger targets, accepting values such as *HELM_CHARTS_ROOT*, *HELM_MAIN_CHART*, *HELM_SUB_CHART* and *KUBERNETES_SERVICE*. -- `executionTargets`: Specifies the execution targets for the command. When executing the command on a root item, it will recursively execute the command for all children. Acceptable values include *HELM_CHARTS_ROOT*, *HELM_MAIN_CHART*, *HELM_SUB_CHART*, and *KUBERNETES_SERVICE*. -- `displayName`: Specifies the display name of the command. -- `workingDirectory`: Specifies the working directory of the command. It's relative to the solution path. -- `terminalCommand`: Specifies the terminal command for the custom command. The `&&&` operator can be used to run multiple commands in the terminal. Utilize the [Scriban](https://github.com/scriban/scriban/blob/master/doc/language.md) syntax to access input data, which varies based on the execution target. -- `requireConfirmation`: Specifies whether the command requires confirmation message before execution. Acceptable values include *true* and *false*. -- `confirmationText`: Specifies the confirmation text for the command. Utilize the [Scriban](https://github.com/scriban/scriban/blob/master/doc/language.md) syntax to access input data, which varies based on the execution target. -- `condition`: Specifies the condition for the command. If the condition returns *false*, it skips the current item and attempts to execute the command for the next item or child item. Utilize the [Scriban](https://github.com/scriban/scriban/blob/master/doc/language.md) syntax to access input data, which varies based on the execution target. - -You can use the following variables in the scriban syntax based on the execution target: - - `HELM_CHARTS_ROOT`: *profile*, *metadata*, *secrets* - - `HELM_MAIN_CHART`: *profile*, *chart*, *metadata*, *secret* - - `HELM_SUB_CHART`: *profile*, *chart*, *metadata*, *secret* - - `KUBERNETES_SERVICE`: *name*, *profile*, *mainChart*, *chart*, *metadata*, *secret* +For detailed information on creating and managing custom commands, see the [Custom Commands](custom-commands.md) documentation. diff --git a/docs/en/studio/model-context-protocol.md b/docs/en/studio/model-context-protocol.md new file mode 100644 index 0000000000..7be6557df9 --- /dev/null +++ b/docs/en/studio/model-context-protocol.md @@ -0,0 +1,133 @@ +```json +//[doc-seo] +{ + "Description": "Learn how to connect AI tools like Cursor, Claude Desktop, and VS Code to ABP Studio using the Model Context Protocol (MCP)." +} +``` + +# ABP Studio: Model Context Protocol (MCP) + +````json +//[doc-nav] +{ + "Next": { + "Name": "Working with Kubernetes", + "Path": "studio/kubernetes" + } +} +```` + +ABP Studio includes built-in [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) support so AI tools can query runtime telemetry and control solution runner operations. + +## How It Works + +ABP Studio runs a local MCP server in the background. The `abp mcp-studio` CLI command acts as a stdio bridge that AI clients connect to. The bridge forwards requests to ABP Studio and returns responses. + +```text +MCP Client (Cursor / Claude Desktop / VS Code) + ──stdio──▶ abp mcp-studio ──HTTP──▶ ABP Studio +``` + +> ABP Studio must be running while MCP is used. If ABP Studio is not running (or its MCP endpoint is unavailable), `abp mcp-studio` returns an error to the AI client. + +## Configuration + +### Cursor (`.cursor/mcp.json`) + +```json +{ + "mcpServers": { + "abp-studio": { + "command": "abp", + "args": ["mcp-studio"] + } + } +} +``` + +### Claude Desktop (`claude_desktop_config.json`) + +```json +{ + "mcpServers": { + "abp-studio": { + "command": "abp", + "args": ["mcp-studio"] + } + } +} +``` + +Claude Desktop config file locations: + +- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json` +- Windows: `%APPDATA%\Claude\claude_desktop_config.json` +- Linux: `~/.config/Claude/claude_desktop_config.json` + +### VS Code (`.vscode/mcp.json`) + +```json +{ + "servers": { + "abp-studio": { + "command": "abp", + "args": ["mcp-studio"] + } + } +} +``` + +### Quick Reference + +You can run `abp help mcp-studio` at any time to see the available options and example configuration snippets for each supported IDE directly in your terminal. + +### Generating Config Files from ABP Studio + +When creating a new solution, ABP Studio can generate MCP configuration files for Cursor and VS Code automatically. + +## Available Tools + +ABP Studio exposes the following tools to MCP clients. All tools operate on the currently open solution and selected run profile in ABP Studio. + +### Monitoring + +| Tool | Description | +|------|-------------| +| `list_applications` | Lists all running ABP applications connected to ABP Studio. | +| `get_exceptions` | Gets recent exceptions including stack traces and error messages. | +| `get_logs` | Gets log entries. Can be filtered by log level. | +| `get_requests` | Gets HTTP request information. Can be filtered by status code. | +| `get_events` | Gets distributed events for debugging inter-service communication. | +| `clear_monitor` | Clears collected monitor data. | + +### Application Control + +| Tool | Description | +|------|-------------| +| `list_runnable_applications` | Lists all applications in the current run profile with their state. | +| `start_application` | Starts a stopped application. | +| `stop_application` | Stops a running application. | +| `restart_application` | Restarts a running application. | +| `build_application` | Builds a .NET application using `dotnet build`. | + +### Container Control + +| Tool | Description | +|------|-------------| +| `list_containers` | Lists Docker containers in the current run profile with their state. | +| `start_containers` | Starts Docker containers (docker-compose up). | +| `stop_containers` | Stops Docker containers (docker-compose down). | + +### Solution Structure + +| Tool | Description | +|------|-------------| +| `get_solution_info` | Gets solution name, path, template, and run profile information. | +| `list_modules` | Lists all modules in the solution. | +| `list_packages` | Lists packages (projects) in the solution. Can be filtered by module. | +| `get_module_dependencies` | Gets module dependency/import information. | + +## Notes + +- Monitor data (exceptions, logs, requests, events) is kept in memory and is cleared when the solution is closed. +- The `abp mcp-studio` command connects to the local ABP Studio instance. This is separate from the `abp mcp` command, which connects to the ABP.IO cloud MCP service and requires an active license. diff --git a/docs/en/studio/monitoring-applications.md b/docs/en/studio/monitoring-applications.md index 083a0d384f..e06d387146 100644 --- a/docs/en/studio/monitoring-applications.md +++ b/docs/en/studio/monitoring-applications.md @@ -11,8 +11,8 @@ //[doc-nav] { "Next": { - "Name": "Working with Kubernetes", - "Path": "studio/kubernetes" + "Name": "Model Context Protocol (MCP)", + "Path": "studio/model-context-protocol" } } ```` @@ -27,7 +27,7 @@ If you want to open any of these tabs in separate window, just drag it from the ## Collecting Telemetry Information -There are two application [types](./running-applications.md#abp-studio-running-applications): C# and CLI. Only C# applications can establish a connection with ABP Studio and transmit telemetry information via the `Volo.Abp.Studio.Client.AspNetCore` package. However, we can view the *Logs* and *Browse* (if there is a *Launch URL*) for both CLI and C# application types. Upon starting C# applications, they attempt to establish a connection with ABP Studio. When connection successful, you should see a chain icon next to the application name in [Solution Runner](./running-applications.md#run-1). Applications can connect the ABP Studio with *Solution Runner* -> *C# Application* -> *Run* -> *Start* or from an outside environment such as debugging with Visual Studio. Additionally, they can establish a connection from a Kubernetes Cluster through the ABP Studio [Kubernetes Integration: Connecting to the Cluster](../get-started/microservice.md#kubernetes-integration-connecting-to-the-cluster). +There are two application [types](./running-applications.md#applications): C# and CLI. Only C# applications can establish a connection with ABP Studio and transmit telemetry information via the `Volo.Abp.Studio.Client.AspNetCore` package. However, we can view the *Logs* and *Browse* (if there is a *Launch URL*) for both CLI and C# application types. Upon starting C# applications, they attempt to establish a connection with ABP Studio. When connection successful, you should see a chain icon next to the application name in [Solution Runner](./running-applications.md#start--stop--restart). Applications can connect the ABP Studio with *Solution Runner* -> *C# Application* -> *Run* -> *Start* or from an outside environment such as debugging with Visual Studio. Additionally, they can establish a connection from a Kubernetes Cluster through the ABP Studio [Kubernetes Integration: Connecting to the Cluster](../get-started/microservice.md#kubernetes-integration-connecting-to-the-cluster). You can [configure](../framework/fundamentals/options.md) the `AbpStudioClientOptions` to disable send telemetry information. The package automatically gets the [configuration](../framework/fundamentals/configuration.md) from the `IConfiguration`. So, you can set your configuration inside the `appsettings.json`: diff --git a/docs/en/studio/overview.md b/docs/en/studio/overview.md index 3f5835c998..f875e9ebf1 100644 --- a/docs/en/studio/overview.md +++ b/docs/en/studio/overview.md @@ -1,7 +1,7 @@ ```json //[doc-seo] { - "Description": "Explore ABP Studio's key features like Solution Explorer and Kubernetes Integration to optimize your ABP application development and management." + "Description": "Explore ABP Studio's key features like Solution Explorer, Kubernetes Integration, and AI Assistant to optimize your ABP application development and management." } ``` @@ -19,7 +19,7 @@ ## Introduction -ABP Studio, a comprehensive desktop application, offers a wide range of features and functionalities tailored to streamline the development and management of ABP-based applications. This article provides an overview of the key components of ABP Studio, including the Solution Explorer, Solution Runner, Kubernetes Integration, Application Monitoring Area, Background Tasks, Notifications and Logs. Understanding these components is essential for efficiently utilizing ABP Studio to its full potential. +ABP Studio, a comprehensive desktop application, offers a wide range of features and functionalities tailored to streamline the development and management of ABP-based applications. This article provides an overview of the key components of ABP Studio, including the Solution Explorer, Solution Runner, Kubernetes Integration, AI Assistant, Application Monitoring Area, Background Tasks, Notifications and Logs. Understanding these components is essential for efficiently utilizing ABP Studio to its full potential. ![overview-intro](./images/overview/overview-intro.png) @@ -69,7 +69,7 @@ The Welcome Screen is the initial user interface users encounter upon starting A ## Sidebar -Located on the left side of the interface, the Left Area is a panel that provides quick access to various functionalities like [Solution Explorer](./solution-explorer.md), [Solution Runner](./running-applications.md), and Kubernetes Integration. Now let's examine each item. +Located on the left side of the interface, the Left Area is a panel that provides quick access to various functionalities like [Solution Explorer](./solution-explorer.md), [Solution Runner](./running-applications.md), Kubernetes Integration, and AI Assistant. Now let's examine each item. ### Solution Explorer @@ -91,13 +91,30 @@ Kubernetes integration in ABP Studio enables users to deploy solutions directly This pane is dedicated to managing [Helm](https://helm.sh/) charts, which are packages used in Kubernetes deployments. It simplifies the process of building images and installing charts. -![kubernetes-integration-helm-pane](./images/overview/kubernetes-integration-helm.png) +![kubernetes-integration-helm-panel](./images/overview/kubernetes-integration-helm.png) #### Kubernetes This pane is dedicated to managing Kubernetes services. It simplifies the process of redeploying and intercepting application service. -![kubernetes-integration-kubernetes-pane](./images/overview/kubernetes-integration-kubernetes.png) +![kubernetes-integration-kubernetes-panel](./images/overview/kubernetes-integration-kubernetes.png) + +### AI Assistant + +The AI Assistant is an integrated chat interface within ABP Studio that provides intelligent assistance for ABP-related questions. You can access it from the left sidebar by clicking the AI icon. + +For external AI tool integrations through MCP, see the [Model Context Protocol (MCP)](./model-context-protocol.md) documentation. + +![ai-assistant](./images/overview/ai-assistant.png) + +Key features of the AI Assistant include: + +- **Chat Interface**: Ask anything about ABP Framework, and get instant, context-aware responses to help with your development workflow. +- **File Attachments**: Attach files to your conversations to get more specific assistance with your code or configuration. +- **Recent Chats**: Access your conversation history to continue previous discussions or reference past solutions. +- **Credits System**: The AI Assistant uses a credits-based system, with usage tracked and displayed in the interface. + +> **Note**: Review the Privacy Notice available in the AI Assistant panel to understand how your data is handled. ## Application Monitoring Area diff --git a/docs/en/studio/running-applications.md b/docs/en/studio/running-applications.md index adec07ad66..a46e137db4 100644 --- a/docs/en/studio/running-applications.md +++ b/docs/en/studio/running-applications.md @@ -1,11 +1,11 @@ ```json //[doc-seo] { - "Description": "Learn how to use the ABP Studio's Solution Runner to efficiently run applications and organize projects with customizable profiles." + "Description": "Learn how to use the ABP Studio's Solution Runner to run applications, manage tasks, and organize projects with customizable profiles." } ``` -# ABP Studio: Running Applications +# ABP Studio: Solution Runner ````json //[doc-nav] @@ -17,19 +17,16 @@ } ```` -Use the *Solution Runner* to easily run your application(s) and set up infrastructure. You can create different profiles to organize projects based on your needs and teams. Simply navigate to the *Solution Runner* panel in the left menu. +Use the *Solution Runner* to easily run your application(s), execute tasks, and set up infrastructure. You can create different profiles to organize projects based on your needs and teams. Simply navigate to the *Solution Runner* panel in the left menu. ![solution-runner](images/solution-runner/solution-runner.png) -> The project structure might be different based on your selection. For example MVC microservice project, looks like the following. You can edit the tree structure as you wish. +The Solution Runner contains two tabs: -The solution runner contains 4 different types to define tree structure. +- **Applications**: For managing and running your applications. +- **Tasks**: For managing tasks that can be executed on demand or automatically when the solution is opened. -- **Profile**: We can create different profiles to manage the tree as our needs. For example we can create 2 different profile for `team-1` and `team-2`. `team-1` want to see the only *Administration* and *Identity* service, `team-2` see the *Saas* and *AuditLogging* services. With that way each team see the only services they need to run. In this example `Default` profile *Acme.BookStore (Default)* comes out of the box when we create the project. -- **Folder**: We can organize the applications with *Folder* type. In this example, we keep services in `services` folder for our microservice projects. We can also use nested folder if we want `apps`, `gateways`` and `services` is the folders in current(`Default`) profile. -- **C# Application**: We can add any C# application from our [Solution Explorer](./solution-explorer.md). If the application is not in our solution, we can add it externally by providing the *.csproj* file path. The .NET icon indicates that the application is a C# project. For example, `Acme.BookStore.AuthServer`, `Acme.BookStore.Web`, `Acme.BookStore.WebGateway`, etc., are C# applications. -- **CLI Application**: We can add [powershell](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core) commands to prepare some environments or run other application types than C# such as angular. -- **Docker Container**: We can add Docker container files to control them on UI, start/stop containers individually. +> The project structure might be different based on your selection. For example MVC microservice project, looks like the following. You can edit the tree structure as you wish. ## Profile @@ -47,13 +44,23 @@ When you click *Add New Profile*, it opens the *Create New Profile* window. You > When a profile is edited or deleted while running some applications, those applications will be stopped. However, applications running under a different profile will continue to run unaffected. Lastly, if we add a new profile, all applications running under existing profiles will be stopped. -## Using the Profile +## Applications + +The **Applications tab** allows you to manage and run your applications. The solution runner contains 4 different types to define tree structure: + +- **Profile**: We can create different profiles to manage the tree as our needs. For example we can create 2 different profile for `team-1` and `team-2`. `team-1` want to see the only *Administration* and *Identity* service, `team-2` see the *Saas* and *AuditLogging* services. With that way each team see the only services they need to run. In this example `Default` profile *Acme.BookStore (Default)* comes out of the box when we create the project. +- **Folder**: We can organize the applications with *Folder* type. In this example, we keep services in `services` folder for our microservice projects. We can also use nested folder if we want `apps`, `gateways` and `services` are the folders in current(`Default`) profile. +- **C# Application**: We can add any C# application from our [Solution Explorer](./solution-explorer.md). If the application is not in our solution, we can add it externally by providing the *.csproj* file path. The .NET icon indicates that the application is a C# project. For example, `Acme.BookStore.AuthServer`, `Acme.BookStore.Web`, `Acme.BookStore.WebGateway`, etc., are C# applications. +- **CLI Application**: We can add [powershell](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core) commands to prepare some environments or run other application types than C# such as angular. +- **Docker Container**: We can add Docker container files to control them on UI, start/stop containers individually. + +### Using the Profile After selecting the current profile, which is the *Default* profile that comes pre-configured, we can utilize the tree items. This allows us to execute collective commands and create various tree structures based on our specific needs. You can navigate through the root of the tree and right-click to view the context menu, which includes the following options: `Start All`, `Stop All`, `Build`, `Add`, and `Manage Start Actions`. ![profile-root-context-menu](images/solution-runner/profile-root-context-menu.png) -### Start/Stop All +#### Start/Stop All We can start/stop the applications with these options. Go to the root of the tree and right-click to view the context menu: @@ -62,7 +69,7 @@ We can start/stop the applications with these options. Go to the root of the tre > You can change the current profile while applications are running in the previous profile. The applications continue to run under the previous profile. For example, if we start the `Acme.BookStore.AdministrationService`, `Acme.BookStore.IdentityService` applications when the current profile is *team-1* and after changing the current profile to *team-2* the applications continue to run under *team-1*. -### Build +#### Build We can use common [dotnet](https://learn.microsoft.com/en-us/dotnet/core/tools) commands in this option. Go to the root of the tree and right-click to view the context menu, in this example *Acme.Bookstore(Default)* -> *Build*, there are 4 options available: @@ -75,7 +82,7 @@ We can use common [dotnet](https://learn.microsoft.com/en-us/dotnet/core/tools) > Since *Solution Runner* may contain numerous C# projects, the *Build* options uses the [Background Tasks](./overview#background-tasks), ensuring a seamless experience while using ABP Studio. -### Add +#### Add We can add 4 different item types to *Profile* for defining the tree structure. Those options are `C# Application`, `CLI Application`, `Docker Container`, and `Folder`. @@ -83,7 +90,7 @@ We can add 4 different item types to *Profile* for defining the tree structure. ![profile-root-context-menu-add](images/solution-runner/profile-root-context-menu-add.png) -#### C# Application +##### C# Application When we go to the root of the tree and right-click, in this example *Acme.BookStore(Default)* -> *Add* -> *C# Application* it opens the *Add Application* window. There are two methods to add applications: *This solution* and *External*. To add via the *This solution* tab, follow these steps: @@ -100,7 +107,6 @@ The C# project doesn't have to be within the current [Solution Explorer](./solut ![profile-root-add-external-csharp-application](images/solution-runner/profile-root-add-external-csharp-application.png) - - `Path`: Provide the path to the .csproj file you wish to add. The path will be [normalized](https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats#path-normalization), allowing the project location to be flexible, as long as it's accessible from the current [ABP Solution](./concepts.md#solution). - `Name`: Give an arbitrary name to see in solution runner. This name should be unique for each profile. - `Launch url`: This is the url when we want to browse. But if the added project doesn't have launch url we can leave it empty. @@ -108,7 +114,7 @@ The C# project doesn't have to be within the current [Solution Explorer](./solut You can click the `OK` button to add the C# application to the profile. -#### CLI Application +##### CLI Application We can add any [powershell](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core) file to execute from the solution runner. With this flexibility we can prepare our infrastructure environment such as `Docker-Dependencies` or run different application types like `Angular`. You can add CLI applications with root of the tree and right-click, in this example *Acme.BookStore(Default)* -> *Add* -> *CLI Application*. @@ -124,7 +130,7 @@ We can add any [powershell](https://learn.microsoft.com/en-us/powershell/module/ You can click the `OK` button to add the CLI application to the profile. -#### Folder +##### Folder When adding applications directly to the root of the tree, it can become disorganized, especially with numerous projects. Utilizing a folder structure allows us to organize applications more efficiently. This method enables executing collective commands within a specified folder. When we go to root of the tree and right-click, in this example *Acme.BookStore(Default)* -> *Add* -> *Folder* it opens *New folder* window. @@ -134,7 +140,7 @@ When adding applications directly to the root of the tree, it can become disorga You can click the `OK` button to add the folder to the profile. -### Miscellaneous +#### Miscellaneous - You can drag and drop folder and application into folder for organization purposes. Click and hold an item, then drag it into the desired folder. - We can start all applications by clicking the *Play* icon on the left side, similar way we can stop all applications by clicking the *Stop* icon on the left side. @@ -142,7 +148,7 @@ You can click the `OK` button to add the folder to the profile. - To remove a folder from the tree, open the context menu by right-clicking the folder and selecting *Delete*. - When starting applications, they continue to restart until the application starts gracefully. To stop the restarting process when attempting to restart the application, click the icon on the left. Additionally, you can review the *Logs* to understand why the application isn't starting gracefully. -### Manage Start Actions +#### Manage Start Actions This command will open a dialog where you can set start actions and start orders of sub-applications and sub-folders. @@ -154,40 +160,40 @@ You can order the applications by dragging the icon in the first column. In the - **Build**: This option allows to disable/enable build before starting the application. If you are working on a single application, you can exclude the other applications from build to save time. This option can also be set by performing `right click > properties` on applications. - **Watch**: When enabled, changes in your code are watched and dotnet hot-reloads the application or restarts it if needed. This option also can be set by performing `right click > properties` on applications. -## Folder +### Folder Context Menu -We already now why we need folder in the [previous](./running-applications.md#folder) section, we can use collective commands within this folder items. To do that go to folder and open the context menu by right-clicking, which includes 5 options `Start`, `Stop`, `Build`, `Add`, `Manage Start Actions`, `Rename` and `Delete`. +We already now why we need folder in the [previous](#folder) section, we can use collective commands within this folder items. To do that go to folder and open the context menu by right-clicking, which includes 5 options `Start`, `Stop`, `Build`, `Add`, `Manage Start Actions`, `Rename` and `Delete`. ![folder-context-menu](images/solution-runner/folder-context-menu.png) -### Start/Stop +#### Start/Stop You can see the context menu by right-clicking *Folder*. It will start/stop all the applications under the folder. -### Build +#### Build *Folder* -> *Build* context menu, it's the [similar](#build) options like *Acme.BookStore(Default)* -> *Builds* options there are 4 options available. The only difference between them it's gonna be execute in selected folder. ![folder-context-menu-build](images/solution-runner/folder-context-menu-build.png) -### Add +#### Add *Folder* -> *Add* context menu, it's the [same](#add) options like *Acme.BookStore(Default)* -> *Add* there are 3 options avaiable. The only difference, it's gonna add item to the selected folder. ![folder-context-menu-add](images/solution-runner/folder-context-menu-add.png) -### Miscellaneous +#### Miscellaneous - You can rename a folder with *Folder* -> *Rename*. - You can delete a folder with *Folder* -> *Delete*. -## C# Application +### C# Application The .NET icon indicates that the application is a C# project. After we [add](#c-application) the C# applications to the root of the tree or folder, we can go to any C# application and right-click to view the context menu; `Start`, `Stop`, `Restart`, `Build`, `Browse`, `Health Status`, `Requests`, `Exceptions`, `Logs`, `Copy URL`, `Properties`, `Remove`, and `Open with`. ![csharp-application-context-menu](images/solution-runner/csharp-application-context-menu.png) -### Start / Stop / Restart +#### Start / Stop / Restart - **Start**: Starts the selected application. - **Stop**: Stops the running application. @@ -195,13 +201,13 @@ The .NET icon indicates that the application is a C# project. After we [add](#c- > When you start the C# application, you should see a *chain* icon next to the application name, that means the started application connected to ABP Studio. C# applications can connect to ABP Studio even when running from outside the ABP Studio environment, for example debugging with Visual Studio. If the application is run from outside the ABP Studio environment, it will display *(external)* information next to the chain icon. -### Build +#### Build It's the [similar](#build) options like root of the tree options. The only difference between them it's gonna be execute the selected application. ![csharp-application-context-menu-build](images/solution-runner/csharp-application-context-menu-build.png) -### Monitoring +#### Monitoring When the C# application is connected to ABP Studio, it starts sending telemetry information to see in one place. We can easily click these options to see the detail; `Browse`, `Health Status`, `Requests`, `Exceptions`, `Events` and `Logs`. @@ -216,11 +222,11 @@ When the C# application is connected to ABP Studio, it starts sending telemetry - `Events`: Opens the *Events* tab filtered by this application. You can view all [Distributed Events](../framework/infrastructure/event-bus/distributed) sent or received by this application. - `Logs`: Clicking this option opens the *Logs* tab with adding the selected application filter. -### Properties +#### Properties We can open the *Application Properties* window to change *Launch url*, *Health check endpoints*, *Kubernetes service* and *run* information. To access the *Application Properties* window, navigate to a C# application, right-click to view the context menu, and select the Properties option. -![solutioın-runner-properties](images/solution-runner/solutioın-runner-properties.png) +![solution-runner-properties](images/solution-runner/solution-runner-properties.png) - **Launch URL**: The URL used when browsing the application. This is the address where the application is accessible. - **Kubernetes service**: A regex pattern to match Kubernetes service names. When connected to a Kubernetes cluster, ABP Studio uses this pattern to find the corresponding Kubernetes service and uses its URL instead of the Launch URL. This applies to *Browse*, *Copy URL*, and *Health UI* features. For example, if your Helm chart creates a service named `bookstore-identity-service`, you can use `.*-identity-service` or `bookstore-identity.*` as the pattern. For [microservice](../get-started/microservice.md) templates, this is pre-configured. @@ -234,7 +240,7 @@ We can open the *Application Properties* window to change *Launch url*, *Health ![csharp-application-context-menu-run-connection](images/solution-runner/csharp-application-context-menu-run-connection.png) -### Open with +#### Open with The *Open with* submenu provides options to open the application project in external tools: @@ -244,13 +250,17 @@ The *Open with* submenu provides options to open the application project in exte - **Terminal**: Opens a terminal window in the project directory. - **Explorer / Finder**: Opens the project folder in the system file explorer. +### Custom Commands + +You can add custom commands that appear in the context menu of Solution Runner items (root, folders, and applications). These commands allow you to automate custom workflows and scripts. For details on creating and managing custom commands, see the [Custom Commands](custom-commands.md) documentation. + ### Miscellaneous - We can copy the selected application *Browse* URL with *Copy URL*. It copies the *Browse* URL instead of *Launch URL* since we could be connected to a *Kubernetes* service. - You can change the target framework by right-click the selected application and change the *Target Framework* option. This option visible if the project has multiple target framework such as MAUI applications. - To remove an application from the tree, open the context menu by right-clicking the application and selecting *Remove*. -## CLI Application +### CLI Application CLI applications uses the [powershell](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core) commands. With this way we can start and stop anything we want. After we add the CLI applications to root of the tree or folder, we can go to any CLI application and right-click to view the context menu. @@ -264,7 +274,7 @@ CLI applications uses the [powershell](https://learn.microsoft.com/en-us/powersh > When CLI applications start chain icon won't be visible, because only C# applications can connect the ABP Studio. -## Docker Containers +### Docker Containers Each Docker container represents a `.yml` file. Each file can be run on UI individually. A file may contain one or more services. To start/stop each service individually, we recommend to keep services in separate files. @@ -316,9 +326,7 @@ If the `yml` file contains multiple services, they will be represented as a sing > > ![docker-container-warning](images/solution-runner/docker-container-warning.png) - - -### Properties +#### Properties ![docker-container-properties](images/solution-runner/docker-container-properties.png) @@ -326,10 +334,160 @@ In properties dialog, you can set the name of docker compose stack name of the c ![docker-container-stack](images/solution-runner/docker-container-stack.png) -## Docker Compose +### Docker Compose You can manually run applications using [Docker Compose](https://docs.docker.com/compose/). This allows for easy setup and management of multi-container Docker applications. To get started, ensure you have Docker and Docker Compose installed on your machine. Refer to the [Deployment with Docker Compose](../solution-templates/layered-web-application/deployment/deployment-docker-compose.md) documentation for detailed instructions on how to configure and run your applications using `docker-compose`. -> Note: The **Docker Compose** is not available in the ABP Studio interface. \ No newline at end of file +> Note: The **Docker Compose** is not available in the ABP Studio interface. + +## Tasks + +The **Tasks tab** in the Solution Runner allows you to define and execute tasks for your solution. You can run initialization tasks after solution creation, create reusable tasks that can be executed on demand, and optionally configure tasks to run automatically when a solution is opened. Navigate to the *Solution Runner* panel in the left menu and select the *Tasks* tab. + +![task-panel](images/solution-runner/task-panel.png) + +> The task structure might vary based on your solution template. ABP Studio solution templates come with pre-configured tasks like *Initialize Solution*. + +### Tasks Panel Overview + +The Tasks panel has a tree structure similar to the Applications panel: + +- **Root**: The root item displays your solution name, similar to the Solution Explorer. +- **Tasks**: Individual tasks that can be started, stopped, and configured. + +Tasks are associated with the current *Profile*, just like applications. When you switch profiles, the task configuration may differ based on what's defined in each profile. + +### Built-in Tasks + +When you create a new solution using ABP Studio templates, the following tasks are automatically configured in the *Default* profile: + +![builtin-tasks](images/solution-runner/builtin-tasks.png) + +#### Initialize Solution + +The *Initialize Solution* task performs the initial setup required after creating a new solution or cloning an existing one from source control. This task is configured with the *Run on solution initialization (1 time per computer)* behaviour, meaning it runs automatically only once per computer when the solution is initialized. + +![task-behavior](images/solution-runner/initial-task-properties-behavior.png) + +The initialization typically includes: + +- Installing NPM packages (`abp install-libs`) +- Creating development certificates (for OpenIddict) +- and more... (depends on solution type) + +> This task is designed to be idempotent, meaning it can be run multiple times without causing issues. + +#### Migrate Database + +The *Migrate Database* task runs the database migration for your solution. This is useful when you need to apply new migrations after pulling changes from source control or when you've added new migrations yourself. + +> Unlike the *Initialize Solution* task, the *Migrate Database* task is not configured to run automatically on solution open by default. + +### Adding a Task + +To add a new task, right-click on the root item (solution name) in the Tasks panel and select *AddTask* item. + +![task-context-menu-add](images/solution-runner/task-context-menu-add.png) + +This opens the *Add Task* window where you can configure the task: + +![add-task-window](images/solution-runner/add-task-window.png) + +- **Name**: Provide a unique name for the task. This name will be displayed in the Tasks panel tree. +- **Working Directory**: Specify the directory where the task will be executed. You can use the folder picker to browse and select the directory. The path will be [normalized](https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats#path-normalization), allowing flexibility in the folder location. +- **Start Command**: Provide the script or command to execute when the task starts. Use the local path prefix `./` if the script is in the working directory (e.g., `./scripts/my-task.ps1`). You can also pass arguments like `./my-script.ps1 -param value`. +- **Task Behaviour**: Select how the task should run: *Manual*, *Run on solution open*, or *Run on solution initialization (1 per computer)*. +- **Short Description**: Short description for the task. + +Click *OK* to add the task to the profile. + +### Managing Tasks + +Once tasks are added to the panel, you can manage them using the context menu. Right-click on a task to see the available options: + +![task-context-menu](images/solution-runner/task-context-menu.png) + +#### Start / Stop + +- **Start**: Executes the task's start command. The task status will change to indicate it's running. +- **Stop**: Stops a running task. If a stop command is configured, it will be executed; otherwise, the process will be terminated. + +> Unlike applications, tasks do not automatically restart if they fail or stop. A task can complete its execution and stop itself (like running a database migration), or it can continue running until manually stopped. + +#### Logs + +Click *Logs* to view the task's output in a dedicated window. This shows the console output from the task's execution, which is helpful for debugging or monitoring progress. + +![task-logs-window](images/solution-runner/task-logs-window.png) + +#### Properties + +Click *Properties* to open the task configuration window where you can modify the task settings: + +![task-properties](images/solution-runner/task-properties.png) + +- **Name**: The display name of the task. +- **Working Directory**: The execution directory for the task. +- **Start Command**: The command to run when starting the task. +- **Task Behaviour**: Select how the task should run: *Manual*, *Run on solution open*, or *Run on solution initialization (1 per computer)*. +- **Short Description**: Short description for the task. + +#### Remove + +Select *Remove* to delete the task from the profile. This action only removes the task configuration; it does not delete any script files. + +### Run On Solution Open + +Tasks configured with *Run on solution open* behaviour are automatically executed every time you open the solution in ABP Studio. This is useful for: + +- **Environment checks**: Verifying that required services or dependencies are available. +- **Recurring setup**: Tasks that need to run on each session, such as starting background services or refreshing configurations. + +When the solution is opened: + +1. ABP Studio loads the solution and profiles +2. Tasks marked with *Run on solution open* are queued for execution +3. Tasks execute in the background, and you can monitor their progress in the [Background Tasks](./overview.md#background-tasks) panel + +> Tasks configured with this behaviour should be idempotent, meaning running them multiple times should not cause errors or duplicate operations. + +### Run On Solution Initialization (1 Per Computer) + +Tasks configured with *Run on solution initialization (1 per computer)* behaviour are executed only once per computer when the solution is first opened. After the initial execution, the task will not run automatically on subsequent solution opens. This is ideal for: + +- **One-time setup**: Tasks like *Initialize Solution* that install dependencies, run database migrations, or create development certificates. +- **First-time configuration**: Setting up environment-specific configurations that only need to happen once. + +This behaviour is particularly useful for: + +1. **New team members**: When a developer clones the repository and opens the solution for the first time, all initialization tasks run automatically. +2. **Fresh clones**: Ensures the solution is properly configured without requiring manual intervention. +3. **Avoiding redundant operations**: Prevents running time-consuming setup tasks on every solution open. + +> The *Initialize Solution* task that comes with ABP Studio templates uses this behaviour by default. It checks if NPM packages are already installed before running `abp install-libs` and performs other initialization steps only when necessary. + +### Task Configuration in Profiles + +Tasks are stored in the run profile JSON files (`*.abprun.json`). The task configuration looks like this: + +```json +{ + "tasks": { + "Initialize Solution": { + "behaviour": 2, + "startCommand": "./initialize-solution.ps1", + "workingDirectory": "../../scripts", + "shortDescription": "Installs required UI libraries and creates required certificates." + } + } +} +``` + +You can manually edit these files if needed, but it's recommended to use the ABP Studio UI for managing tasks to ensure proper formatting and validation. + +## See Also + +- [Solution Explorer](./solution-explorer.md) +- [Monitoring Applications](./monitoring-applications.md) diff --git a/docs/en/studio/solution-explorer.md b/docs/en/studio/solution-explorer.md index edbac3b471..05a7f69403 100644 --- a/docs/en/studio/solution-explorer.md +++ b/docs/en/studio/solution-explorer.md @@ -11,7 +11,7 @@ //[doc-nav] { "Next": { - "Name": "Running Applications", + "Name": "Solution Runner", "Path": "studio/running-applications" } } diff --git a/docs/en/studio/version-mapping.md b/docs/en/studio/version-mapping.md index f399c97390..d3fe945967 100644 --- a/docs/en/studio/version-mapping.md +++ b/docs/en/studio/version-mapping.md @@ -11,7 +11,8 @@ This document provides a general overview of the relationship between various ve | **ABP Studio Version** | **ABP Version of Startup Template** | |------------------------|---------------------------| -| 2.1.0 - 2.1.3 | 10.0.1 | +| 2.1.5 - 2.1.9 | 10.0.2 | +| 2.1.0 - 2.1.4 | 10.0.1 | | 2.0.0 to 2.0.2 | 10.0.0 | | 1.4.2 | 9.3.6 | | 1.3.3 to 1.4.1 | 9.3.5 | diff --git a/docs/en/tutorials/book-store/part-05.md b/docs/en/tutorials/book-store/part-05.md index 3db00ea423..7449b4b65d 100644 --- a/docs/en/tutorials/book-store/part-05.md +++ b/docs/en/tutorials/book-store/part-05.md @@ -30,7 +30,7 @@ ## Permissions -ABP provides an [authorization system](../../framework/fundamentals/authorization.md) based on the ASP.NET Core's [authorization infrastructure](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/introduction). One major feature added on top of the standard authorization infrastructure is the **permission system** which allows to define permissions and enable/disable per role, user or client. +ABP provides an [authorization system](../../framework/fundamentals/authorization/index.md) based on the ASP.NET Core's [authorization infrastructure](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/introduction). One major feature added on top of the standard authorization infrastructure is the **permission system** which allows to define permissions and enable/disable per role, user or client. ### Permission Names diff --git a/docs/en/tutorials/book-store/part-08.md b/docs/en/tutorials/book-store/part-08.md index 68796b99eb..02a0182fe5 100644 --- a/docs/en/tutorials/book-store/part-08.md +++ b/docs/en/tutorials/book-store/part-08.md @@ -183,7 +183,7 @@ public class AuthorAppService : BookStoreAppService, IAuthorAppService } ```` -* `[Authorize(BookStorePermissions.Authors.Default)]` is a declarative way to check a permission (policy) to authorize the current user. See the [authorization document](../../framework/fundamentals/authorization.md) for more. `BookStorePermissions` class will be updated below, don't worry for the compile error for now. +* `[Authorize(BookStorePermissions.Authors.Default)]` is a declarative way to check a permission (policy) to authorize the current user. See the [authorization document](../../framework/fundamentals/authorization/index.md) for more. `BookStorePermissions` class will be updated below, don't worry for the compile error for now. * Derived from the `BookStoreAppService`, which is a simple base class comes with the startup template. It is derived from the standard `ApplicationService` class. * Implemented the `IAuthorAppService` which was defined above. * Injected the `IAuthorRepository` and `AuthorManager` to use in the service methods. diff --git a/docs/en/tutorials/microservice/part-07.md b/docs/en/tutorials/microservice/part-07.md index 5dc638dd04..a12b000415 100644 --- a/docs/en/tutorials/microservice/part-07.md +++ b/docs/en/tutorials/microservice/part-07.md @@ -216,7 +216,7 @@ Implementing `ITransientDependency` registers the `OrderEventHandler` class to t ### Testing the Order Creation -To keep this tutorial simple, we will not implement a user interface for creating orders. Instead, we will use the Swagger UI to create an order. Open the *Solution Runner* panel in ABP Studio and use the *Start* action to launch the `CloudCrm.OrderingService` and `CloudCrm.CatalogService` applications. Then, use the *Start All* action to start the remaining applications listed in the [Solution Runner root item](../../studio/running-applications.md#run). +To keep this tutorial simple, we will not implement a user interface for creating orders. Instead, we will use the Swagger UI to create an order. Open the *Solution Runner* panel in ABP Studio and use the *Start* action to launch the `CloudCrm.OrderingService` and `CloudCrm.CatalogService` applications. Then, use the *Start All* action to start the remaining applications listed in the [Solution Runner root item](../../studio/running-applications.md#startall). Once the application is running and ready, [Browse](../../studio/running-applications.md#c-application) the `CloudCrm.OrderingService` application. Use the `POST /api/ordering/order` endpoint to create a new order: diff --git a/docs/en/ui-themes/lepton-x-lite/angular.md b/docs/en/ui-themes/lepton-x-lite/angular.md index 1ab5212462..9e18bf994b 100644 --- a/docs/en/ui-themes/lepton-x-lite/angular.md +++ b/docs/en/ui-themes/lepton-x-lite/angular.md @@ -1,7 +1,7 @@ ```json //[doc-seo] { - "Description": "Discover how to install and use the LeptonX Lite Angular UI theme for ABP Framework, enhancing your project's professional look effortlessly." + "Description": "Discover how to install and use the LeptonX Lite Angular UI theme for ABP Framework, enhancing your project's professional look effortlessly." } ``` @@ -69,12 +69,12 @@ export const appConfig: ApplicationConfig = { To change the logos and brand color of `LeptonX`, you have two options: -1) Provide logo and application name via the Theme Shared provider (recommended) +1. Provide logo and application name via the Theme Shared provider (recommended) ```ts // app.config.ts -import { provideLogo, withEnvironmentOptions } from '@abp/ng.theme.shared'; -import { environment } from './environments/environment'; +import { provideLogo, withEnvironmentOptions } from "@abp/ng.theme.shared"; +import { environment } from "./environments/environment"; export const appConfig: ApplicationConfig = { providers: [ @@ -91,15 +91,15 @@ Ensure your environment contains the logo url and app name: export const environment = { // ... application: { - name: 'MyProjectName', - logoUrl: '/assets/images/logo.png', + name: "MyProjectName", + logoUrl: "/assets/images/logo.png", }, }; ``` The LeptonX brand component reads these values automatically from `@abp/ng.theme.shared`. -2) Or override via CSS variables in `styles.scss` +2. Or override via CSS variables in `styles.scss` ```css :root { @@ -296,10 +296,11 @@ The Mobile User-Profile component key is `eThemeLeptonXComponents.MobileUserProf ![Angular Footer Component](../../images/angular-footer.png) -The Footer is the section of content at the very bottom of the site. This section of the content can be modified. -Inject **FooterLinksService** and use the **setFooterInfo** method of **FooterLinksService** +The Footer is the section of content at the very bottom of the site. This section of the content can be modified. The ABP Studio templates serve this option by default. You can reach the configurations under `angular/src/app/footer` directory that has a component and a configuration file. + +If you still prefer overriding it by yourself, remove the default configuration. Inject **FooterLinksService** and use the **setFooterInfo** method of **FooterLinksService** to assign path or link and description. -**descUrl** and **footerLinks** are nullable. Constant **footerLinks** are on the right side of footer. +The **descUrl** and **footerLinks** are nullable. Constant **footerLinks** are on the right side of footer. ```js ///... diff --git a/docs/en/ui-themes/lepton-x/angular.md b/docs/en/ui-themes/lepton-x/angular.md index efafbe442d..0d0195d39f 100644 --- a/docs/en/ui-themes/lepton-x/angular.md +++ b/docs/en/ui-themes/lepton-x/angular.md @@ -1,7 +1,7 @@ ```json //[doc-seo] { - "Description": "Learn how to integrate the LeptonX Angular UI into your project with step-by-step instructions and essential configuration tips." + "Description": "Learn how to integrate the LeptonX Angular UI into your project with step-by-step instructions and essential configuration tips." } ``` @@ -16,14 +16,12 @@ To add `LeptonX` into your existing projects, follow the steps below. Add theme-specific styles into the `styles` array of the file. Check the [Theme Configurations](../../framework/ui/angular/theme-configurations.md#lepton-x-commercial) documentation for more information. - - At last, remove `provideThemeLepton` from `app.config.ts`, and add the following providers in `app.config.ts` - ```ts -import { provideThemeLeptonX } from '@volosoft/abp.ng.theme.lepton-x'; -import { provideSideMenuLayout } from '@volosoft/abp.ng.theme.lepton-x/layouts'; -// import { provideThemeLepton } from '@volo/abp.ng.theme.lepton'; +import { provideThemeLeptonX } from "@volosoft/abp.ng.theme.lepton-x"; +import { provideSideMenuLayout } from "@volosoft/abp.ng.theme.lepton-x/layouts"; +// import { provideThemeLepton } from '@volo/abp.ng.theme.lepton'; export const appConfig: ApplicationConfig = { providers: [ @@ -37,14 +35,11 @@ export const appConfig: ApplicationConfig = { If you want to use the **`Top Menu`** instead of the **`Side Menu`**, add `provideTopMenuLayout` as below,and [this style imports](https://docs.abp.io/en/abp/7.4/UI/Angular/Theme-Configurations#lepton-x-commercial) ```ts -import { provideThemeLeptonX } from '@volosoft/abp.ng.theme.lepton-x'; -import { provideTopMenuLayout } from '@volosoft/abp.ng.theme.lepton-x/layouts'; +import { provideThemeLeptonX } from "@volosoft/abp.ng.theme.lepton-x"; +import { provideTopMenuLayout } from "@volosoft/abp.ng.theme.lepton-x/layouts"; export const appConfig: ApplicationConfig = { - providers: [ - provideTopMenuLayout(), - provideThemeLeptonX(), - ], + providers: [provideTopMenuLayout(), provideThemeLeptonX()], }; ``` @@ -74,6 +69,12 @@ export const appConfig: ApplicationConfig = { If everything is ok, you can remove the `@volo/abp.ng.theme.lepton` in package.json +## Customizing the Footer Section + +You can follow the [component replacement](../../framework/ui/angular/component-replacement.md) documentation to customize the footer part. However, the ABP Studio templates serve this by default. You can reach the footer under `angular/src/app/footer` directory that has a component and a configuration file. + +![angular-footer-files](./images/angular-footer-files.png) + ## Server Side In order to migrate to LeptonX on your server side projects (Host and/or IdentityServer projects), please follow [Server Side Migration](https://docs.abp.io/en/commercial/latest/themes/lepton-x/mvc) document. diff --git a/docs/en/ui-themes/lepton-x/images/angular-footer-files.png b/docs/en/ui-themes/lepton-x/images/angular-footer-files.png new file mode 100644 index 0000000000..384584b788 Binary files /dev/null and b/docs/en/ui-themes/lepton-x/images/angular-footer-files.png differ diff --git a/framework/Volo.Abp.slnx b/framework/Volo.Abp.slnx index 3d74af9f95..1302600c09 100644 --- a/framework/Volo.Abp.slnx +++ b/framework/Volo.Abp.slnx @@ -181,6 +181,7 @@ + diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientAccessor.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientAccessor.cs index 247e6e354e..dfe79d7e01 100644 --- a/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientAccessor.cs +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientAccessor.cs @@ -29,5 +29,13 @@ public class ChatClientAccessor : IChatClientAccessor ChatClient = serviceProvider.GetKeyedService( AbpAIWorkspaceOptions.GetChatClientServiceKeyName( WorkspaceNameAttribute.GetWorkspaceName())); + + // Fallback to default chat client if not configured for the workspace. + if (ChatClient is null) + { + ChatClient = serviceProvider.GetKeyedService( + AbpAIWorkspaceOptions.GetChatClientServiceKeyName( + AbpAIModule.DefaultWorkspaceName)); + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/TypedChatClient.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/TypedChatClient.cs index 72ccfdaf38..9a52f7edc9 100644 --- a/framework/src/Volo.Abp.AI/Volo/Abp/AI/TypedChatClient.cs +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/TypedChatClient.cs @@ -9,9 +9,13 @@ public class TypedChatClient : DelegatingChatClient, IChatClient( + serviceProvider.GetKeyedService( AbpAIWorkspaceOptions.GetChatClientServiceKeyName( WorkspaceNameAttribute.GetWorkspaceName())) + ?? + serviceProvider.GetRequiredKeyedService( + AbpAIWorkspaceOptions.GetChatClientServiceKeyName( + AbpAIModule.DefaultWorkspaceName)) ) { } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs index 0dd2c33cb8..2aead07ce7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs @@ -1,86 +1,16 @@ using System; -using System.Threading.Tasks; -using Duende.IdentityModel.Client; -using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Volo.Abp.Threading; namespace Microsoft.AspNetCore.Authentication.Cookies; public static class CookieAuthenticationOptionsExtensions { /// - /// Introspect access token on validating the principal. + /// Check the access_token is expired or inactive. /// - /// - /// - /// + [Obsolete("Use CheckTokenExpiration method instead.")] public static CookieAuthenticationOptions IntrospectAccessToken(this CookieAuthenticationOptions options, string oidcAuthenticationScheme = "oidc") { - options.Events.OnValidatePrincipal = async principalContext => - { - if (principalContext.Principal == null || principalContext.Principal.Identity == null || !principalContext.Principal.Identity.IsAuthenticated) - { - return; - } - - var logger = principalContext.HttpContext.RequestServices.GetRequiredService>(); - - var accessToken = principalContext.Properties.GetTokenValue("access_token"); - if (!accessToken.IsNullOrWhiteSpace()) - { - var openIdConnectOptions = await GetOpenIdConnectOptions(principalContext, oidcAuthenticationScheme); - var response = await openIdConnectOptions.Backchannel.IntrospectTokenAsync(new TokenIntrospectionRequest - { - Address = openIdConnectOptions.Configuration?.IntrospectionEndpoint ?? openIdConnectOptions.Authority!.EnsureEndsWith('/') + "connect/introspect", - ClientId = openIdConnectOptions.ClientId!, - ClientSecret = openIdConnectOptions.ClientSecret, - Token = accessToken - }); - - if (response.IsError) - { - logger.LogError(response.Error); - await SignOutAsync(principalContext); - return; - } - - if (!response.IsActive) - { - logger.LogError("The access_token is not active."); - await SignOutAsync(principalContext); - return; - } - - logger.LogInformation("The access_token is active."); - } - else - { - logger.LogError("The access_token is not found in the cookie properties, Please make sure SaveTokens of OpenIdConnectOptions is set as true."); - await SignOutAsync(principalContext); - } - }; - - return options; - } - - private async static Task GetOpenIdConnectOptions(CookieValidatePrincipalContext principalContext, string oidcAuthenticationScheme) - { - var openIdConnectOptions = principalContext.HttpContext.RequestServices.GetRequiredService>().Get(oidcAuthenticationScheme); - if (openIdConnectOptions.Configuration == null && openIdConnectOptions.ConfigurationManager != null) - { - var cancellationTokenProvider = principalContext.HttpContext.RequestServices.GetRequiredService(); - openIdConnectOptions.Configuration = await openIdConnectOptions.ConfigurationManager.GetConfigurationAsync(cancellationTokenProvider.Token); - } - - return openIdConnectOptions; - } - - private async static Task SignOutAsync(CookieValidatePrincipalContext principalContext) - { - principalContext.RejectPrincipal(); - await principalContext.HttpContext.SignOutAsync(principalContext.Scheme.Name); + return options.CheckTokenExpiration(oidcAuthenticationScheme, null, TimeSpan.FromMinutes(1)); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorClientHttpMessageHandler.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs similarity index 94% rename from framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorClientHttpMessageHandler.cs rename to framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs index 5fa70baabe..88855e3fc5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorClientHttpMessageHandler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs @@ -4,13 +4,15 @@ using System.Net.Http.Headers; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.JSInterop; using Volo.Abp.AspNetCore.Components.Progression; +using Volo.Abp.AspNetCore.Components.Web; using Volo.Abp.DependencyInjection; using Volo.Abp.Timing; -namespace Volo.Abp.AspNetCore.Components.Web; +namespace Volo.Abp.AspNetCore.Components.WebAssembly; public class AbpBlazorClientHttpMessageHandler : DelegatingHandler, ITransientDependency { @@ -51,6 +53,7 @@ public class AbpBlazorClientHttpMessageHandler : DelegatingHandler, ITransientDe options.Type = UiPageProgressType.Info; }); + request.SetBrowserRequestStreamingEnabled(true); await SetLanguageAsync(request, cancellationToken); await SetAntiForgeryTokenAsync(request); await SetTimeZoneAsync(request); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs index e3d3c12370..5d87371ae8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using Microsoft.AspNetCore.Http; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Distributed; @@ -7,6 +8,7 @@ using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies; using Volo.Abp.Caching; using Volo.Abp.DependencyInjection; +using Volo.Abp.Localization; using Volo.Abp.Threading; using Volo.Abp.Users; @@ -82,28 +84,47 @@ public class MvcCachedApplicationConfigurationClient : ICachedApplicationConfigu return configuration; } - private async Task GetRemoteConfigurationAsync() + protected virtual async Task GetRemoteConfigurationAsync() { - var config = await ApplicationConfigurationAppService.GetAsync( + var cultureName = CultureInfo.CurrentUICulture.Name; + + var configTask = ApplicationConfigurationAppService.GetAsync( new ApplicationConfigurationRequestOptions { IncludeLocalizationResources = false } ); - var localizationDto = await ApplicationLocalizationClientProxy.GetAsync( - new ApplicationLocalizationRequestDto { - CultureName = config.Localization.CurrentCulture.Name, + var localizationTask = ApplicationLocalizationClientProxy.GetAsync( + new ApplicationLocalizationRequestDto + { + CultureName = cultureName, OnlyDynamics = true } ); + await Task.WhenAll(configTask, localizationTask); + + var config = configTask.Result; + var localizationDto = localizationTask.Result; + + if (!CultureHelper.IsCompatibleCulture(config.Localization.CurrentCulture.Name, cultureName)) + { + localizationDto = await ApplicationLocalizationClientProxy.GetAsync( + new ApplicationLocalizationRequestDto + { + CultureName = config.Localization.CurrentCulture.Name, + OnlyDynamics = true + } + ); + } + config.Localization.Resources = localizationDto.Resources; return config; } - public ApplicationConfigurationDto Get() + public virtual ApplicationConfigurationDto Get() { string? cacheKey = null; var httpContext = HttpContextAccessor?.HttpContext; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj index c98b9b39d1..887ee1fa08 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj @@ -18,6 +18,7 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcContractsModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcContractsModule.cs index 278fe6eb21..2132764b75 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcContractsModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcContractsModule.cs @@ -1,11 +1,13 @@ using Volo.Abp.Application; using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.AspNetCore.Mvc; [DependsOn( - typeof(AbpDddApplicationContractsModule) - )] + typeof(AbpDddApplicationContractsModule), + typeof(AbpMultiTenancyAbstractionsModule) +)] public class AbpAspNetCoreMvcContractsModule : AbpModule { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/MultiTenancyInfoDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/MultiTenancyInfoDto.cs index fcbb911ad7..27085a645d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/MultiTenancyInfoDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/MultiTenancyInfoDto.cs @@ -1,6 +1,10 @@ -namespace Volo.Abp.AspNetCore.Mvc.MultiTenancy; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.AspNetCore.Mvc.MultiTenancy; public class MultiTenancyInfoDto { public bool IsEnabled { get; set; } + + public TenantUserSharingStrategy UserSharingStrategy { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs index dfd9ab60e4..b79b97140e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Frozen; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; @@ -23,7 +24,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelperService where TTagHelper : AbpDatePickerBaseTagHelper { - protected readonly Dictionary> SupportedInputTypes; + protected readonly FrozenDictionary> SupportedInputTypes; protected readonly IJsonSerializer JsonSerializer; protected readonly IHtmlGenerator Generator; @@ -103,7 +104,7 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp return string.Empty; } } - }; + }.ToFrozenDictionary(); } protected virtual T? GetAttribute() where T : Attribute @@ -136,7 +137,7 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp ? await ProcessButtonAndGetContentAsync(context, output, "calendar", "open") : ""; var clearButtonContent = TagHelper.ClearButton == true || (!TagHelper.ClearButton.HasValue && TagHelper.AutoUpdateInput != true) - ? await ProcessButtonAndGetContentAsync(context, output, "times", "clear", visible:!TagHelper.SingleOpenAndClearButton) + ? await ProcessButtonAndGetContentAsync(context, output, "times", "clear", visible: !TagHelper.SingleOpenAndClearButton) : ""; var labelContent = await GetLabelAsHtmlAsync(context, output, TagHelperOutput); @@ -269,7 +270,7 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp { var attrList = new TagHelperAttributeList(); - if(options == null) + if (options == null) { return attrList; } @@ -401,29 +402,29 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp attrList.Add("data-visible-date-format", options.VisibleDateFormat); } - if(!options.InputDateFormat.IsNullOrEmpty()) + if (!options.InputDateFormat.IsNullOrEmpty()) { attrList.Add("data-input-date-format", options.InputDateFormat); } - if(options.Ranges != null && options.Ranges.Any()) + if (options.Ranges != null && options.Ranges.Any()) { var ranges = options.Ranges.ToDictionary(r => r.Label, r => r.Dates); attrList.Add("data-ranges", JsonSerializer.Serialize(ranges)); } - if(options.AlwaysShowCalendars != null) + if (options.AlwaysShowCalendars != null) { attrList.Add("data-always-show-calendars", options.AlwaysShowCalendars.ToString()!.ToLowerInvariant()); } - if(options.ShowCustomRangeLabel == false) + if (options.ShowCustomRangeLabel == false) { attrList.Add("data-show-custom-range-label", options.ShowCustomRangeLabel.ToString()!.ToLowerInvariant()); } - if(options.Options != null) + if (options.Options != null) { attrList.Add("data-options", JsonSerializer.Serialize(options.Options)); } @@ -443,7 +444,7 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp attrList.Add("id", options.PickerId); } - if(!options.SingleOpenAndClearButton) + if (!options.SingleOpenAndClearButton) { attrList.Add("data-single-open-and-clear-button", options.SingleOpenAndClearButton.ToString().ToLowerInvariant()); } @@ -614,7 +615,8 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp { return string.Empty; } - var labelTagHelper = new LabelTagHelper(Generator) { + var labelTagHelper = new LabelTagHelper(Generator) + { ViewContext = TagHelper.ViewContext, For = modelExpression }; @@ -764,7 +766,8 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp TagHelper.Size = attribute.Size; } - return TagHelper.Size switch { + return TagHelper.Size switch + { AbpFormControlSize.Small => "form-control-sm", AbpFormControlSize.Medium => "form-control-md", AbpFormControlSize.Large => "form-control-lg", @@ -785,14 +788,14 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp protected virtual async Task GetValidationAsHtmlByInputAsync(TagHelperContext context, TagHelperOutput output, - [NotNull]ModelExpression @for) + [NotNull] ModelExpression @for) { var validationMessageTagHelper = new ValidationMessageTagHelper(Generator) { For = @for, ViewContext = TagHelper.ViewContext }; var attributeList = new TagHelperAttributeList { { "class", "text-danger" } }; - if(!output.Attributes.TryGetAttribute("name", out var nameAttribute) || nameAttribute == null || nameAttribute.Value == null) + if (!output.Attributes.TryGetAttribute("name", out var nameAttribute) || nameAttribute == null || nameAttribute.Value == null) { if (nameAttribute != null) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/ObjectExtending/MvcUiObjectExtensionPropertyInfoExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/ObjectExtending/MvcUiObjectExtensionPropertyInfoExtensions.cs index 62b86bc1c5..49ff15f9f5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/ObjectExtending/MvcUiObjectExtensionPropertyInfoExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/ObjectExtending/MvcUiObjectExtensionPropertyInfoExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Frozen; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Mvc; @@ -8,7 +9,8 @@ namespace Volo.Abp.ObjectExtending; public static class MvcUiObjectExtensionPropertyInfoExtensions { - private static readonly HashSet NumberTypes = new HashSet { + private static readonly FrozenSet NumberTypes = new HashSet + { typeof(int), typeof(long), typeof(byte), @@ -33,7 +35,7 @@ public static class MvcUiObjectExtensionPropertyInfoExtensions typeof(float?), typeof(double?), typeof(decimal?) - }; + }.ToFrozenSet(); public static string? GetInputFormatOrNull(this IBasicObjectExtensionPropertyInfo property) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs index 73edea9fdf..b1ae63c39b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs @@ -135,7 +135,8 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp { return new MultiTenancyInfoDto { - IsEnabled = _multiTenancyOptions.IsEnabled + IsEnabled = _multiTenancyOptions.IsEnabled, + UserSharingStrategy = _multiTenancyOptions.UserSharingStrategy }; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs index ad3dcc003e..2df5dea048 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs @@ -121,6 +121,7 @@ public class AspNetCoreApiDescriptionModelProvider : IApiDescriptionModelProvide Logger.LogDebug($"ActionApiDescriptionModel.Create: {controllerModel.ControllerName}.{uniqueMethodName}"); bool? allowAnonymous = null; + var authorizeModels = new List(); if (apiDescription.ActionDescriptor.EndpointMetadata.Any(x => x is IAllowAnonymous)) { allowAnonymous = true; @@ -128,6 +129,12 @@ public class AspNetCoreApiDescriptionModelProvider : IApiDescriptionModelProvide else if (apiDescription.ActionDescriptor.EndpointMetadata.Any(x => x is IAuthorizeData)) { allowAnonymous = false; + var authorizeDatas = apiDescription.ActionDescriptor.EndpointMetadata.Where(x => x is IAuthorizeData).Cast().ToList(); + authorizeModels.AddRange(authorizeDatas.Select(authorizeData => new AuthorizeDataApiDescriptionModel + { + Policy = authorizeData.Policy, + Roles = authorizeData.Roles + })); } var implementFrom = controllerType.FullName; @@ -147,6 +154,7 @@ public class AspNetCoreApiDescriptionModelProvider : IApiDescriptionModelProvide apiDescription.HttpMethod, GetSupportedVersions(controllerType, method, setting), allowAnonymous, + authorizeModels, implementFrom ) ); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinder.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinder.cs index 35a06c9c1d..ac6e44ed6c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinder.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinder.cs @@ -2,27 +2,57 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding.Binders; +using Microsoft.Extensions.Logging; using Volo.Abp.Timing; namespace Volo.Abp.AspNetCore.Mvc.ModelBinding; public class AbpDateTimeModelBinder : IModelBinder { + private readonly ILogger _logger; private readonly DateTimeModelBinder _dateTimeModelBinder; private readonly IClock _clock; + private readonly ICurrentTimezoneProvider _currentTimezoneProvider; + private readonly ITimezoneProvider _timezoneProvider; - public AbpDateTimeModelBinder(IClock clock, DateTimeModelBinder dateTimeModelBinder) + public AbpDateTimeModelBinder( + ILogger logger, + DateTimeModelBinder dateTimeModelBinder, + IClock clock, + ICurrentTimezoneProvider currentTimezoneProvider, + ITimezoneProvider timezoneProvider) { - _clock = clock; + _logger = logger; _dateTimeModelBinder = dateTimeModelBinder; + _clock = clock; + _currentTimezoneProvider = currentTimezoneProvider; + _timezoneProvider = timezoneProvider; } public async Task BindModelAsync(ModelBindingContext bindingContext) { await _dateTimeModelBinder.BindModelAsync(bindingContext); - if (bindingContext.Result.IsModelSet && bindingContext.Result.Model is DateTime dateTime) + + if (!bindingContext.Result.IsModelSet || bindingContext.Result.Model is not DateTime dateTime) { - bindingContext.Result = ModelBindingResult.Success(_clock.Normalize(dateTime)); + return; } + + if (dateTime.Kind == DateTimeKind.Unspecified && + _clock.SupportsMultipleTimezone && + !_currentTimezoneProvider.TimeZone.IsNullOrWhiteSpace()) + { + try + { + var timezoneInfo = _timezoneProvider.GetTimeZoneInfo(_currentTimezoneProvider.TimeZone); + dateTime = new DateTimeOffset(dateTime, timezoneInfo.GetUtcOffset(dateTime)).UtcDateTime; + } + catch + { + _logger.LogWarning("Could not convert DateTime with unspecified Kind using timezone '{TimeZone}'.", _currentTimezoneProvider.TimeZone); + } + } + + bindingContext.Result = ModelBindingResult.Success(_clock.Normalize(dateTime)); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinderProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinderProvider.cs index a4c3ee2288..a836838cd1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinderProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinderProvider.cs @@ -50,6 +50,6 @@ public class AbpDateTimeModelBinderProvider : IModelBinderProvider { const DateTimeStyles supportedStyles = DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AdjustToUniversal; var dateTimeModelBinder = new DateTimeModelBinder(supportedStyles, context.Services.GetRequiredService()); - return new AbpDateTimeModelBinder(context.Services.GetRequiredService(), dateTimeModelBinder); + return ActivatorUtilities.CreateInstance(context.Services, dateTimeModelBinder); } } diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs index 8f78e3292a..85cc987b61 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs @@ -14,44 +14,58 @@ namespace Microsoft.Extensions.DependencyInjection; public static class CookieAuthenticationOptionsExtensions { /// - /// Check the access_token is expired or inactive. + /// Check if the access_token is expired or inactive. /// public static CookieAuthenticationOptions CheckTokenExpiration(this CookieAuthenticationOptions options, string oidcAuthenticationScheme = "oidc", TimeSpan? advance = null, TimeSpan? validationInterval = null) { advance ??= TimeSpan.FromMinutes(3); validationInterval ??= TimeSpan.FromMinutes(1); + var previousHandler = options.Events.OnValidatePrincipal; options.Events.OnValidatePrincipal = async principalContext => { if (principalContext.Principal == null || principalContext.Principal.Identity == null || !principalContext.Principal.Identity.IsAuthenticated) { + await InvokePreviousHandlerAsync(principalContext, previousHandler); return; } var logger = principalContext.HttpContext.RequestServices.GetRequiredService>(); var tokenExpiresAt = principalContext.Properties.GetString(".Token.expires_at"); - if (!tokenExpiresAt.IsNullOrWhiteSpace() && DateTimeOffset.TryParseExact(tokenExpiresAt, "o", null, DateTimeStyles.RoundtripKind, out var expiresAt) && - expiresAt < DateTimeOffset.UtcNow.Subtract(advance.Value)) + if (!tokenExpiresAt.IsNullOrWhiteSpace() && DateTimeOffset.TryParseExact(tokenExpiresAt, "o", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var expiresAt) && + expiresAt <= DateTimeOffset.UtcNow.Add(advance.Value)) { - logger.LogInformation("The access_token is expired."); - await SignOutAsync(principalContext); + logger.LogInformation("The access_token expires within {AdvanceSeconds}s; signing out.", advance.Value.TotalSeconds); + await SignOutAndInvokePreviousHandlerAsync(principalContext, previousHandler); return; } if (principalContext.Properties.IssuedUtc != null && DateTimeOffset.UtcNow.Subtract(principalContext.Properties.IssuedUtc.Value) > validationInterval) { - logger.LogInformation($"Check the access_token is active every {validationInterval.Value.TotalSeconds} seconds."); + logger.LogInformation("Checking access_token activity every {Seconds} seconds.", validationInterval.Value.TotalSeconds); var accessToken = principalContext.Properties.GetTokenValue("access_token"); if (!accessToken.IsNullOrWhiteSpace()) { var openIdConnectOptions = await GetOpenIdConnectOptions(principalContext, oidcAuthenticationScheme); + var introspectionEndpoint = openIdConnectOptions.Configuration?.IntrospectionEndpoint; + if (introspectionEndpoint.IsNullOrWhiteSpace() && !openIdConnectOptions.Authority.IsNullOrWhiteSpace()) + { + introspectionEndpoint = openIdConnectOptions.Authority.EnsureEndsWith('/') + "connect/introspect"; + } + + if (introspectionEndpoint.IsNullOrWhiteSpace()) + { + logger.LogWarning("No introspection endpoint configured. Skipping token activity check."); + await InvokePreviousHandlerAsync(principalContext, previousHandler); + return; + } + var clientId = principalContext.Properties.GetString("client_id"); var clientSecret = principalContext.Properties.GetString("client_secret"); - var response = await openIdConnectOptions.Backchannel.IntrospectTokenAsync(new TokenIntrospectionRequest { - Address = openIdConnectOptions.Configuration?.IntrospectionEndpoint ?? openIdConnectOptions.Authority!.EnsureEndsWith('/') + "connect/introspect", + Address = introspectionEndpoint, ClientId = clientId ?? openIdConnectOptions.ClientId!, ClientSecret = clientSecret ?? openIdConnectOptions.ClientSecret, Token = accessToken @@ -59,15 +73,15 @@ public static class CookieAuthenticationOptionsExtensions if (response.IsError) { - logger.LogError(response.Error); - await SignOutAsync(principalContext); + logger.LogError("Token introspection error: {Error}", response.Error); + await SignOutAndInvokePreviousHandlerAsync(principalContext, previousHandler); return; } if (!response.IsActive) { logger.LogError("The access_token is not active."); - await SignOutAsync(principalContext); + await SignOutAndInvokePreviousHandlerAsync(principalContext, previousHandler); return; } @@ -76,10 +90,12 @@ public static class CookieAuthenticationOptionsExtensions } else { - logger.LogError("The access_token is not found in the cookie properties, Please make sure SaveTokens of OpenIdConnectOptions is set as true."); + logger.LogError("The access_token is not found in the cookie properties. Ensure SaveTokens of OpenIdConnectOptions is true."); await SignOutAsync(principalContext); } } + + await InvokePreviousHandlerAsync(principalContext, previousHandler); }; return options; @@ -97,9 +113,20 @@ public static class CookieAuthenticationOptionsExtensions return openIdConnectOptions; } - private async static Task SignOutAsync(CookieValidatePrincipalContext principalContext) + private static async Task SignOutAsync(CookieValidatePrincipalContext principalContext) { principalContext.RejectPrincipal(); await principalContext.HttpContext.SignOutAsync(principalContext.Scheme.Name); } + + private static Task InvokePreviousHandlerAsync(CookieValidatePrincipalContext principalContext, Func? previousHandler) + { + return previousHandler != null ? previousHandler(principalContext) : Task.CompletedTask; + } + + private static async Task SignOutAndInvokePreviousHandlerAsync(CookieValidatePrincipalContext principalContext, Func? previousHandler) + { + await SignOutAsync(principalContext); + await InvokePreviousHandlerAsync(principalContext, previousHandler); + } } diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingDisabledState.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingDisabledState.cs new file mode 100644 index 0000000000..c4a2384316 --- /dev/null +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingDisabledState.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.Auditing; + +public class AuditingDisabledState +{ + public bool IsDisabled { get; private set; } + + public AuditingDisabledState(bool isDisabled) + { + IsDisabled = isDisabled; + } +} diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs index aadbeccabb..028096d0ac 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs @@ -8,6 +8,7 @@ using Microsoft.Extensions.Options; using Volo.Abp.Clients; using Volo.Abp.DependencyInjection; using Volo.Abp.MultiTenancy; +using Volo.Abp.Threading; using Volo.Abp.Timing; using Volo.Abp.Tracing; using Volo.Abp.Users; @@ -26,6 +27,7 @@ public class AuditingHelper : IAuditingHelper, ITransientDependency protected IAuditSerializer AuditSerializer; protected IServiceProvider ServiceProvider; protected ICorrelationIdProvider CorrelationIdProvider { get; } + protected IAmbientScopeProvider AuditingDisabledState { get; } public AuditingHelper( IAuditSerializer auditSerializer, @@ -37,7 +39,8 @@ public class AuditingHelper : IAuditingHelper, ITransientDependency IAuditingStore auditingStore, ILogger logger, IServiceProvider serviceProvider, - ICorrelationIdProvider correlationIdProvider) + ICorrelationIdProvider correlationIdProvider, + IAmbientScopeProvider auditingDisabledState) { Options = options.Value; AuditSerializer = auditSerializer; @@ -50,6 +53,7 @@ public class AuditingHelper : IAuditingHelper, ITransientDependency Logger = logger; ServiceProvider = serviceProvider; CorrelationIdProvider = correlationIdProvider; + AuditingDisabledState = auditingDisabledState; } public virtual bool ShouldSaveAudit(MethodInfo? methodInfo, bool defaultValue = false, bool ignoreIntegrationServiceAttribute = false) @@ -64,6 +68,11 @@ public class AuditingHelper : IAuditingHelper, ITransientDependency return false; } + if (!IsAuditingEnabled()) + { + return false; + } + if (methodInfo.IsDefined(typeof(AuditedAttribute), true)) { return true; @@ -178,6 +187,19 @@ public class AuditingHelper : IAuditingHelper, ITransientDependency return actionInfo; } + private const string AuditingDisabledScopeKey = "Volo.Abp.Auditing.DisabledScope"; + + public virtual IDisposable DisableAuditing() + { + return AuditingDisabledState.BeginScope(AuditingDisabledScopeKey, new AuditingDisabledState(true)); + } + + public virtual bool IsAuditingEnabled() + { + var state = AuditingDisabledState.GetValue(AuditingDisabledScopeKey); + return state == null || !state.IsDisabled; + } + protected virtual void ExecutePreContributors(AuditLogInfo auditLogInfo) { using (var scope = ServiceProvider.CreateScope()) diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/EntityPropertyChangeInfo.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/EntityPropertyChangeInfo.cs index e25369d7b2..df7a6e88ec 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/EntityPropertyChangeInfo.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/EntityPropertyChangeInfo.cs @@ -21,7 +21,7 @@ public class EntityPropertyChangeInfo /// Maximum length of property. /// Value: 512. /// - public static int MaxPropertyTypeFullNameLength = 192; + public static int MaxPropertyTypeFullNameLength = 512; public virtual string? NewValue { get; set; } diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditingHelper.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditingHelper.cs index e6fa20bc90..f0a36da5b4 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditingHelper.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditingHelper.cs @@ -26,4 +26,23 @@ public interface IAuditingHelper MethodInfo method, IDictionary arguments ); + + /// + /// Creates a scope in which auditing is temporarily disabled. + /// + /// + /// An that restores the previous auditing state + /// when disposed. This method supports nested scopes; disposing a scope + /// restores the auditing state that was active before that scope was created. + /// + IDisposable DisableAuditing(); + + /// + /// Determines whether auditing is currently enabled. + /// + /// + /// true if auditing is enabled in the current context; otherwise, false. + /// This reflects any active scopes created by . + /// + bool IsAuditingEnabled(); } diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs index 65b7e1b390..159b72ad66 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs @@ -47,6 +47,7 @@ public class AbpAuthorizationModule : AbpModule options.ResourceValueProviders.Add(); options.ResourceValueProviders.Add(); + options.ResourceValueProviders.Add(); }); Configure(options => diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/ClientPermissionValueProvider.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/ClientPermissionValueProvider.cs index 13c7981063..d3ac6870d3 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/ClientPermissionValueProvider.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/ClientPermissionValueProvider.cs @@ -44,7 +44,7 @@ public class ClientPermissionValueProvider : PermissionValueProvider var clientId = context.Principal?.FindFirst(AbpClaimTypes.ClientId)?.Value; if (clientId == null) { - return new MultiplePermissionGrantResult(permissionNames); ; + return new MultiplePermissionGrantResult(permissionNames); } using (CurrentTenant.Change(null)) diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/Resources/ClientResourcePermissionValueProvider.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/Resources/ClientResourcePermissionValueProvider.cs new file mode 100644 index 0000000000..2a73292528 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/Resources/ClientResourcePermissionValueProvider.cs @@ -0,0 +1,55 @@ +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Security.Claims; + +namespace Volo.Abp.Authorization.Permissions.Resources; + +public class ClientResourcePermissionValueProvider : ResourcePermissionValueProvider +{ + public const string ProviderName = "C"; + + public override string Name => ProviderName; + + protected ICurrentTenant CurrentTenant { get; } + + public ClientResourcePermissionValueProvider(IResourcePermissionStore resourcePermissionStore, ICurrentTenant currentTenant) + : base(resourcePermissionStore) + { + CurrentTenant = currentTenant; + } + + public override async Task CheckAsync(ResourcePermissionValueCheckContext context) + { + var clientId = context.Principal?.FindFirst(AbpClaimTypes.ClientId)?.Value; + + if (clientId == null) + { + return PermissionGrantResult.Undefined; + } + + using (CurrentTenant.Change(null)) + { + return await ResourcePermissionStore.IsGrantedAsync(context.Permission.Name, context.ResourceName, context.ResourceKey, Name, clientId) + ? PermissionGrantResult.Granted + : PermissionGrantResult.Undefined; + } + } + + public override async Task CheckAsync(ResourcePermissionValuesCheckContext context) + { + var permissionNames = context.Permissions.Select(x => x.Name).Distinct().ToArray(); + Check.NotNullOrEmpty(permissionNames, nameof(permissionNames)); + + var clientId = context.Principal?.FindFirst(AbpClaimTypes.ClientId)?.Value; + if (clientId == null) + { + return new MultiplePermissionGrantResult(permissionNames); + } + + using (CurrentTenant.Change(null)) + { + return await ResourcePermissionStore.IsGrantedAsync(permissionNames, context.ResourceName, context.ResourceKey, Name, clientId); + } + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index bdc28c7ca0..1e2280b78a 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -12,6 +12,7 @@ using RabbitMQ.Client.Events; using Volo.Abp.ExceptionHandling; using Volo.Abp.RabbitMQ; using Volo.Abp.Threading; +using Volo.Abp.Tracing; namespace Volo.Abp.BackgroundJobs.RabbitMQ; @@ -33,6 +34,7 @@ public class JobQueue : IJobQueue protected IBackgroundJobExecuter JobExecuter { get; } protected IServiceScopeFactory ServiceScopeFactory { get; } protected IExceptionNotifier ExceptionNotifier { get; } + protected ICorrelationIdProvider CorrelationIdProvider { get; } protected SemaphoreSlim SyncObj = new SemaphoreSlim(1, 1); protected bool IsDiposed { get; private set; } @@ -44,7 +46,8 @@ public class JobQueue : IJobQueue IRabbitMqSerializer serializer, IBackgroundJobExecuter jobExecuter, IServiceScopeFactory serviceScopeFactory, - IExceptionNotifier exceptionNotifier) + IExceptionNotifier exceptionNotifier, + ICorrelationIdProvider correlationIdProvider) { AbpBackgroundJobOptions = backgroundJobOptions.Value; AbpRabbitMqBackgroundJobOptions = rabbitMqAbpBackgroundJobOptions.Value; @@ -52,6 +55,7 @@ public class JobQueue : IJobQueue JobExecuter = jobExecuter; ServiceScopeFactory = serviceScopeFactory; ExceptionNotifier = exceptionNotifier; + CorrelationIdProvider = correlationIdProvider; ChannelPool = channelPool; JobConfiguration = AbpBackgroundJobOptions.GetJob(typeof(TArgs)); @@ -168,7 +172,8 @@ public class JobQueue : IJobQueue var routingKey = QueueConfiguration.QueueName; var basicProperties = new BasicProperties { - Persistent = true + Persistent = true, + CorrelationId = CorrelationIdProvider.Get() }; if (delay.HasValue) @@ -201,7 +206,10 @@ public class JobQueue : IJobQueue try { - await JobExecuter.ExecuteAsync(context); + using (CorrelationIdProvider.Change(ea.BasicProperties.CorrelationId)) + { + await JobExecuter.ExecuteAsync(context); + } await ChannelAccessor!.Channel.BasicAckAsync(deliveryTag: ea.DeliveryTag, multiple: false); } catch (BackgroundJobExecutionException) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQOptions.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQOptions.cs index 6d48a21262..438686d29f 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQOptions.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQOptions.cs @@ -5,11 +5,11 @@ namespace Volo.Abp.BackgroundWorkers.TickerQ; public class AbpBackgroundWorkersTickerQOptions { - private readonly Dictionary _onfigurations; + private readonly Dictionary _configurations; public AbpBackgroundWorkersTickerQOptions() { - _onfigurations = new Dictionary(); + _configurations = new Dictionary(); } public void AddConfiguration(AbpBackgroundWorkersCronTickerConfiguration configuration) @@ -19,7 +19,7 @@ public class AbpBackgroundWorkersTickerQOptions public void AddConfiguration(Type workerType, AbpBackgroundWorkersCronTickerConfiguration configuration) { - _onfigurations[workerType] = configuration; + _configurations[workerType] = configuration; } public AbpBackgroundWorkersCronTickerConfiguration? GetConfigurationOrNull() @@ -29,6 +29,6 @@ public class AbpBackgroundWorkersTickerQOptions public AbpBackgroundWorkersCronTickerConfiguration? GetConfigurationOrNull(Type workerType) { - return _onfigurations.GetValueOrDefault(workerType); + return _configurations.GetValueOrDefault(workerType); } } diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs index 3026682f62..5794021488 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs @@ -1,5 +1,6 @@ using Blazorise; using System; +using System.Collections.Frozen; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; @@ -11,7 +12,8 @@ namespace Volo.Abp.BlazoriseUI; public static class BlazoriseUiObjectExtensionPropertyInfoExtensions { - private static readonly HashSet NumberTypes = new HashSet { + private static readonly FrozenSet NumberTypes = new HashSet + { typeof(int), typeof(long), typeof(byte), @@ -36,13 +38,14 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions typeof(float?), typeof(double?), typeof(decimal?) - }; + }.ToFrozenSet(); - private static readonly HashSet TextEditSupportedAttributeTypes = new HashSet { + private static readonly FrozenSet TextEditSupportedAttributeTypes = new HashSet + { typeof(EmailAddressAttribute), typeof(UrlAttribute), typeof(PhoneAttribute) - }; + }.ToFrozenSet(); public static string? GetDateEditInputFormatOrNull(this IBasicObjectExtensionPropertyInfo property) { diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs index ae571cb5f9..6ffaa96ecf 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.Caching; /// Represents a distributed cache of type. /// /// The type of cache item being cached. -public class DistributedCache : +public class DistributedCache : IDistributedCache where TCacheItem : class { @@ -683,35 +683,30 @@ public class DistributedCache : IDistributedCache x.Value != null)) - { - return result!; - } + var resultMap = result + .Where(x => x.Value != null) + .ToDictionary(x => x.Key, x => x.Value); - var missingKeys = new List(); - var missingValuesIndex = new List(); - for (var i = 0; i < keyArray.Length; i++) + if (resultMap.Count == keyArray.Length) { - if (result[i].Value != null) - { - continue; - } - - missingKeys.Add(keyArray[i]); - missingValuesIndex.Add(i); + return keyArray + .Select(key => new KeyValuePair(key, resultMap[key])) + .ToArray(); } + var missingKeys = keyArray.Where(key => !resultMap.ContainsKey(key)).ToList(); var missingValues = factory.Invoke(missingKeys).ToArray(); - var valueQueue = new Queue>(missingValues); SetMany(missingValues, optionsFactory?.Invoke(), hideErrors, considerUow); - foreach (var index in missingValuesIndex) + foreach (var pair in missingValues) { - result[index] = valueQueue.Dequeue()!; + resultMap[pair.Key] = pair.Value; } - return result; + return keyArray + .Select(key => new KeyValuePair(key, resultMap.GetOrDefault(key))) + .ToArray(); } @@ -779,35 +774,30 @@ public class DistributedCache : IDistributedCache x.Value != null)) - { - return result; - } + var resultMap = result + .Where(x => x.Value != null) + .ToDictionary(x => x.Key, x => x.Value); - var missingKeys = new List(); - var missingValuesIndex = new List(); - for (var i = 0; i < keyArray.Length; i++) + if (resultMap.Count == keyArray.Length) { - if (result[i].Value != null) - { - continue; - } - - missingKeys.Add(keyArray[i]); - missingValuesIndex.Add(i); + return keyArray + .Select(key => new KeyValuePair(key, resultMap[key])) + .ToArray(); } + var missingKeys = keyArray.Where(key => !resultMap.ContainsKey(key)).ToList(); var missingValues = (await factory.Invoke(missingKeys)).ToArray(); - var valueQueue = new Queue>(missingValues); await SetManyAsync(missingValues, optionsFactory?.Invoke(), hideErrors, considerUow, token); - foreach (var index in missingValuesIndex) + foreach (var pair in missingValues) { - result[index] = valueQueue.Dequeue()!; + resultMap[pair.Key] = pair.Value; } - return result; + return keyArray + .Select(key => new KeyValuePair(key, resultMap.GetOrDefault(key))) + .ToArray(); } /// diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs index 0141195cb5..af007c0901 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs @@ -6,11 +6,21 @@ using System.Threading.Tasks; using Microsoft.Extensions.FileSystemGlobbing; using Microsoft.Extensions.FileSystemGlobbing.Abstractions; using Microsoft.Extensions.Logging; +using Newtonsoft.Json.Linq; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Cli.LIbs; +public enum JavaScriptFrameworkType +{ + None, + ReactNative, + React, + Vue, + NextJs +} + public class InstallLibsService : IInstallLibsService, ITransientDependency { private readonly static List ExcludeDirectory = new List() @@ -78,36 +88,155 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency await CleanAndCopyResources(projectDirectory); } + + // JavaScript frameworks (React Native, React, Vue, Next.js) + if (projectPath.EndsWith("package.json")) + { + var frameworkType = DetectFrameworkTypeFromPackageJson(projectPath); + + if (frameworkType != JavaScriptFrameworkType.None) + { + var frameworkName = frameworkType switch + { + JavaScriptFrameworkType.ReactNative => "React Native", + JavaScriptFrameworkType.React => "React", + JavaScriptFrameworkType.Vue => "Vue.js", + JavaScriptFrameworkType.NextJs => "Next.js", + _ => "JavaScript" + }; + + Logger.LogInformation($"Installing dependencies for {frameworkName} project: {projectDirectory}"); + NpmHelper.RunYarn(projectDirectory); + } + } + } + } + + private JavaScriptFrameworkType DetectFrameworkTypeFromPackageJson(string packageJsonFilePath) + { + if (!File.Exists(packageJsonFilePath)) + { + return JavaScriptFrameworkType.None; + } + + try + { + var packageJsonContent = File.ReadAllText(packageJsonFilePath); + var packageJson = JObject.Parse(packageJsonContent); + + var dependencies = new HashSet(StringComparer.OrdinalIgnoreCase); + + // Check dependencies + if (packageJson["dependencies"] is JObject deps) + { + foreach (var prop in deps.Properties()) + { + dependencies.Add(prop.Name); + } + } + + // Check devDependencies + if (packageJson["devDependencies"] is JObject devDeps) + { + foreach (var prop in devDeps.Properties()) + { + dependencies.Add(prop.Name); + } + } + + // Check for React Native first (has priority over React) + if (dependencies.Contains("react-native")) + { + return JavaScriptFrameworkType.ReactNative; + } + + // Check for other frameworks + if (dependencies.Contains("next")) + { + return JavaScriptFrameworkType.NextJs; + } + + if (dependencies.Contains("vue")) + { + return JavaScriptFrameworkType.Vue; + } + + if (dependencies.Contains("react")) + { + return JavaScriptFrameworkType.React; + } + + return JavaScriptFrameworkType.None; + } + catch (Exception ex) + { + Logger.LogWarning(ex, "Failed to parse package.json at {PackageJsonFilePath}", packageJsonFilePath); + return JavaScriptFrameworkType.None; } } private List FindAllProjects(string directory) { - return Directory.GetFiles(directory, "*.csproj", SearchOption.AllDirectories) - .Union(Directory.GetFiles(directory, "angular.json", SearchOption.AllDirectories)) + var projects = new List(); + + // Find .csproj files (existing logic) + var csprojFiles = Directory.GetFiles(directory, "*.csproj", SearchOption.AllDirectories) .Where(file => ExcludeDirectory.All(x => file.IndexOf(x + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase) == -1)) .Where(file => { - if (file.EndsWith(".csproj")) + var packageJsonFilePath = Path.Combine(Path.GetDirectoryName(file), "package.json"); + if (!File.Exists(packageJsonFilePath)) { - var packageJsonFilePath = Path.Combine(Path.GetDirectoryName(file), "package.json"); - if (!File.Exists(packageJsonFilePath)) - { - return false; - } + return false; + } - using (var reader = File.OpenText(file)) - { - var fileTexts = reader.ReadToEnd(); - return fileTexts.Contains("Microsoft.NET.Sdk.Web") || - fileTexts.Contains("Microsoft.NET.Sdk.Razor") || - fileTexts.Contains("Microsoft.NET.Sdk.BlazorWebAssembly"); - } + using (var reader = File.OpenText(file)) + { + var fileTexts = reader.ReadToEnd(); + return fileTexts.Contains("Microsoft.NET.Sdk.Web") || + fileTexts.Contains("Microsoft.NET.Sdk.Razor") || + fileTexts.Contains("Microsoft.NET.Sdk.BlazorWebAssembly"); } - return true; - }) - .OrderBy(x => x) - .ToList(); + }); + + projects.AddRange(csprojFiles); + + // Find angular.json files (existing logic) + var angularFiles = Directory.GetFiles(directory, "angular.json", SearchOption.AllDirectories) + .Where(file => ExcludeDirectory.All(x => file.IndexOf(x + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase) == -1)); + + projects.AddRange(angularFiles); + + // Find package.json files for JavaScript frameworks + var packageJsonFiles = Directory.GetFiles(directory, "package.json", SearchOption.AllDirectories) + .Where(file => ExcludeDirectory.All(x => file.IndexOf(x + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase) == -1)) + .Where(packageJsonFile => + { + var packageJsonDirectory = Path.GetDirectoryName(packageJsonFile); + if (packageJsonDirectory == null) + { + return false; + } + + // Skip if already handled by Angular or .NET detection + if (File.Exists(Path.Combine(packageJsonDirectory, "angular.json"))) + { + return false; + } + + if (Directory.GetFiles(packageJsonDirectory, "*.csproj", SearchOption.TopDirectoryOnly).Any()) + { + return false; + } + + // Check if it's a JavaScript framework project + var frameworkType = DetectFrameworkTypeFromPackageJson(packageJsonFile); + return frameworkType != JavaScriptFrameworkType.None; + }); + + projects.AddRange(packageJsonFiles); + + return projects.OrderBy(x => x).ToList(); } private async Task CleanAndCopyResources(string fileDirectory) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs index 36006ecd18..e5c950f082 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Collections.Generic; +using System.Linq; using Volo.Abp.Cli.ProjectBuilding.Files; namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; @@ -41,7 +42,7 @@ public class SolutionRenamer if (_companyName != null) { RenameHelper.RenameAll(_entries, _companyNamePlaceHolder, _companyName); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase(), _companyName.ToCamelCase()); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase(), ToCamelCaseWithNamespace(_companyName)); RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase(), _companyName.ToKebabCase()); RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToLowerInvariant(), _companyName.ToLowerInvariant()); } @@ -55,9 +56,19 @@ public class SolutionRenamer } RenameHelper.RenameAll(_entries, _projectNamePlaceHolder, _projectName); - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToCamelCase(), _projectName.ToCamelCase()); + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToCamelCase(), ToCamelCaseWithNamespace(_projectName)); RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToKebabCase(), _projectName.ToKebabCase()); RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToLowerInvariant(), _projectName.ToLowerInvariant()); RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToSnakeCase().ToUpper(), _projectName.ToSnakeCase().ToUpper()); } + + private static string ToCamelCaseWithNamespace(string name) + { + if (name.Contains('.')) + { + return name.Split('.').Select(n => n.ToCamelCase()).JoinAsString("."); + } + + return name.ToCamelCase(); + } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs index b8ba1ea113..9f2cb4d221 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs @@ -3,14 +3,12 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NuGet.Versioning; -using Volo.Abp.Cli.Http; using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; @@ -28,14 +26,12 @@ public class NpmPackagesUpdater : ITransientDependency private readonly PackageJsonFileFinder _packageJsonFileFinder; private readonly NpmGlobalPackagesChecker _npmGlobalPackagesChecker; - private readonly Dictionary _fileVersionStorage = new Dictionary(); - private readonly CliHttpClientFactory _cliHttpClientFactory; + private readonly Dictionary _fileVersionStorage = []; public NpmPackagesUpdater( PackageJsonFileFinder packageJsonFileFinder, NpmGlobalPackagesChecker npmGlobalPackagesChecker, ICancellationTokenProvider cancellationTokenProvider, - CliHttpClientFactory cliHttpClientFactory, IInstallLibsService installLibsService, ICmdHelper cmdHelper) { @@ -44,7 +40,6 @@ public class NpmPackagesUpdater : ITransientDependency CancellationTokenProvider = cancellationTokenProvider; InstallLibsService = installLibsService; CmdHelper = cmdHelper; - _cliHttpClientFactory = cliHttpClientFactory; Logger = NullLogger.Instance; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Logging/DefaultInitLoggerFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Logging/DefaultInitLoggerFactory.cs index 1fa5d45090..638888493d 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Logging/DefaultInitLoggerFactory.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Logging/DefaultInitLoggerFactory.cs @@ -5,10 +5,10 @@ namespace Volo.Abp.Logging; public class DefaultInitLoggerFactory : IInitLoggerFactory { - private readonly Dictionary _cache = new Dictionary(); + private readonly Dictionary _cache = []; public virtual IInitLogger Create() { - return (IInitLogger)_cache.GetOrAdd(typeof(T), () => new DefaultInitLogger()); ; + return (IInitLogger)_cache.GetOrAdd(typeof(T), () => new DefaultInitLogger()); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs index e423e2087f..eb83b73b75 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Frozen; using System.Collections.Generic; using System.Collections.Immutable; using System.ComponentModel; @@ -13,14 +14,14 @@ namespace Volo.Abp.Reflection; public static class TypeHelper { - private static readonly HashSet FloatingTypes = new HashSet + private static readonly FrozenSet FloatingTypes = new HashSet { typeof(float), typeof(double), typeof(decimal) - }; + }.ToFrozenSet(); - private static readonly HashSet NonNullablePrimitiveTypes = new HashSet + private static readonly FrozenSet NonNullablePrimitiveTypes = new HashSet { typeof(byte), typeof(short), @@ -37,7 +38,7 @@ public static class TypeHelper typeof(DateTimeOffset), typeof(TimeSpan), typeof(Guid) - }; + }.ToFrozenSet(); public static bool IsNonNullablePrimitiveType(Type type) { diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataFilterExtensions.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataFilterExtensions.cs new file mode 100644 index 0000000000..8123ab7528 --- /dev/null +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataFilterExtensions.cs @@ -0,0 +1,270 @@ +using System; + +namespace Volo.Abp.Data; + +public static class DataFilterExtensions +{ + private sealed class CompositeDisposable : IDisposable + { + private readonly IDisposable[] _disposables; + private bool _disposed; + + public CompositeDisposable(IDisposable[] disposables) + { + _disposables = disposables; + } + + public void Dispose() + { + if (_disposed) + { + return; + } + + _disposed = true; + + foreach (var disposable in _disposables) + { + disposable?.Dispose(); + } + } + } + + public static IDisposable Disable(this IDataFilter filter) + where T1 : class + where T2 : class + { + return new CompositeDisposable(new[] + { + filter.Disable(), + filter.Disable() + }); + } + + public static IDisposable Disable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + { + return new CompositeDisposable(new[] + { + filter.Disable(), + filter.Disable(), + filter.Disable() + }); + } + + public static IDisposable Disable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + where T4 : class + { + return new CompositeDisposable(new[] + { + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable() + }); + } + + public static IDisposable Disable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + where T4 : class + where T5 : class + { + return new CompositeDisposable(new[] + { + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable() + }); + } + + public static IDisposable Disable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + where T4 : class + where T5 : class + where T6 : class + { + return new CompositeDisposable(new[] + { + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable() + }); + } + + public static IDisposable Disable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + where T4 : class + where T5 : class + where T6 : class + where T7 : class + { + return new CompositeDisposable(new[] + { + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable() + }); + } + + public static IDisposable Disable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + where T4 : class + where T5 : class + where T6 : class + where T7 : class + where T8 : class + { + return new CompositeDisposable(new[] + { + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable(), + filter.Disable() + }); + } + + public static IDisposable Enable(this IDataFilter filter) + where T1 : class + where T2 : class + { + return new CompositeDisposable(new[] + { + filter.Enable(), + filter.Enable() + }); + } + + public static IDisposable Enable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + { + return new CompositeDisposable(new[] + { + filter.Enable(), + filter.Enable(), + filter.Enable() + }); + } + + public static IDisposable Enable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + where T4 : class + { + return new CompositeDisposable(new[] + { + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable() + }); + } + + public static IDisposable Enable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + where T4 : class + where T5 : class + { + return new CompositeDisposable(new[] + { + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable() + }); + } + + public static IDisposable Enable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + where T4 : class + where T5 : class + where T6 : class + { + return new CompositeDisposable(new[] + { + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable() + }); + } + + public static IDisposable Enable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + where T4 : class + where T5 : class + where T6 : class + where T7 : class + { + return new CompositeDisposable(new[] + { + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable() + }); + } + + public static IDisposable Enable(this IDataFilter filter) + where T1 : class + where T2 : class + where T3 : class + where T4 : class + where T5 : class + where T6 : class + where T7 : class + where T8 : class + { + return new CompositeDisposable(new[] + { + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable(), + filter.Enable() + }); + } +} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs index 81d2993c4f..c35406b45b 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs @@ -20,7 +20,7 @@ public static class EntityCacheServiceCollectionExtensions services.Configure(options => { - options.ConfigureCache(cacheOptions ?? GetDefaultCacheOptions()); + options.ConfigureCache>(cacheOptions ?? GetDefaultCacheOptions()); }); services.Configure(options => @@ -42,7 +42,7 @@ public static class EntityCacheServiceCollectionExtensions services.Configure(options => { - options.ConfigureCache(cacheOptions ?? GetDefaultCacheOptions()); + options.ConfigureCache>(cacheOptions ?? GetDefaultCacheOptions()); }); return services; @@ -59,7 +59,7 @@ public static class EntityCacheServiceCollectionExtensions services.Configure(options => { - options.ConfigureCache(cacheOptions ?? GetDefaultCacheOptions()); + options.ConfigureCache>(cacheOptions ?? GetDefaultCacheOptions()); }); return services; 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 6a5b608c76..dd2a9cfde7 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -277,7 +277,19 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, finally { ChangeTracker.AutoDetectChangesEnabled = true; - AbpEfCoreNavigationHelper.RemoveChangedEntityEntries(); + AbpEfCoreNavigationHelper.ResetChangedFlags(); + if (UnitOfWorkManager.Current != null) + { + UnitOfWorkManager.Current.OnCompleted(() => + { + AbpEfCoreNavigationHelper.Clear(); + return Task.CompletedTask; + }); + } + else + { + AbpEfCoreNavigationHelper.Clear(); + } } } @@ -310,7 +322,7 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, EntityChangeEventHelper.PublishEntityUpdatedEvent(entityEntry.Entity); } } - else if (entityEntry.Properties.Any(x => x.IsModified && (x.Metadata.ValueGenerated == ValueGenerated.Never || x.Metadata.ValueGenerated == ValueGenerated.OnAdd))) + else if (GetAllPropertyEntries(entityEntry).Any(x => x.IsModified && (x.Metadata.ValueGenerated == ValueGenerated.Never || x.Metadata.ValueGenerated == ValueGenerated.OnAdd))) { if (IsOnlyForeignKeysModified(entityEntry)) { @@ -446,7 +458,7 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, break; case EntityState.Modified: - if (entry.Properties.Any(x => x.IsModified && (x.Metadata.ValueGenerated == ValueGenerated.Never || x.Metadata.ValueGenerated == ValueGenerated.OnAdd))) + if (GetAllPropertyEntries(entry).Any(x => x.IsModified && (x.Metadata.ValueGenerated == ValueGenerated.Never || x.Metadata.ValueGenerated == ValueGenerated.OnAdd))) { if (IsOnlyForeignKeysModified(entry)) { @@ -454,7 +466,7 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, break; } - var modifiedProperties = entry.Properties.Where(x => x.IsModified).ToList(); + var modifiedProperties = GetAllPropertyEntries(entry).Where(x => x.IsModified).ToList(); var disableAuditingAttributes = modifiedProperties.Select(x => x.Metadata.PropertyInfo?.GetCustomAttribute()).ToList(); if (disableAuditingAttributes.Any(x => x == null || x.UpdateModificationProps)) { @@ -501,9 +513,36 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, } } + protected virtual IEnumerable GetAllPropertyEntries(EntityEntry entry) + { + return entry.Properties.Concat(GetAllComplexPropertyEntries(entry.ComplexProperties)); + } + + protected virtual IEnumerable GetAllComplexPropertyEntries(IEnumerable complexPropertyEntries) + { + foreach (var complexPropertyEntry in complexPropertyEntries) + { + var complexPropertyInfo = complexPropertyEntry.Metadata.PropertyInfo; + if (complexPropertyInfo != null && complexPropertyInfo.IsDefined(typeof(DisableAuditingAttribute), true)) + { + continue; + } + + foreach (var propertyEntry in complexPropertyEntry.Properties) + { + yield return propertyEntry; + } + + foreach (var nestedPropertyEntry in GetAllComplexPropertyEntries(complexPropertyEntry.ComplexProperties)) + { + yield return nestedPropertyEntry; + } + } + } + protected virtual bool IsOnlyForeignKeysModified(EntityEntry entry) { - return entry.Properties.Where(x => x.IsModified).All(x => x.Metadata.IsForeignKey() && + return GetAllPropertyEntries(entry).Where(x => x.IsModified).All(x => x.Metadata.IsForeignKey() && (x.CurrentValue == null || x.OriginalValue?.ToString() == x.CurrentValue?.ToString())); } @@ -662,7 +701,7 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, protected virtual void ApplyAbpConceptsForModifiedEntity(EntityEntry entry, bool forceApply = false) { if (forceApply || - entry.Properties.Any(x => x.IsModified && (x.Metadata.ValueGenerated == ValueGenerated.Never || x.Metadata.ValueGenerated == ValueGenerated.OnAdd))) + GetAllPropertyEntries(entry).Any(x => x.IsModified && (x.Metadata.ValueGenerated == ValueGenerated.Never || x.Metadata.ValueGenerated == ValueGenerated.OnAdd))) { IncrementEntityVersionProperty(entry); SetModificationAuditProperties(entry); @@ -967,7 +1006,7 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, return expression; } - protected virtual bool UseDbFunction() + public virtual bool UseDbFunction() { return LazyServiceProvider != null && GlobalFilterOptions.Value.UseDbFunction && DbContextOptions.FindExtension() != null; } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs index 39835569cb..077ff21d2b 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs @@ -222,9 +222,19 @@ public class AbpEfCoreNavigationHelper : ITransientDependency return null; } - public virtual void RemoveChangedEntityEntries() + public virtual void ResetChangedFlags() { - EntityEntries.RemoveAll(x => x.Value.IsModified); + foreach (var entry in EntityEntries.Values) + { + if (entry.IsModified) + { + entry.IsModified = false; + foreach (var navigation in entry.NavigationEntries) + { + navigation.IsModified = false; + } + } + } } public virtual void Clear() 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 f87a05e4a9..9a1e8e3cdf 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 @@ -5,6 +5,7 @@ using System.Linq; using System.Reflection; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -108,12 +109,17 @@ public class EntityHistoryHelper : IEntityHistoryHelper, ITransientDependency } var entityType = entity.GetType(); + var entityFullName = entityType.FullName!; + if (entityEntry.Metadata.HasSharedClrType && !entityEntry.Metadata.IsOwned()) + { + entityFullName = entityEntry.Metadata.Name; + } var entityChange = new EntityChangeInfo { ChangeType = changeType, EntityEntry = entityEntry, EntityId = entityId, - EntityTypeFullName = entityType.FullName, + EntityTypeFullName = entityFullName, PropertyChanges = GetPropertyChanges(entityEntry), EntityTenantId = GetTenantId(entity) }; @@ -178,51 +184,163 @@ public class EntityHistoryHelper : IEntityHistoryHelper, ITransientDependency var properties = entityEntry.Metadata.GetProperties(); var isCreated = IsCreated(entityEntry); var isDeleted = IsDeleted(entityEntry); + var isSoftDeleted = IsSoftDeleted(entityEntry); foreach (var property in properties) { + if (entityEntry.Metadata.IsMappedToJson() && property.GetJsonPropertyName() == null) + { + continue; + } + var propertyEntry = entityEntry.Property(property.Name); - if (ShouldSavePropertyHistory(propertyEntry, isCreated || isDeleted) && !IsSoftDeleted(entityEntry)) + if (ShouldSavePropertyHistory(propertyEntry, isCreated || isDeleted) && !isSoftDeleted) { + var propertyType = DeterminePropertyTypeFromEntry(property, propertyEntry); + propertyChanges.Add(new EntityPropertyChangeInfo { NewValue = isDeleted ? null : JsonSerializer.Serialize(propertyEntry.CurrentValue!).TruncateWithPostfix(EntityPropertyChangeInfo.MaxValueLength), OriginalValue = isCreated ? null : JsonSerializer.Serialize(propertyEntry.OriginalValue!).TruncateWithPostfix(EntityPropertyChangeInfo.MaxValueLength), PropertyName = property.Name, - PropertyTypeFullName = property.ClrType.GetFirstGenericArgumentIfNullable().FullName! + PropertyTypeFullName = propertyType.FullName! }); } } - if (AbpEfCoreNavigationHelper != null) + foreach (var complexPropertyEntry in entityEntry.ComplexProperties) { - foreach (var (navigationEntry, index) in entityEntry.Navigations.Select((value, i) => ( value, i ))) + AddComplexPropertyChanges( + complexPropertyEntry, + propertyChanges, + isCreated, + isDeleted, + isSoftDeleted, + parentPath: null); + } + + if (AbpEfCoreNavigationHelper == null) + { + return propertyChanges; + } + + 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 (navigationEntry.Metadata.TargetEntityType.IsMappedToJson() && navigationEntry is ReferenceEntry referenceEntry && referenceEntry.TargetEntry != null) { - var propertyInfo = navigationEntry.Metadata.PropertyInfo; - if (propertyInfo != null && - propertyInfo.IsDefined(typeof(DisableAuditingAttribute), true)) + foreach (var propertyChange in GetPropertyChanges(referenceEntry.TargetEntry)) { - continue; + propertyChange.PropertyName = $"{referenceEntry.Metadata.Name}.{propertyChange.PropertyName}"; + propertyChanges.Add(propertyChange); } - if (AbpEfCoreNavigationHelper.IsNavigationEntryModified(entityEntry, index)) + continue; + } + + if (AbpEfCoreNavigationHelper.IsNavigationEntryModified(entityEntry, index)) + { + var abpNavigationEntry = AbpEfCoreNavigationHelper.GetNavigationEntry(entityEntry, index); + + var isCollection = navigationEntry.Metadata.IsCollection; + propertyChanges.Add(new EntityPropertyChangeInfo { - var abpNavigationEntry = AbpEfCoreNavigationHelper.GetNavigationEntry(entityEntry, index); - var isCollection = navigationEntry.Metadata.IsCollection; - propertyChanges.Add(new EntityPropertyChangeInfo - { - PropertyName = navigationEntry.Metadata.Name, - PropertyTypeFullName = navigationEntry.Metadata.ClrType.GetFirstGenericArgumentIfNullable().FullName!, - OriginalValue = GetNavigationPropertyValue(abpNavigationEntry?.OriginalValue, isCollection), - NewValue = GetNavigationPropertyValue(abpNavigationEntry?.CurrentValue, isCollection) - }); - } + PropertyName = navigationEntry.Metadata.Name, + PropertyTypeFullName = navigationEntry.Metadata.ClrType.GetFirstGenericArgumentIfNullable().FullName!, + OriginalValue = GetNavigationPropertyValue(abpNavigationEntry?.OriginalValue, isCollection), + NewValue = GetNavigationPropertyValue(abpNavigationEntry?.CurrentValue, isCollection) + }); } } return propertyChanges; } + protected virtual void AddComplexPropertyChanges( + ComplexPropertyEntry complexPropertyEntry, + List propertyChanges, + bool isCreated, + bool isDeleted, + bool isSoftDeleted, + string? parentPath) + { + var complexPropertyInfo = complexPropertyEntry.Metadata.PropertyInfo; + if (complexPropertyInfo != null && complexPropertyInfo.IsDefined(typeof(DisableAuditingAttribute), true)) + { + return; + } + + var complexPropertyPath = parentPath == null + ? complexPropertyEntry.Metadata.Name + : $"{parentPath}.{complexPropertyEntry.Metadata.Name}"; + + foreach (var propertyEntry in complexPropertyEntry.Properties) + { + if (ShouldSavePropertyHistory(propertyEntry, isCreated || isDeleted) && !isSoftDeleted) + { + var propertyType = DeterminePropertyTypeFromEntry(propertyEntry.Metadata, propertyEntry); + + propertyChanges.Add(new EntityPropertyChangeInfo + { + NewValue = isDeleted ? null : JsonSerializer.Serialize(propertyEntry.CurrentValue!).TruncateWithPostfix(EntityPropertyChangeInfo.MaxValueLength), + OriginalValue = isCreated ? null : JsonSerializer.Serialize(propertyEntry.OriginalValue!).TruncateWithPostfix(EntityPropertyChangeInfo.MaxValueLength), + PropertyName = $"{complexPropertyPath}.{propertyEntry.Metadata.Name}", + PropertyTypeFullName = propertyType.FullName! + }); + } + } + + foreach (var nestedComplexPropertyEntry in complexPropertyEntry.ComplexProperties) + { + AddComplexPropertyChanges( + nestedComplexPropertyEntry, + propertyChanges, + isCreated, + isDeleted, + isSoftDeleted, + complexPropertyPath); + } + } + + /// + /// Determines the CLR type of a property based on its EF Core metadata and the values in the given . + /// + /// The EF Core property metadata that provides the declared CLR type. + /// The property entry that contains the current and original values for the property. + /// + /// The most specific CLR type inferred for the property. This is normally the property's declared CLR type (with + /// nullable wrappers removed). If the declared type is , the type is inferred from the + /// runtime type of or, if that is null, from + /// . If both values are null, the declared CLR type + /// (which may remain ) is returned. + /// + protected virtual Type DeterminePropertyTypeFromEntry(IReadOnlyPropertyBase property, PropertyEntry propertyEntry) + { + var propertyType = property.ClrType.GetFirstGenericArgumentIfNullable(); + + if (propertyType != typeof(object)) + { + return propertyType; + } + + if (propertyEntry.CurrentValue != null) + { + propertyType = propertyEntry.CurrentValue.GetType().GetFirstGenericArgumentIfNullable(); + } + else if (propertyEntry.OriginalValue != null) + { + propertyType = propertyEntry.OriginalValue.GetType().GetFirstGenericArgumentIfNullable(); + } + + return propertyType; + } + protected virtual string? GetNavigationPropertyValue(object? entity, bool isCollection) { switch (entity) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/AbpCompiledQueryCacheKeyGenerator.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/AbpCompiledQueryCacheKeyGenerator.cs index e43ae1e04d..8ce26b7ce1 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/AbpCompiledQueryCacheKeyGenerator.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/AbpCompiledQueryCacheKeyGenerator.cs @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; using System.Linq.Expressions; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Query; +using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.GlobalFilters; @@ -23,7 +25,21 @@ public class AbpCompiledQueryCacheKeyGenerator : ICompiledQueryCacheKeyGenerator var cacheKey = InnerCompiledQueryCacheKeyGenerator.GenerateCacheKey(query, async); if (CurrentContext.Context is IAbpEfCoreDbFunctionContext abpEfCoreDbFunctionContext) { - return new AbpCompiledQueryCacheKey(cacheKey, abpEfCoreDbFunctionContext.GetCompiledQueryCacheKey()); + var abpCacheKey = abpEfCoreDbFunctionContext.GetCompiledQueryCacheKey(); + var cacheKeyProviders = abpEfCoreDbFunctionContext.LazyServiceProvider.GetService>(); + if (cacheKeyProviders != null) + { + foreach (var provider in cacheKeyProviders) + { + var key = provider.GetCompiledQueryCacheKey(); + if (!key.IsNullOrWhiteSpace()) + { + abpCacheKey += $":{key}"; + } + } + } + + return new AbpCompiledQueryCacheKey(cacheKey, abpCacheKey); } return cacheKey; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/IAbpEfCoreCompiledQueryCacheKeyProvider.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/IAbpEfCoreCompiledQueryCacheKeyProvider.cs new file mode 100644 index 0000000000..80d563fc15 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/IAbpEfCoreCompiledQueryCacheKeyProvider.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.EntityFrameworkCore.GlobalFilters; + +public interface IAbpEfCoreCompiledQueryCacheKeyProvider +{ + string? GetCompiledQueryCacheKey(); +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/IAbpEfCoreDbFunctionContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/IAbpEfCoreDbFunctionContext.cs index 85096e9e0a..3948de48b5 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/IAbpEfCoreDbFunctionContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/GlobalFilters/IAbpEfCoreDbFunctionContext.cs @@ -12,5 +12,7 @@ public interface IAbpEfCoreDbFunctionContext IDataFilter DataFilter { get; } + bool UseDbFunction(); + string GetCompiledQueryCacheKey(); } diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/PostConfigureAbpRabbitMqEventBusOptions.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/PostConfigureAbpRabbitMqEventBusOptions.cs index f4e69c46c6..76a74e2b3e 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/PostConfigureAbpRabbitMqEventBusOptions.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/PostConfigureAbpRabbitMqEventBusOptions.cs @@ -1,3 +1,4 @@ +using System.Collections.Frozen; using System.Collections.Generic; using Microsoft.Extensions.Options; @@ -5,23 +6,23 @@ namespace Volo.Abp.EventBus.RabbitMq; public class PostConfigureAbpRabbitMqEventBusOptions : IPostConfigureOptions { - private readonly HashSet _uint64QueueArguments = - [ - "x-delivery-limit", - "x-expires", - "x-message-ttl", - "x-max-length", - "x-max-length-bytes", - "x-quorum-initial-group-size", - "x-quorum-target-group-size", - "x-stream-filter-size-bytes", - "x-stream-max-segment-size-bytes", - ]; + private readonly FrozenSet _uint64QueueArguments = new HashSet + { + "x-delivery-limit", + "x-expires", + "x-message-ttl", + "x-max-length", + "x-max-length-bytes", + "x-quorum-initial-group-size", + "x-quorum-target-group-size", + "x-stream-filter-size-bytes", + "x-stream-max-segment-size-bytes", + }.ToFrozenSet(); - private readonly HashSet _boolQueueArguments = - [ - "x-single-active-consumer" - ]; + private readonly FrozenSet _boolQueueArguments = new HashSet + { + "x-single-active-consumer" + }.ToFrozenSet(); public virtual void PostConfigure(string? name, AbpRabbitMqEventBusOptions options) { diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ActionApiDescriptionModel.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ActionApiDescriptionModel.cs index 890637d801..83bacddd8c 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ActionApiDescriptionModel.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ActionApiDescriptionModel.cs @@ -28,6 +28,8 @@ public class ActionApiDescriptionModel public bool? AllowAnonymous { get; set; } + public IList AuthorizeDatas { get; set; } = default!; + public string? ImplementFrom { get; set; } public ActionApiDescriptionModel() @@ -35,7 +37,7 @@ public class ActionApiDescriptionModel } - public static ActionApiDescriptionModel Create([NotNull] string uniqueName, [NotNull] MethodInfo method, [NotNull] string url, string? httpMethod, [NotNull] IList supportedVersions, bool? allowAnonymous = null, string? implementFrom = null) + public static ActionApiDescriptionModel Create([NotNull] string uniqueName, [NotNull] MethodInfo method, [NotNull] string url, string? httpMethod, [NotNull] IList supportedVersions, bool? allowAnonymous = null, IList? authorizeDatas = null, string? implementFrom = null) { Check.NotNull(uniqueName, nameof(uniqueName)); Check.NotNull(method, nameof(method)); @@ -56,6 +58,7 @@ public class ActionApiDescriptionModel .ToList(), SupportedVersions = supportedVersions, AllowAnonymous = allowAnonymous, + AuthorizeDatas = authorizeDatas ?? new List(), ImplementFrom = implementFrom }; } diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/AuthorizeDataApiDescriptionModel.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/AuthorizeDataApiDescriptionModel.cs new file mode 100644 index 0000000000..d218b5508d --- /dev/null +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/AuthorizeDataApiDescriptionModel.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.Http.Modeling; + +public class AuthorizeDataApiDescriptionModel +{ + public string? Policy { get; set; } + + public string? Roles { get; set; } +} diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/ProxyScriptingJsFuncHelper.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/ProxyScriptingJsFuncHelper.cs index 33c5b0d05f..ebc296e697 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/ProxyScriptingJsFuncHelper.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/ProxyScriptingJsFuncHelper.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Frozen; using System.Collections.Generic; using System.Linq; using System.Text; @@ -10,7 +11,8 @@ internal static class ProxyScriptingJsFuncHelper { private const string ValidJsVariableNameChars = "abcdefghijklmnopqrstuxwvyzABCDEFGHIJKLMNOPQRSTUXWVYZ0123456789_"; - private static readonly HashSet ReservedWords = new HashSet { + private static readonly FrozenSet ReservedWords = new HashSet + { "abstract", "else", "instanceof", @@ -71,7 +73,7 @@ internal static class ProxyScriptingJsFuncHelper "in", "static", "with" - }; + }.ToFrozenSet(); public static string NormalizeJsVariableName(string name, string additionalChars = "") { diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDateTimeConverter.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDateTimeConverter.cs index c95660e484..55c270d14e 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDateTimeConverter.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDateTimeConverter.cs @@ -2,6 +2,8 @@ using System.Globalization; using System.Linq; using System.Reflection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -15,15 +17,24 @@ namespace Volo.Abp.Json.Newtonsoft; public class AbpDateTimeConverter : DateTimeConverterBase, ITransientDependency { private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; + + public ILogger Logger { get; set; } + private readonly DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind; private readonly CultureInfo _culture = CultureInfo.InvariantCulture; private readonly IClock _clock; private readonly AbpJsonOptions _options; + private readonly ICurrentTimezoneProvider _currentTimezoneProvider; + private readonly ITimezoneProvider _timezoneProvider; private bool _skipDateTimeNormalization; - public AbpDateTimeConverter(IClock clock, IOptions options) + public AbpDateTimeConverter(IClock clock, IOptions options, ICurrentTimezoneProvider currentTimezoneProvider, ITimezoneProvider timezoneProvider) { + Logger = NullLogger.Instance; + _clock = clock; + _currentTimezoneProvider = currentTimezoneProvider; + _timezoneProvider = timezoneProvider; _options = options.Value; } @@ -41,19 +52,14 @@ public class AbpDateTimeConverter : DateTimeConverterBase, ITransientDependency public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { var nullable = Nullable.GetUnderlyingType(objectType) != null; - if (reader.TokenType == JsonToken.Null) + switch (reader.TokenType) { - if (!nullable) - { + case JsonToken.Null when !nullable: throw new JsonSerializationException($"Cannot convert null value to {objectType.FullName}."); - } - - return null; - } - - if (reader.TokenType == JsonToken.Date) - { - return Normalize(reader.Value!.To()); + case JsonToken.Null: + return null; + case JsonToken.Date: + return Normalize(reader.Value!.To()); } if (reader.TokenType != JsonToken.String) @@ -108,7 +114,7 @@ public class AbpDateTimeConverter : DateTimeConverterBase, ITransientDependency } } - static internal bool ShouldNormalize(MemberInfo member, JsonProperty property) + internal static bool ShouldNormalize(MemberInfo member, JsonProperty property) { if (property.PropertyType != typeof(DateTime) && property.PropertyType != typeof(DateTime?)) @@ -121,6 +127,23 @@ public class AbpDateTimeConverter : DateTimeConverterBase, ITransientDependency protected virtual DateTime Normalize(DateTime dateTime) { + if (dateTime.Kind != DateTimeKind.Unspecified || + !_clock.SupportsMultipleTimezone || + _currentTimezoneProvider.TimeZone.IsNullOrWhiteSpace()) + { + return _skipDateTimeNormalization ? dateTime : _clock.Normalize(dateTime); + } + + try + { + var timezoneInfo = _timezoneProvider.GetTimeZoneInfo(_currentTimezoneProvider.TimeZone); + dateTime = new DateTimeOffset(dateTime, timezoneInfo.GetUtcOffset(dateTime)).UtcDateTime; + } + catch + { + Logger.LogWarning("Could not convert DateTime with unspecified Kind using timezone '{TimeZone}'.", _currentTimezoneProvider.TimeZone); + } + return _skipDateTimeNormalization ? dateTime : _clock.Normalize(dateTime); diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs index 3feea8d299..d796c3183f 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs @@ -1,84 +1,43 @@ using System; -using System.Globalization; using System.Linq; using System.Text.Json; -using System.Text.Json.Serialization; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Timing; namespace Volo.Abp.Json.SystemTextJson.JsonConverters; -public class AbpDateTimeConverter : JsonConverter, ITransientDependency +public class AbpDateTimeConverter : AbpDateTimeConverterBase, ITransientDependency { - private readonly IClock _clock; - private readonly AbpJsonOptions _options; - private bool _skipDateTimeNormalization; - - public AbpDateTimeConverter(IClock clock, IOptions abpJsonOptions) + public AbpDateTimeConverter( + IClock clock, + IOptions abpJsonOptions, + ICurrentTimezoneProvider currentTimezoneProvider, + ITimezoneProvider timezoneProvider) + : base(clock, abpJsonOptions, currentTimezoneProvider, timezoneProvider) { - _clock = clock; - _options = abpJsonOptions.Value; } public virtual AbpDateTimeConverter SkipDateTimeNormalization() { - _skipDateTimeNormalization = true; + IsSkipDateTimeNormalization = true; return this; } public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (_options.InputDateTimeFormats.Any()) - { - if (reader.TokenType == JsonTokenType.String) - { - foreach (var format in _options.InputDateTimeFormats) - { - var s = reader.GetString(); - if (DateTime.TryParseExact(s, format, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var d1)) - { - return Normalize(d1); - } - } - } - else - { - throw new JsonException("Reader's TokenType is not String!"); - } - } - - if (reader.TryGetDateTime(out var d3)) - { - return Normalize(d3); - } - - var dateText = reader.GetString(); - if (!dateText.IsNullOrWhiteSpace()) + if (Options.InputDateTimeFormats.Any() && reader.TokenType != JsonTokenType.String) { - if (DateTime.TryParse(dateText, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var d4)) - { - return Normalize(d4); - } + throw new JsonException("Reader's TokenType is not String!"); } - throw new JsonException("Can't get datetime from the reader!"); + return TryReadDateTime(ref reader, out var result) + ? result + : throw new JsonException("Can't get datetime from the reader!"); } public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { - if (_options.OutputDateTimeFormat.IsNullOrWhiteSpace()) - { - writer.WriteStringValue(Normalize(value)); - } - else - { - writer.WriteStringValue(Normalize(value).ToString(_options.OutputDateTimeFormat, CultureInfo.CurrentUICulture)); - } - } - - protected virtual DateTime Normalize(DateTime dateTime) - { - return _skipDateTimeNormalization ? dateTime : _clock.Normalize(dateTime); + WriteDateTime(writer, value); } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverterBase.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverterBase.cs new file mode 100644 index 0000000000..ee39a66678 --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverterBase.cs @@ -0,0 +1,116 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using Volo.Abp.Timing; + +namespace Volo.Abp.Json.SystemTextJson.JsonConverters; + +public abstract class AbpDateTimeConverterBase : JsonConverter +{ + public ILogger> Logger { get; set; } + + protected IClock Clock { get; } + protected AbpJsonOptions Options { get; } + protected ICurrentTimezoneProvider CurrentTimezoneProvider { get; } + protected ITimezoneProvider TimezoneProvider { get; } + protected bool IsSkipDateTimeNormalization { get; set; } + + protected AbpDateTimeConverterBase( + IClock clock, + IOptions abpJsonOptions, + ICurrentTimezoneProvider currentTimezoneProvider, + ITimezoneProvider timezoneProvider) + { + Logger = NullLogger>.Instance; + + Clock = clock; + CurrentTimezoneProvider = currentTimezoneProvider; + TimezoneProvider = timezoneProvider; + Options = abpJsonOptions.Value; + } + + protected bool TryReadDateTime(ref Utf8JsonReader reader, out DateTime value) + { + value = default; + + if (Options.InputDateTimeFormats.Any()) + { + if (reader.TokenType != JsonTokenType.String) + { + return false; + } + + var s = reader.GetString(); + foreach (var format in Options.InputDateTimeFormats) + { + if (!DateTime.TryParseExact(s, format, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var d1)) + { + continue; + } + + value = Normalize(d1); + return true; + } + } + + if (reader.TryGetDateTime(out var d2)) + { + value = Normalize(d2); + return true; + } + + var dateText = reader.GetString(); + if (dateText.IsNullOrWhiteSpace()) + { + return false; + } + + if (!DateTime.TryParse(dateText, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var d3)) + { + return false; + } + + value = Normalize(d3); + return true; + + } + + protected void WriteDateTime(Utf8JsonWriter writer, DateTime value) + { + if (Options.OutputDateTimeFormat.IsNullOrWhiteSpace()) + { + writer.WriteStringValue(Normalize(value)); + } + else + { + writer.WriteStringValue(Normalize(value).ToString(Options.OutputDateTimeFormat, CultureInfo.CurrentUICulture)); + } + } + + protected virtual DateTime Normalize(DateTime dateTime) + { + if (dateTime.Kind != DateTimeKind.Unspecified || + !Clock.SupportsMultipleTimezone || + CurrentTimezoneProvider.TimeZone.IsNullOrWhiteSpace()) + { + return IsSkipDateTimeNormalization ? dateTime : Clock.Normalize(dateTime); + } + + try + { + var timezoneInfo = TimezoneProvider.GetTimeZoneInfo(CurrentTimezoneProvider.TimeZone); + dateTime = new DateTimeOffset(dateTime, timezoneInfo.GetUtcOffset(dateTime)).UtcDateTime; + } + catch + { + Logger.LogWarning("Could not convert DateTime with unspecified Kind using timezone '{TimeZone}'.", CurrentTimezoneProvider.TimeZone); + } + + return IsSkipDateTimeNormalization ? dateTime : Clock.Normalize(dateTime); + } +} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs index e73f39d097..e1125b5040 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs @@ -1,65 +1,39 @@ using System; -using System.Globalization; using System.Linq; using System.Text.Json; -using System.Text.Json.Serialization; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Timing; namespace Volo.Abp.Json.SystemTextJson.JsonConverters; -public class AbpNullableDateTimeConverter : JsonConverter, ITransientDependency +public class AbpNullableDateTimeConverter : AbpDateTimeConverterBase, ITransientDependency { - private readonly IClock _clock; - private readonly AbpJsonOptions _options; - private bool _skipDateTimeNormalization; - - public AbpNullableDateTimeConverter(IClock clock, IOptions abpJsonOptions) + public AbpNullableDateTimeConverter( + IClock clock, + IOptions abpJsonOptions, + ICurrentTimezoneProvider currentTimezoneProvider, + ITimezoneProvider timezoneProvider) + : base(clock, abpJsonOptions, currentTimezoneProvider, timezoneProvider) { - _clock = clock; - _options = abpJsonOptions.Value; } public virtual AbpNullableDateTimeConverter SkipDateTimeNormalization() { - _skipDateTimeNormalization = true; + IsSkipDateTimeNormalization = true; return this; } public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (_options.InputDateTimeFormats.Any()) - { - if (reader.TokenType == JsonTokenType.String) - { - foreach (var format in _options.InputDateTimeFormats) - { - var s = reader.GetString(); - if (DateTime.TryParseExact(s, format, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var d1)) - { - return Normalize(d1); - } - } - } - else - { - throw new JsonException("Reader's TokenType is not String!"); - } - } - - if (reader.TryGetDateTime(out var d2)) + if (Options.InputDateTimeFormats.Any() && reader.TokenType != JsonTokenType.String) { - return Normalize(d2); + throw new JsonException("Reader's TokenType is not String!"); } - var dateText = reader.GetString(); - if (!dateText.IsNullOrWhiteSpace()) + if (TryReadDateTime(ref reader, out var result)) { - if (DateTime.TryParse(dateText, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var d3)) - { - return Normalize(d3); - } + return result; } return null; @@ -70,22 +44,9 @@ public class AbpNullableDateTimeConverter : JsonConverter, ITransient if (value == null) { writer.WriteNullValue(); + return; } - else - { - if (_options.OutputDateTimeFormat.IsNullOrWhiteSpace()) - { - writer.WriteStringValue(Normalize(value.Value)); - } - else - { - writer.WriteStringValue(Normalize(value.Value).ToString(_options.OutputDateTimeFormat, CultureInfo.CurrentUICulture)); - } - } - } - protected virtual DateTime Normalize(DateTime dateTime) - { - return _skipDateTimeNormalization ? dateTime : _clock.Normalize(dateTime); + WriteDateTime(writer, value.Value); } } diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs index f6487a85b7..0b8d3d7f63 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs @@ -6,7 +6,7 @@ namespace Volo.Abp.Localization; public class LocalizationResourceDictionary : Dictionary { - private readonly Dictionary _resourcesByTypes = new(); + private readonly Dictionary _resourcesByTypes = []; public LocalizationResource Add(string? defaultCultureName = null) { 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 484d627cb4..d1a61afc66 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 @@ -9,7 +9,7 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb; public class MemoryDatabaseCollection : IMemoryDatabaseCollection where TEntity : class, IEntity { - private readonly Dictionary _dictionary = new Dictionary(); + private readonly Dictionary _dictionary = []; private readonly IMemoryDbSerializer _memoryDbSerializer; diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index 4beb71d188..e6b014b6f4 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -98,7 +98,7 @@ public class MongoDbRepository public IMongoDbBulkOperationProvider? BulkOperationProvider => LazyServiceProvider.LazyGetService(); - public IMongoDbRepositoryFilterer RepositoryFilterer => LazyServiceProvider.LazyGetService>()!; + public IEnumerable> RepositoryFilterers => LazyServiceProvider.LazyGetService>>()!; public MongoDbRepository(IMongoDbContextProvider dbContextProvider) : base(AbpMongoDbConsts.ProviderName) @@ -774,7 +774,10 @@ public class MongoDbRepository { if (typeof(TOtherEntity) == typeof(TEntity)) { - return base.ApplyDataFilters((TQueryable)RepositoryFilterer.FilterQueryable(query.As>())); + foreach (var filterer in RepositoryFilterers) + { + query = (TQueryable) filterer.FilterQueryable(query.As>()); + } } return base.ApplyDataFilters(query); } @@ -786,7 +789,7 @@ public class MongoDbRepository where TMongoDbContext : IAbpMongoDbContext where TEntity : class, IEntity { - public IMongoDbRepositoryFilterer RepositoryFiltererWithKey => LazyServiceProvider.LazyGetService>()!; + public IEnumerable> RepositoryFiltererWithKeys => LazyServiceProvider.LazyGetService>>()!; public MongoDbRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) @@ -844,19 +847,38 @@ public class MongoDbRepository { if (typeof(TOtherEntity) == typeof(TEntity)) { - return base.ApplyDataFilters((TQueryable)RepositoryFiltererWithKey.FilterQueryable(query.As>())); + foreach (var filterer in RepositoryFiltererWithKeys) + { + query = (TQueryable) filterer.FilterQueryable(query.As>()); + } } return base.ApplyDataFilters(query); } - protected async override Task> CreateEntityFilterAsync(TEntity entity, bool withConcurrencyStamp = false, string? concurrencyStamp = null) + protected override async Task> CreateEntityFilterAsync(TEntity entity, bool withConcurrencyStamp = false, string? concurrencyStamp = null) { - return await RepositoryFiltererWithKey.CreateEntityFilterAsync(entity, withConcurrencyStamp, concurrencyStamp); + FilterDefinition fieldDefinition = Builders.Filter.Empty; + foreach (var filterer in RepositoryFiltererWithKeys) + { + fieldDefinition = Builders.Filter.And( + fieldDefinition, + await filterer.CreateEntityFilterAsync(entity, withConcurrencyStamp, concurrencyStamp) + ); + } + return fieldDefinition; } - protected async override Task> CreateEntitiesFilterAsync(IEnumerable entities, bool withConcurrencyStamp = false) + protected override async Task> CreateEntitiesFilterAsync(IEnumerable entities, bool withConcurrencyStamp = false) { - return await RepositoryFiltererWithKey.CreateEntitiesFilterAsync(entities, withConcurrencyStamp); + FilterDefinition fieldDefinition = Builders.Filter.Empty; + foreach (var filterer in RepositoryFiltererWithKeys) + { + fieldDefinition = Builders.Filter.And( + fieldDefinition, + await filterer.CreateEntitiesFilterAsync(entities, withConcurrencyStamp) + ); + } + return fieldDefinition; } } diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs index fb9d6eaea1..fc233e5695 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs @@ -36,15 +36,17 @@ public class AbpMongoDbModule : AbpModule typeof(UnitOfWorkMongoDbContextProvider<>) ); - context.Services.TryAddTransient( - typeof(IMongoDbRepositoryFilterer<>), - typeof(MongoDbRepositoryFilterer<>) - ); + context.Services.TryAddEnumerable( + ServiceDescriptor.Transient( + typeof(IMongoDbRepositoryFilterer<>), + typeof(MongoDbRepositoryFilterer<>) + )); - context.Services.TryAddTransient( - typeof(IMongoDbRepositoryFilterer<,>), - typeof(MongoDbRepositoryFilterer<,>) - ); + context.Services.TryAddEnumerable( + ServiceDescriptor.Transient( + typeof(IMongoDbRepositoryFilterer<,>), + typeof(MongoDbRepositoryFilterer<,>) + )); context.Services.AddTransient( typeof(IMongoDbContextEventOutbox<>), diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoModelBuilder.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoModelBuilder.cs index d7ad79f7d0..a68f1584f8 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoModelBuilder.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoModelBuilder.cs @@ -17,7 +17,7 @@ public class MongoModelBuilder : IMongoModelBuilder { private readonly Dictionary _entityModelBuilders; - private static readonly object SyncObj = new object(); + private static readonly object SyncObj = new(); public MongoModelBuilder() { diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/AbpMultiTenancyOptions.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/AbpMultiTenancyOptions.cs index fac41e5f20..247eba34ee 100644 --- a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/AbpMultiTenancyOptions.cs +++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/AbpMultiTenancyOptions.cs @@ -4,7 +4,7 @@ public class AbpMultiTenancyOptions { /// /// A central point to enable/disable multi-tenancy. - /// Default: false. + /// Default: false. /// public bool IsEnabled { get; set; } @@ -13,4 +13,10 @@ public class AbpMultiTenancyOptions /// Default: . /// public MultiTenancyDatabaseStyle DatabaseStyle { get; set; } = MultiTenancyDatabaseStyle.Hybrid; + + /// + /// User sharing strategy between tenants. + /// Default: . + /// + public TenantUserSharingStrategy UserSharingStrategy { get; set; } = TenantUserSharingStrategy.Isolated; } diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/CreateTenantEto.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/CreateTenantEto.cs new file mode 100644 index 0000000000..c5d7c255df --- /dev/null +++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/CreateTenantEto.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus; + +namespace Volo.Abp.MultiTenancy; + +[Serializable] +[EventName("abp.multi_tenancy.create.tenant")] +public class CreateTenantEto : EtoBase +{ + public string Name { get; set; } = default!; + + public string AdminEmailAddress { get; set; } = default!; +} diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/Localization/de.json b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/Localization/de.json index cc4c857370..75e37d51aa 100644 --- a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/Localization/de.json +++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/Localization/de.json @@ -1,9 +1,9 @@ { "culture": "de", "texts": { - "TenantNotFoundMessage": "Mieter nicht gefunden!", + "TenantNotFoundMessage": "Mandant nicht gefunden!", "TenantNotFoundDetails": "Es gibt keinen Mandanten mit der Mandanten-ID oder dem Namen: {0}", - "TenantNotActiveMessage": "Mieter ist nicht aktiv!", + "TenantNotActiveMessage": "Mandant ist nicht aktiv!", "TenantNotActiveDetails": "Der Mandant ist mit der Mandanten-ID oder dem Namen nicht aktiv: {0}" } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantUserSharingStrategy.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantUserSharingStrategy.cs new file mode 100644 index 0000000000..0e413d7af2 --- /dev/null +++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantUserSharingStrategy.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.MultiTenancy; + +public enum TenantUserSharingStrategy +{ + Isolated = 0, + + Shared = 1 +} diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Roles/AbpRoleConsts.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Roles/AbpRoleConsts.cs new file mode 100644 index 0000000000..675699788d --- /dev/null +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Roles/AbpRoleConsts.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.Roles; + +public static class AbpRoleConsts +{ + /// + /// The static name of the admin role. + /// Default value: "admin" + /// + public const string AdminRoleName = "admin"; +} diff --git a/framework/src/Volo.Abp.Specifications/Volo/Abp/Specifications/ParameterRebinder.cs b/framework/src/Volo.Abp.Specifications/Volo/Abp/Specifications/ParameterRebinder.cs index d3553369b8..be0d8ab3e9 100644 --- a/framework/src/Volo.Abp.Specifications/Volo/Abp/Specifications/ParameterRebinder.cs +++ b/framework/src/Volo.Abp.Specifications/Volo/Abp/Specifications/ParameterRebinder.cs @@ -15,7 +15,7 @@ internal class ParameterRebinder : ExpressionVisitor internal ParameterRebinder(Dictionary map) { - _map = map ?? new Dictionary(); + _map = map ?? []; } internal static Expression ReplaceParameters(Dictionary map, diff --git a/framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerUIOptionsExtensions.cs b/framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerUIOptionsExtensions.cs new file mode 100644 index 0000000000..d307bc7e34 --- /dev/null +++ b/framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerUIOptionsExtensions.cs @@ -0,0 +1,47 @@ +using System; +using System.Text; +using System.Text.Json; +using JetBrains.Annotations; +using Swashbuckle.AspNetCore.SwaggerUI; +using Volo.Abp; + +namespace Microsoft.Extensions.DependencyInjection; + +public static class AbpSwaggerUIOptionsExtensions +{ + /// + /// Sets the abp.appPath used by the Swagger UI scripts. + /// + /// The Swagger UI options. + /// The application base path. + public static void AbpAppPath([NotNull] this SwaggerUIOptions options, [NotNull] string appPath) + { + Check.NotNull(options, nameof(options)); + Check.NotNull(appPath, nameof(appPath)); + + var normalizedAppPath = NormalizeAppPath(appPath); + options.HeadContent = BuildAppPathScript(normalizedAppPath, options.HeadContent ?? string.Empty); + } + + private static string NormalizeAppPath(string appPath) + { + return string.IsNullOrWhiteSpace(appPath) + ? "/" + : appPath.Trim().EnsureStartsWith('/').EnsureEndsWith('/'); + } + + private static string BuildAppPathScript(string normalizedAppPath, string headContent) + { + var builder = new StringBuilder(headContent); + if (builder.Length > 0) + { + builder.AppendLine(); + } + + builder.AppendLine(""); + return builder.ToString(); + } +} diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.js index 11cbe56803..da996ea6f5 100644 --- a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.js +++ b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.js @@ -2,11 +2,7 @@ var abp = abp || {}; (function () { /* Application paths *****************************************/ - - //Current application root path (including virtual directory if exists). - var baseElement = document.querySelector('base'); - var baseHref = baseElement ? baseElement.getAttribute('href') : null; - abp.appPath = baseHref || abp.appPath || '/'; + abp.appPath = abp.appPath || '/'; /* UTILS ***************************************************/ diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js index db054056d1..e961f6bc2d 100644 --- a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js +++ b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js @@ -11,7 +11,7 @@ var abp = abp || {}; var oidcSupportedScopes = configObject.oidcSupportedScopes || []; var oidcDiscoveryEndpoint = configObject.oidcDiscoveryEndpoint || []; var tenantPlaceHolders = ["{{tenantId}}", "{{tenantName}}", "{0}"] - abp.appPath = configObject.baseUrl || abp.appPath; + abp.appPath = abp.appPath || "/"; var requestInterceptor = configObject.requestInterceptor; var responseInterceptor = configObject.responseInterceptor; diff --git a/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/ChatClientAccessor_Tests.cs b/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/ChatClientAccessor_Tests.cs index 6cf352318a..5feaceb528 100644 --- a/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/ChatClientAccessor_Tests.cs +++ b/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/ChatClientAccessor_Tests.cs @@ -31,14 +31,24 @@ public class ChatClientAccessor_Tests : AbpIntegratedTest } [Fact] - public void Should_Resolve_ChatClientAccessor_For_NonConfigured_Workspace() + public void Should_Resolve_Default_ChatClient_From_NonConfigured_Workspace_Accessor() { // Arrange & Act var chatClientAccessor = GetRequiredService>(); // Assert chatClientAccessor.ShouldNotBeNull(); - chatClientAccessor.ChatClient.ShouldBeNull(); + chatClientAccessor.ChatClient.ShouldNotBeNull(); + } + + [Fact] + public void Should_Resolve_Default_ChatClient_For_NonConfigured_Workspace() + { + // Arrange & Act + var chatClient = GetRequiredService>(); + + // Assert + chatClient.ShouldNotBeNull(); } public class NonConfiguredWorkspace diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo.Abp.AspNetCore.Mvc.Client.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo.Abp.AspNetCore.Mvc.Client.Tests.csproj new file mode 100644 index 0000000000..d1190652a3 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo.Abp.AspNetCore.Mvc.Client.Tests.csproj @@ -0,0 +1,17 @@ + + + + + + net10.0 + + + + + + + + + + + diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientTestBase.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientTestBase.cs new file mode 100644 index 0000000000..96e82fe105 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientTestBase.cs @@ -0,0 +1,11 @@ +using Volo.Abp.Testing; + +namespace Volo.Abp.AspNetCore.Mvc.Client; + +public abstract class AbpAspNetCoreMvcClientTestBase : AbpIntegratedTest +{ + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientTestModule.cs new file mode 100644 index 0000000000..04e9f856a2 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientTestModule.cs @@ -0,0 +1,17 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; + +namespace Volo.Abp.AspNetCore.Mvc.Client; + +[DependsOn( + typeof(AbpAspNetCoreMvcClientModule), + typeof(AbpAutofacModule) +)] +public class AbpAspNetCoreMvcClientTestModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddHttpContextAccessor(); + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient_Tests.cs new file mode 100644 index 0000000000..6784c69954 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient_Tests.cs @@ -0,0 +1,105 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using NSubstitute; +using Shouldly; +using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; +using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies; +using Volo.Abp.Localization; +using Xunit; + +namespace Volo.Abp.AspNetCore.Mvc.Client; + +public class MvcCachedApplicationConfigurationClient_Tests : AbpAspNetCoreMvcClientTestBase +{ + private AbpApplicationConfigurationClientProxy _configProxy; + private AbpApplicationLocalizationClientProxy _localizationProxy; + + private readonly ICachedApplicationConfigurationClient _applicationConfigurationClient; + + public MvcCachedApplicationConfigurationClient_Tests() + { + _applicationConfigurationClient = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + _configProxy = Substitute.For(); + _localizationProxy = Substitute.For(); + + services.Replace(ServiceDescriptor.Transient(_ => _configProxy)); + services.Replace(ServiceDescriptor.Transient(_ => _localizationProxy)); + } + + [Fact] + public async Task Should_Use_CurrentUICulture_For_Localization_Request() + { + var cultureName = "en"; + + using (CultureHelper.Use(cultureName)) + { + var configTcs = new TaskCompletionSource(); + _configProxy.GetAsync(Arg.Any()).Returns(configTcs.Task); + + var expectedResources = new Dictionary + { + ["TestResource"] = new() + }; + + _localizationProxy.GetAsync(Arg.Any()).Returns(new ApplicationLocalizationDto { Resources = expectedResources }); + + var resultTask = _applicationConfigurationClient.GetAsync(); + + // Localization request should be fired before config completes (concurrent). + await _localizationProxy.Received(1).GetAsync(Arg.Is(x => x.CultureName == cultureName && x.OnlyDynamics == true)); + + // Now let config complete. + configTcs.SetResult(CreateConfigDto(cultureName)); + var result = await resultTask; + + result.Localization.Resources.ShouldBe(expectedResources); + + await _configProxy.Received(1).GetAsync(Arg.Is(x => x.IncludeLocalizationResources == false)); + } + } + + [Fact] + public async Task Should_Refetch_Localization_When_Culture_Differs() + { + var currentCulture = "en"; + var serverCulture = "tr"; + + using (CultureHelper.Use(currentCulture)) + { + _configProxy.GetAsync(Arg.Any()).Returns(CreateConfigDto(serverCulture)); + + var wrongResources = new Dictionary(); + var correctResources = new Dictionary + { + ["TestResource"] = new() + }; + + _localizationProxy.GetAsync(Arg.Is(x => x.CultureName == currentCulture)).Returns(new ApplicationLocalizationDto { Resources = wrongResources }); + _localizationProxy.GetAsync(Arg.Is(x => x.CultureName == serverCulture)).Returns(new ApplicationLocalizationDto { Resources = correctResources }); + + var result = await _applicationConfigurationClient.GetAsync(); + + result.Localization.Resources.ShouldBe(correctResources); + + await _localizationProxy.Received(1).GetAsync(Arg.Is(x => x.CultureName == currentCulture)); + await _localizationProxy.Received(1).GetAsync(Arg.Is(x => x.CultureName == serverCulture)); + } + } + + private static ApplicationConfigurationDto CreateConfigDto(string cultureName) + { + return new ApplicationConfigurationDto + { + Localization = + { + CurrentCulture = new CurrentCultureDto { Name = cultureName } + } + }; + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController_Tests.cs index 4ddd057889..5404555ffb 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController_Tests.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Shouldly; using Volo.Abp.Http.Modeling; @@ -23,4 +24,67 @@ public class AbpApiDefinitionController_Tests : AspNetCoreMvcTestBase model.ShouldNotBeNull(); model.Types.IsNullOrEmpty().ShouldBeFalse(); } + + [Fact] + public async Task Should_Have_Null_AllowAnonymous_For_Actions_Without_Authorization() + { + var model = await GetResponseAsObjectAsync("/api/abp/api-definition"); + + var peopleController = GetPeopleController(model); + var action = GetAction(peopleController, "GetPhones"); + + action.AllowAnonymous.ShouldBeNull(); + action.AuthorizeDatas.ShouldBeEmpty(); + } + + [Fact] + public async Task Should_Set_AllowAnonymous_True_For_AllowAnonymous_Actions() + { + var model = await GetResponseAsObjectAsync("/api/abp/api-definition"); + + var peopleController = GetPeopleController(model); + var action = GetAction(peopleController, "GetWithAllowAnonymous"); + + action.AllowAnonymous.ShouldBe(true); + action.AuthorizeDatas.ShouldBeEmpty(); + } + + [Fact] + public async Task Should_Set_AllowAnonymous_False_And_AuthorizeDatas_For_Authorize_Actions() + { + var model = await GetResponseAsObjectAsync("/api/abp/api-definition"); + + var peopleController = GetPeopleController(model); + var action = GetAction(peopleController, "GetWithAuthorized"); + + action.AllowAnonymous.ShouldBe(false); + action.AuthorizeDatas.ShouldNotBeEmpty(); + } + + [Fact] + public async Task Should_Contain_Policy_And_Roles_In_AuthorizeDatas() + { + var model = await GetResponseAsObjectAsync("/api/abp/api-definition"); + + var peopleController = GetPeopleController(model); + var action = GetAction(peopleController, "GetWithAuthorizePolicy"); + + action.AllowAnonymous.ShouldBe(false); + action.AuthorizeDatas.Count.ShouldBe(2); + action.AuthorizeDatas.ShouldContain(a => a.Policy == "TestPolicy" && a.Roles == "Admin"); + action.AuthorizeDatas.ShouldContain(a => a.Policy == "TestPolicy2" && a.Roles == "Manager"); + } + + private static ControllerApiDescriptionModel GetPeopleController(ApplicationApiDescriptionModel model) + { + return model.Modules.Values + .SelectMany(m => m.Controllers.Values) + .First(c => c.ControllerName == "People"); + } + + private static ActionApiDescriptionModel GetAction(ControllerApiDescriptionModel controller, string actionName) + { + return controller.Actions.Values + .First(a => a.Name == actionName + "Async" || a.Name == actionName); + } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController.cs index 6dfe3a7281..ceddc0083e 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController.cs @@ -13,12 +13,24 @@ public class ModelBindingController : AbpController return input.Kind.ToString().ToLower(); } + [HttpGet("DateTimeKind_WithResult")] + public string DateTimeKind_WithResult(DateTime input) + { + return input.Kind.ToString().ToLower() + "_" + input.ToString("O").ToLower(); + } + [HttpGet("NullableDateTimeKind")] public string NullableDateTimeKind(DateTime? input) { return input.Value.Kind.ToString().ToLower(); } + [HttpGet("NullableDateTimeKind_WithResult")] + public string NullableDateTimeKind_WithResult(DateTime? input) + { + return input.Value.Kind.ToString().ToLower() + "_" + input.Value.ToString("O").ToLower(); + } + [HttpGet("DisableDateTimeNormalizationDateTimeKind")] public string DisableDateTimeNormalizationDateTimeKind([DisableDateTimeNormalization] DateTime input) { @@ -40,6 +52,19 @@ public class ModelBindingController : AbpController input.InnerModel.Time4.Kind.ToString().ToLower(); } + [HttpGet("ComplexTypeDateTimeKind_WithResult")] + public string ComplexTypeDateTimeKind_WithResult(GetDateTimeKindModel input) + { + return input.Time1.Kind.ToString().ToLower() + "_" + + input.Time1.ToString("O").ToLower() + "_" + + input.Time2.Kind.ToString().ToLower() + "_" + + input.Time2.ToString("O").ToLower() + "_" + + input.Time3.Value.Kind.ToString().ToLower() + "_" + + input.Time3.Value.ToString("O").ToLower() + "_" + + input.InnerModel.Time4.Kind.ToString().ToLower() + "_" + + input.InnerModel.Time4.ToString("O").ToLower(); + } + //JSON input and output. [HttpPost("ComplexTypeDateTimeKind_JSON")] public string ComplexTypeDateTimeKind_JSON([FromBody] GetDateTimeKindModel input) @@ -50,6 +75,20 @@ public class ModelBindingController : AbpController input.InnerModel.Time4.Kind.ToString().ToLower(); } + //JSON input and output. + [HttpPost("ComplexTypeDateTimeKind_JSON_WithResult")] + public string ComplexTypeDateTimeKind_JSON_WithResult([FromBody] GetDateTimeKindModel input) + { + return input.Time1.Kind.ToString().ToLower() + "_" + + input.Time1.ToString("O").ToLower() + "_" + + input.Time2.Kind.ToString().ToLower() + "_" + + input.Time2.ToString("O").ToLower() + "_" + + input.Time3.Value.Kind.ToString().ToLower() + "_" + + input.Time3.Value.ToString("O").ToLower() + "_" + + input.InnerModel.Time4.Kind.ToString().ToLower() + "_" + + input.InnerModel.Time4.ToString("O").ToLower(); + } + [HttpPost("Guid_Json_Test")] public GuidJsonModel Guid_Json_Test([FromBody] GuidJsonModel input) { diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs index edfdc4ff73..2fd1130474 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs @@ -19,34 +19,79 @@ public abstract class ModelBindingController_Tests : AspNetCoreMvcTestBase [Fact] public async Task DateTimeKind_Test() { - var response = await Client.GetAsync("/api/model-Binding-test/DateTimeKind?input=2010-01-01T00:00:00Z"); + var response = await Client.GetAsync("/api/model-Binding-test/DateTimeKind?input=2020-01-01T00:00:00Z"); response.StatusCode.ShouldBe(HttpStatusCode.OK); var resultAsString = await response.Content.ReadAsStringAsync(); resultAsString.ShouldBe(Kind.ToString().ToLower()); } + [Fact] + public async Task DateTimeKind_WithTimezone_Test() + { + var response = await Client.GetAsync("/api/model-Binding-test/DateTimeKind_WithResult?input=2020-01-01T00:00:00&__timezone=Europe/Istanbul"); + + response.StatusCode.ShouldBe(HttpStatusCode.OK); + var resultAsString = await response.Content.ReadAsStringAsync(); + + var dateTime = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Unspecified); + switch (Kind) + { + case DateTimeKind.Utc: + dateTime = new DateTime(2019, 12, 31, 21, 0, 0, DateTimeKind.Utc); //Turkey is UTC+3 + break; + case DateTimeKind.Local: + dateTime = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Local); + break; + } + + resultAsString.ShouldBe($"{Kind.ToString().ToLower()}_{dateTime.ToString("O").ToLower()}"); + } + [Fact] public async Task NullableDateTimeKind_Test() { var response = - await Client.GetAsync("/api/model-Binding-test/NullableDateTimeKind?input=2010-01-01T00:00:00Z"); + await Client.GetAsync("/api/model-Binding-test/NullableDateTimeKind?input=2020-01-01T00:00:00Z"); response.StatusCode.ShouldBe(HttpStatusCode.OK); var resultAsString = await response.Content.ReadAsStringAsync(); resultAsString.ShouldBe(Kind.ToString().ToLower()); } + [Fact] + public async Task NullableDateTimeKind_WithTimezone_Test() + { + var response = + await Client.GetAsync("/api/model-Binding-test/NullableDateTimeKind_WithResult?input=2020-01-01T00:00:00&__timezone=Europe/Istanbul"); + + response.StatusCode.ShouldBe(HttpStatusCode.OK); + var resultAsString = await response.Content.ReadAsStringAsync(); + + var dateTime = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Unspecified); + switch (Kind) + { + case DateTimeKind.Utc: + dateTime = new DateTime(2019, 12, 31, 21, 0, 0, DateTimeKind.Utc); //Turkey is UTC+3 + break; + case DateTimeKind.Local: + dateTime = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Local); + break; + } + + resultAsString.ShouldBe($"{Kind.ToString().ToLower()}_{dateTime.ToString("O").ToLower()}"); + } + [Fact] public async Task DisableDateTimeNormalizationDateTimeKind_Test() { var response = await Client.GetAsync( - "/api/model-Binding-test/DisableDateTimeNormalizationDateTimeKind?input=2010-01-01T00:00:00Z"); + "/api/model-Binding-test/DisableDateTimeNormalizationDateTimeKind?input=2020-01-01T00:00:00Z"); response.StatusCode.ShouldBe(HttpStatusCode.OK); var resultAsString = await response.Content.ReadAsStringAsync(); - //Time parameter(2010-01-01T00:00:00Z) with time zone information, so the default Kind is UTC + //Time parameter(2020-01-01T00:00:00Z) with time zone information, so the default Kind is UTC //https://docs.microsoft.com/en-us/aspnet/core/migration/31-to-50?view=aspnetcore-3.1&tabs=visual-studio#datetime-values-are-model-bound-as-utc-times resultAsString.ShouldBe(DateTimeKind.Utc.ToString().ToLower()); } @@ -56,11 +101,11 @@ public abstract class ModelBindingController_Tests : AspNetCoreMvcTestBase { var response = await Client.GetAsync( - "/api/model-Binding-test/DisableDateTimeNormalizationNullableDateTimeKind?input=2010-01-01T00:00:00Z"); + "/api/model-Binding-test/DisableDateTimeNormalizationNullableDateTimeKind?input=2020-01-01T00:00:00Z"); response.StatusCode.ShouldBe(HttpStatusCode.OK); var resultAsString = await response.Content.ReadAsStringAsync(); - //Time parameter(2010-01-01T00:00:00Z) with time zone information, so the default Kind is UTC + //Time parameter(2020-01-01T00:00:00Z) with time zone information, so the default Kind is UTC //https://docs.microsoft.com/en-us/aspnet/core/migration/31-to-50?view=aspnetcore-3.1&tabs=visual-studio#datetime-values-are-model-bound-as-utc-times resultAsString.ShouldBe(DateTimeKind.Utc.ToString().ToLower()); } @@ -69,14 +114,14 @@ public abstract class ModelBindingController_Tests : AspNetCoreMvcTestBase public async Task ComplexTypeDateTimeKind_Test() { var response = await Client.GetAsync("/api/model-Binding-test/ComplexTypeDateTimeKind?" + - "Time1=2010-01-01T00:00:00Z&" + - "Time2=2010-01-01T00:00:00Z&" + - "Time3=2010-01-01T00:00:00Z&" + - "InnerModel.Time4=2010-01-01T00:00:00Z"); + "Time1=2020-01-01T00:00:00Z&" + + "Time2=2020-01-01T00:00:00Z&" + + "Time3=2020-01-01T00:00:00Z&" + + "InnerModel.Time4=2020-01-01T00:00:00Z"); response.StatusCode.ShouldBe(HttpStatusCode.OK); var resultAsString = await response.Content.ReadAsStringAsync(); - //Time parameter(2010-01-01T00:00:00Z) with time zone information, so the default Kind is UTC + //Time parameter(2020-01-01T00:00:00Z) with time zone information, so the default Kind is UTC //https://docs.microsoft.com/en-us/aspnet/core/migration/31-to-50?view=aspnetcore-3.1&tabs=visual-studio#datetime-values-are-model-bound-as-utc-times resultAsString.ShouldBe($"utc_{Kind.ToString().ToLower()}_{Kind.ToString().ToLower()}_utc"); } @@ -84,7 +129,7 @@ public abstract class ModelBindingController_Tests : AspNetCoreMvcTestBase [Fact] public async Task ComplexTypeDateTimeKind_JSON_Test() { - var time = DateTime.Parse("2010-01-01T00:00:00Z"); + var time = DateTime.Parse("2020-01-01T00:00:00Z"); var response = await Client.PostAsync("/api/model-Binding-test/ComplexTypeDateTimeKind_JSON", new StringContent(JsonSerializer.Serialize( new GetDateTimeKindModel @@ -104,6 +149,41 @@ public abstract class ModelBindingController_Tests : AspNetCoreMvcTestBase resultAsString.ShouldBe($"local_{Kind.ToString().ToLower()}_{Kind.ToString().ToLower()}_local"); } + [Fact] + public async Task ComplexTypeDateTimeKind_JSON_WithTimezone_Test() + { + var time = DateTime.Parse("2020-01-01T00:00:00"); + var response = await Client.PostAsync("/api/model-Binding-test/ComplexTypeDateTimeKind_JSON_WithResult?__timezone=Europe/Istanbul", + new StringContent(JsonSerializer.Serialize( + new GetDateTimeKindModel + { + Time1 = time, + Time2 = time, + Time3 = time, + InnerModel = new GetDateTimeKindModel.GetDateTimeKindInnerModel + { + Time4 = time + } + } + ), Encoding.UTF8, MimeTypes.Application.Json)); + + response.StatusCode.ShouldBe(HttpStatusCode.OK); + var resultAsString = await response.Content.ReadAsStringAsync(); + + var dateTime = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Unspecified); + switch (Kind) + { + case DateTimeKind.Utc: + dateTime = new DateTime(2019, 12, 31, 21, 0, 0, DateTimeKind.Utc); //Turkey is UTC+3 + break; + case DateTimeKind.Local: + dateTime = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Local); + break; + } + + resultAsString.ShouldBe($"unspecified_{time.ToString("O").ToLower()}_{Kind.ToString().ToLower()}_{dateTime.ToString("O").ToLower()}_{Kind.ToString().ToLower()}_{dateTime.ToString("O").ToLower()}_unspecified_{time.ToString("O").ToLower()}"); + } + [Fact] public async Task Guid_Json_Test() { diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs index 4e14dbc262..1ab79125e6 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs @@ -59,6 +59,9 @@ public class AbpAuditingTestModule : AbpModule "AppEntityWithValueObject", type => type == typeof(AppEntityWithValueObject) || type == typeof(AppEntityWithValueObjectAddress)) ); + + options.EntityHistorySelectors.Add(new NamedTypeSelector(nameof(AppEntityWithJsonProperty), type => type == typeof(AppEntityWithJsonProperty))); + options.EntityHistorySelectors.Add(new NamedTypeSelector(nameof(AppEntityWithComplexProperty), type => type == typeof(AppEntityWithComplexProperty))); }); context.Services.AddType(); diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithComplexProperty.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithComplexProperty.cs new file mode 100644 index 0000000000..be399318cd --- /dev/null +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithComplexProperty.cs @@ -0,0 +1,37 @@ +using System; +using Volo.Abp.Auditing; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Volo.Abp.Auditing.App.Entities; + +public class AppEntityWithComplexProperty : FullAuditedAggregateRoot +{ + public string Name { get; set; } + + public AppEntityContactInformation ContactInformation { get; set; } + + [DisableAuditing] + public AppEntityContactInformation DisabledContactInformation { get; set; } + + public AppEntityWithComplexProperty() + { + } + + public AppEntityWithComplexProperty(Guid id, string name) + : base(id) + { + Name = name; + } +} + +public class AppEntityContactInformation +{ + public string Street { get; set; } = string.Empty; + + public AppEntityContactLocation Location { get; set; } = new(); +} + +public class AppEntityContactLocation +{ + public string City { get; set; } = string.Empty; +} diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithJsonProperty.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithJsonProperty.cs new file mode 100644 index 0000000000..de07544629 --- /dev/null +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithJsonProperty.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Volo.Abp.Auditing.App.Entities; + +public class AppEntityWithJsonProperty : FullAuditedAggregateRoot +{ + public string Name { get; set; } + + public JsonPropertyObject Data { get; set; } + + public int Count { get; set; } + + public AppEntityWithJsonProperty() + { + } + + public AppEntityWithJsonProperty(Guid id, string name) : base(id) + { + Name = name; + } +} + +public class JsonPropertyObject : Dictionary +{ +} 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 91698ea5ec..a4d0564e90 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 @@ -30,6 +30,8 @@ public class AbpAuditingTestDbContext : AbpDbContext public DbSet AppEntityWithNavigations { get; set; } public DbSet AppEntityWithNavigationChildOneToMany { get; set; } public DbSet AppEntityWithNavigationsAndDisableAuditing { get; set; } + public DbSet EntitiesWithObjectProperty { get; set; } + public DbSet AppEntitiesWithComplexProperty { get; set; } public AbpAuditingTestDbContext(DbContextOptions options) : base(options) @@ -56,5 +58,47 @@ public class AbpAuditingTestDbContext : AbpDbContext b.HasMany(x => x.ManyToMany).WithMany(x => x.ManyToMany).UsingEntity(); }); + modelBuilder.Entity(b => + { + b.ConfigureByConvention(); + b.OwnsOne(x => x.Data, b2 => + { + b2.ToJson(); + + b2.Property("Name") + .HasConversion( + v => v.ToString(), + v => v + ); + + b2.Property("Value") + .HasConversion( + v => v.ToString(), + v => v + ); + }); + }); + + modelBuilder.Entity(b => + { + b.ConfigureByConvention(); + b.ComplexProperty(x => x.ContactInformation, cb => + { + cb.Property(x => x.Street).IsRequired(); + cb.ComplexProperty(x => x.Location, lb => + { + lb.Property(x => x.City).IsRequired(); + }); + }); + + b.ComplexProperty(x => x.DisabledContactInformation, cb => + { + cb.Property(x => x.Street).IsRequired(); + cb.ComplexProperty(x => x.Location, lb => + { + lb.Property(x => x.City).IsRequired(); + }); + }); + }); } } diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditingHelper_Tests.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditingHelper_Tests.cs new file mode 100644 index 0000000000..f1f82a4459 --- /dev/null +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditingHelper_Tests.cs @@ -0,0 +1,139 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using NSubstitute; +using Volo.Abp.DependencyInjection; +using Xunit; + +namespace Volo.Abp.Auditing; + +public class AuditingHelper_Tests : AbpAuditingTestBase +{ + private readonly IAuditingHelper _auditingHelper; + protected IAuditingStore AuditingStore; + + public AuditingHelper_Tests() + { + _auditingHelper = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + AuditingStore = Substitute.For(); + services.Replace(ServiceDescriptor.Singleton(AuditingStore)); + } + + [Fact] + public async Task Should_Write_AuditLog_Without_DisableAuditing() + { + var myAuditedObject = GetRequiredService(); + + await myAuditedObject.DoItAsync(); + + await AuditingStore.Received().SaveAsync(Arg.Any()); + } + + [Fact] + public async Task Should_Not_Write_AuditLog_With_DisableAuditing() + { + var myAuditedObject = GetRequiredService(); + + using (_auditingHelper.DisableAuditing()) + { + await myAuditedObject.DoItAsync(); + } + + await AuditingStore.DidNotReceive().SaveAsync(Arg.Any()); + } + + [Fact] + public async Task Should_Write_AuditLog_After_DisableAuditing_Scope_Disposed() + { + var myAuditedObject = GetRequiredService(); + + using (_auditingHelper.DisableAuditing()) + { + await myAuditedObject.DoItAsync(); + } + + AuditingStore.ClearReceivedCalls(); + + await myAuditedObject.DoItAsync(); + + await AuditingStore.Received().SaveAsync(Arg.Any()); + } + + [Fact] + public async Task Should_Not_Write_AuditLog_With_Nested_DisableAuditing() + { + var myAuditedObject = GetRequiredService(); + + using (_auditingHelper.DisableAuditing()) + { + await myAuditedObject.DoItAsync(); + + using (_auditingHelper.DisableAuditing()) + { + await myAuditedObject.DoItAsync(); + } + + await myAuditedObject.DoItAsync(); + } + + await AuditingStore.DidNotReceive().SaveAsync(Arg.Any()); + } + + [Fact] + public void Should_Return_True_When_Auditing_Is_Enabled() + { + Assert.True(_auditingHelper.IsAuditingEnabled()); + } + + [Fact] + public void Should_Return_False_When_Auditing_Is_Disabled() + { + using (_auditingHelper.DisableAuditing()) + { + Assert.False(_auditingHelper.IsAuditingEnabled()); + } + } + + [Fact] + public void Should_Return_True_After_DisableAuditing_Scope_Disposed() + { + using (_auditingHelper.DisableAuditing()) + { + Assert.False(_auditingHelper.IsAuditingEnabled()); + } + + Assert.True(_auditingHelper.IsAuditingEnabled()); + } + + [Fact] + public void Should_Return_False_With_Nested_DisableAuditing() + { + using (_auditingHelper.DisableAuditing()) + { + Assert.False(_auditingHelper.IsAuditingEnabled()); + + using (_auditingHelper.DisableAuditing()) + { + Assert.False(_auditingHelper.IsAuditingEnabled()); + } + + Assert.False(_auditingHelper.IsAuditingEnabled()); + } + } + + public interface IMyAuditedObject : ITransientDependency, IAuditingEnabled + { + } + + public class MyAuditedObject : IMyAuditedObject + { + public virtual Task DoItAsync() + { + return Task.CompletedTask; + } + } +} 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 a88cf70292..d9667f23e2 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 @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using NSubstitute; +using Shouldly; using Volo.Abp.Auditing.App.Entities; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; @@ -722,6 +723,265 @@ public class Auditing_Tests : AbpAuditingTestBase #pragma warning restore 4014 } + + [Fact] + public async Task Should_Write_AuditLog_For_Json_Property_Changes() + { + var entityId = Guid.NewGuid(); + var repository = ServiceProvider.GetRequiredService>(); + + using (var scope = _auditingManager.BeginScope()) + { + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = new AppEntityWithJsonProperty(entityId, "Test Entity") + { + Data = new JsonPropertyObject() + { + { "Name", "String Name" }, + { "Value", "String Value"} + }, + Count = 10 + }; + + await repository.InsertAsync(entity); + + await uow.CompleteAsync(); + await scope.SaveAsync(); + } + } + +#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(AppEntityWithJsonProperty).FullName && + x.EntityChanges[0].PropertyChanges.Count == 4 && + + x.EntityChanges[0].PropertyChanges[0].OriginalValue == null && + x.EntityChanges[0].PropertyChanges[0].NewValue == "10" && + x.EntityChanges[0].PropertyChanges[0].PropertyName == nameof(AppEntityWithJsonProperty.Count) && + x.EntityChanges[0].PropertyChanges[0].PropertyTypeFullName == typeof(int).FullName && + + x.EntityChanges[0].PropertyChanges[1].OriginalValue == null && + x.EntityChanges[0].PropertyChanges[1].NewValue == "\"Test Entity\"" && + x.EntityChanges[0].PropertyChanges[1].PropertyName == nameof(AppEntityWithJsonProperty.Name) && + x.EntityChanges[0].PropertyChanges[1].PropertyTypeFullName == typeof(string).FullName && + + x.EntityChanges[0].PropertyChanges[2].OriginalValue == null && + x.EntityChanges[0].PropertyChanges[2].NewValue == "\"String Name\"" && + x.EntityChanges[0].PropertyChanges[2].PropertyName == "Data.Name" && + x.EntityChanges[0].PropertyChanges[2].PropertyTypeFullName == typeof(string).FullName && + + x.EntityChanges[0].PropertyChanges[3].OriginalValue == null && + x.EntityChanges[0].PropertyChanges[3].NewValue == "\"String Value\"" && + x.EntityChanges[0].PropertyChanges[3].PropertyName == "Data.Value" && + x.EntityChanges[0].PropertyChanges[3].PropertyTypeFullName == typeof(string).FullName)); + AuditingStore.ClearReceivedCalls(); +#pragma warning restore 4014 + + + using (var scope = _auditingManager.BeginScope()) + { + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + + entity.Name = "Updated Test Entity"; + + entity.Data["Name"] = "Updated String Name"; + entity.Data["Value"] = "Updated String Value"; + + await repository.UpdateAsync(entity); + + await uow.CompleteAsync(); + await scope.SaveAsync(); + } + } + +#pragma warning disable 4014 + AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 1 && + x.EntityChanges[0].ChangeType == EntityChangeType.Updated && + x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithJsonProperty).FullName && + x.EntityChanges[0].PropertyChanges.Count == 3 && + + x.EntityChanges[0].PropertyChanges[0].OriginalValue == "\"Test Entity\"" && + x.EntityChanges[0].PropertyChanges[0].NewValue == "\"Updated Test Entity\"" && + x.EntityChanges[0].PropertyChanges[0].PropertyName == nameof(AppEntityWithJsonProperty.Name) && + x.EntityChanges[0].PropertyChanges[0].PropertyTypeFullName == typeof(string).FullName && + + x.EntityChanges[0].PropertyChanges[1].OriginalValue == "\"String Name\"" && + x.EntityChanges[0].PropertyChanges[1].NewValue == "\"Updated String Name\"" && + x.EntityChanges[0].PropertyChanges[1].PropertyName == "Data.Name" && + x.EntityChanges[0].PropertyChanges[1].PropertyTypeFullName == typeof(string).FullName && + + x.EntityChanges[0].PropertyChanges[2].OriginalValue == "\"String Value\"" && + x.EntityChanges[0].PropertyChanges[2].NewValue == "\"Updated String Value\"" && + x.EntityChanges[0].PropertyChanges[2].PropertyName == "Data.Value" && + x.EntityChanges[0].PropertyChanges[2].PropertyTypeFullName == typeof(string).FullName)); + AuditingStore.ClearReceivedCalls(); +#pragma warning restore 4014 + } + + [Fact] + public async Task Should_Write_AuditLog_For_Complex_Property_Changes() + { + var entityId = Guid.NewGuid(); + var repository = ServiceProvider.GetRequiredService>(); + + using (var scope = _auditingManager.BeginScope()) + { + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = new AppEntityWithComplexProperty(entityId, "Test Entity") + { + ContactInformation = new AppEntityContactInformation + { + Street = "First Street", + Location = new AppEntityContactLocation + { + City = "First City" + } + }, + DisabledContactInformation = new AppEntityContactInformation + { + Street = "Disabled Street", + Location = new AppEntityContactLocation + { + City = "Disabled City" + } + } + }; + + await repository.InsertAsync(entity); + + await uow.CompleteAsync(); + await scope.SaveAsync(); + } + } + +#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(AppEntityWithComplexProperty).FullName && + x.EntityChanges[0].PropertyChanges.Count == 3 && + x.EntityChanges[0].PropertyChanges.Any(pc => + pc.PropertyName == nameof(AppEntityWithComplexProperty.Name) && + pc.OriginalValue == null && + pc.NewValue == "\"Test Entity\"" && + pc.PropertyTypeFullName == typeof(string).FullName) && + x.EntityChanges[0].PropertyChanges.Any(pc => + pc.PropertyName == "ContactInformation.Street" && + pc.OriginalValue == null && + pc.NewValue == "\"First Street\"" && + pc.PropertyTypeFullName == typeof(string).FullName) && + x.EntityChanges[0].PropertyChanges.Any(pc => + pc.PropertyName == "ContactInformation.Location.City" && + pc.OriginalValue == null && + pc.NewValue == "\"First City\"" && + pc.PropertyTypeFullName == typeof(string).FullName) && + x.EntityChanges[0].PropertyChanges.All(pc => + !pc.PropertyName.StartsWith(nameof(AppEntityWithComplexProperty.DisabledContactInformation))))); + AuditingStore.ClearReceivedCalls(); +#pragma warning restore 4014 + + using (var scope = _auditingManager.BeginScope()) + { + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + + entity.ContactInformation.Location.City = "Updated City"; + entity.DisabledContactInformation.Street = "Updated Disabled Street"; + + await repository.UpdateAsync(entity); + + await uow.CompleteAsync(); + await scope.SaveAsync(); + } + } + +#pragma warning disable 4014 + AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 1 && + x.EntityChanges[0].ChangeType == EntityChangeType.Updated && + x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithComplexProperty).FullName && + x.EntityChanges[0].PropertyChanges.Count == 1 && + x.EntityChanges[0].PropertyChanges[0].PropertyName == "ContactInformation.Location.City" && + x.EntityChanges[0].PropertyChanges[0].OriginalValue == "\"First City\"" && + x.EntityChanges[0].PropertyChanges[0].NewValue == "\"Updated City\"" && + x.EntityChanges[0].PropertyChanges[0].PropertyTypeFullName == typeof(string).FullName)); + AuditingStore.ClearReceivedCalls(); +#pragma warning restore 4014 + } + + [Fact] + public async Task Should_Not_Update_Modification_Audit_Properties_When_Only_Disabled_Complex_Property_Changes() + { + var entityId = Guid.NewGuid(); + var repository = ServiceProvider.GetRequiredService>(); + + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = new AppEntityWithComplexProperty(entityId, "Test Entity") + { + ContactInformation = new AppEntityContactInformation + { + Street = "First Street", + Location = new AppEntityContactLocation + { + City = "First City" + } + }, + DisabledContactInformation = new AppEntityContactInformation + { + Street = "Disabled Street", + Location = new AppEntityContactLocation + { + City = "Disabled City" + } + } + }; + + await repository.InsertAsync(entity); + + await uow.CompleteAsync(); + } + + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + entity.Name = "Updated Test Entity"; + + await repository.UpdateAsync(entity); + await uow.CompleteAsync(); + } + + DateTime? lastModificationTime; + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + lastModificationTime = entity.LastModificationTime; + lastModificationTime.ShouldNotBeNull(); + await uow.CompleteAsync(); + } + + await Task.Delay(10); + + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + entity.DisabledContactInformation.Street = "Updated Disabled Street"; + + await repository.UpdateAsync(entity); + await uow.CompleteAsync(); + } + + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + entity.LastModificationTime.ShouldBe(lastModificationTime); + await uow.CompleteAsync(); + } + } } public class Auditing_DisableLogActionInfo_Tests : Auditing_Tests diff --git a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs index c76f5be9ea..25cc4c9784 100644 --- a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs +++ b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Shouldly; using Volo.Abp.Testing; @@ -751,6 +752,74 @@ public class DistributedCache_Tests : AbpIntegratedTest cacheValue[1].Value.Name.ShouldBe("jack"); } + [Fact] + public async Task GetOrAddManyAsync_Should_Return_Values_By_Key_With_Uow() + { + var key1 = "testkey"; + var key2 = "testkey2"; + var keys = new[] { key1, key2 }; + + using (GetRequiredService().Begin()) + { + var personCache = GetRequiredService>(); + + await personCache.SetAsync(key2, new PersonCacheItem("cached"), considerUow: true); + + var result = await personCache.GetOrAddManyAsync(keys, missingKeys => + { + missingKeys.ToArray().ShouldBe(new[] { key1 }); + return Task.FromResult(new List> + { + new(key1, new PersonCacheItem("factory")) + }); + }, considerUow: true); + + result.Length.ShouldBe(2); + result[0].Key.ShouldBe(key1); + result[0].Value.ShouldNotBeNull(); + result[0].Value.Name.ShouldBe("factory"); + result[1].Key.ShouldBe(key2); + result[1].Value.ShouldNotBeNull(); + result[1].Value.Name.ShouldBe("cached"); + } + } + + [Fact] + public async Task GetOrAddManyAsync_Should_Map_By_Key_Under_Concurrency() + { + var key1 = "testkey"; + var key2 = "testkey2"; + var keys = new[] { key1, key2 }; + + var personCache = GetRequiredService>(); + + async Task>> Factory(IEnumerable missingKeys) + { + await Task.Yield(); + + return missingKeys + .Reverse() + .Select(x => new KeyValuePair(x, new PersonCacheItem(x == key1 ? "v1" : "v2"))) + .ToList(); + } + + var task1 = personCache.GetOrAddManyAsync(keys, Factory); + var task2 = personCache.GetOrAddManyAsync(keys, Factory); + + var results = await Task.WhenAll(task1, task2); + + foreach (var result in results) + { + result.Length.ShouldBe(2); + + result[0].Key.ShouldBe(key1); + result[0].Value!.Name.ShouldBe("v1"); + + result[1].Key.ShouldBe(key2); + result[1].Value!.Name.ShouldBe("v2"); + } + } + [Fact] public async Task Cache_Should_Only_Available_In_Uow_For_GetOrAddManyAsync() { diff --git a/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer_Tests.cs b/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer_Tests.cs new file mode 100644 index 0000000000..a3c5cee0d6 --- /dev/null +++ b/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer_Tests.cs @@ -0,0 +1,87 @@ +using Shouldly; +using System.Collections.Generic; +using System.Reflection; +using Volo.Abp.Cli.ProjectBuilding.Files; +using Xunit; + +namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; + +public class SolutionRenamer_Tests +{ + [Theory] + [InlineData("Demo", "demo")] + [InlineData("MyCompany", "myCompany")] + [InlineData("Acme", "acme")] + [InlineData("ABC", "aBC")] + public void ToCamelCaseWithNamespace_Should_Handle_Single_Segment_Names(string input, string expected) + { + // Act + var result = InvokeToCamelCaseWithNamespace(input); + + // Assert + result.ShouldBe(expected); + } + + [Theory] + [InlineData("Demo.App", "demo.app")] + [InlineData("MyCompany.MyProject", "myCompany.myProject")] + [InlineData("Acme.Bookstore", "acme.bookstore")] + [InlineData("ABC.XYZ", "aBC.xYZ")] + public void ToCamelCaseWithNamespace_Should_Handle_Two_Segment_Names(string input, string expected) + { + // Act + var result = InvokeToCamelCaseWithNamespace(input); + + // Assert + result.ShouldBe(expected); + } + + [Theory] + [InlineData("Demo.App.QoL", "demo.app.qoL")] + [InlineData("MyCompany.MyProject.Module", "myCompany.myProject.module")] + [InlineData("Acme.Bookstore.Application", "acme.bookstore.application")] + [InlineData("A.B.C.D", "a.b.c.d")] + public void ToCamelCaseWithNamespace_Should_Handle_Multi_Segment_Names(string input, string expected) + { + // Act + var result = InvokeToCamelCaseWithNamespace(input); + + // Assert + result.ShouldBe(expected); + } + + [Theory] + [InlineData("", "")] + [InlineData("A", "a")] + [InlineData(".", ".")] + [InlineData("...", "...")] + public void ToCamelCaseWithNamespace_Should_Handle_Edge_Cases(string input, string expected) + { + // Act + var result = InvokeToCamelCaseWithNamespace(input); + + // Assert + result.ShouldBe(expected); + } + + [Fact] + public void ToCamelCaseWithNamespace_Should_Throw_On_Null_Input() + { + // Act & Assert + var exception = Should.Throw(() => InvokeToCamelCaseWithNamespace(null)); + exception.InnerException.ShouldBeOfType(); + } + + /// + /// Helper method to invoke the private static ToCamelCaseWithNamespace method using reflection + /// + private static string InvokeToCamelCaseWithNamespace(string input) + { + var type = typeof(SolutionRenamer); + var method = type.GetMethod("ToCamelCaseWithNamespace", BindingFlags.NonPublic | BindingFlags.Static); + + method.ShouldNotBeNull("ToCamelCaseWithNamespace method should exist"); + + return (string)method.Invoke(null, new object[] { input }); + } +} diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs index a54b1656bf..3fe863c046 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs @@ -6,6 +6,7 @@ using NSubstitute; using Shouldly; using Volo.Abp.Domain.Entities.Events; using Volo.Abp.TestApp; +using Volo.Abp.TestApp.Domain; using Volo.Abp.TestApp.Testing; using Xunit; @@ -85,6 +86,33 @@ public class Auditing_Tests : Auditing_Tests })); } + [Fact] + public async Task Should_Set_Modification_If_Complex_Properties_Changed() + { + var city = Guid.NewGuid().ToString(); + + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId); + douglas.ContactInformation ??= new PersonContactInformation(); + douglas.ContactInformation.Location.City = city; + })); + + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId); + + douglas.ShouldNotBeNull(); + douglas.ContactInformation.ShouldNotBeNull(); + douglas.ContactInformation!.Location.City.ShouldBe(city); + douglas.LastModificationTime.ShouldNotBeNull(); + douglas.LastModificationTime.Value.ShouldBeLessThanOrEqualTo(Clock.Now); + douglas.LastModifierId.ShouldBe(CurrentUserId); + })); + + EntityChangeEventHelper.Received().PublishEntityUpdatedEvent(Arg.Any()); + } + [Fact] public async Task Should_Not_Set_Modification_If_Properties_HasDisableAuditing_UpdateModificationProps() { @@ -106,6 +134,50 @@ public class Auditing_Tests : Auditing_Tests EntityChangeEventHelper.Received().PublishEntityUpdatedEvent(Arg.Any()); } + [Fact] + public async Task Should_Not_Set_Modification_If_ComplexProperties_HasDisableAuditing_UpdateModificationProps() + { + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId); + douglas.ContactInformation ??= new PersonContactInformation(); + douglas.ContactInformation.DisableAuditingUpdateModificationPropsProperty = Guid.NewGuid().ToString(); + })); + + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId); + + douglas.ShouldNotBeNull(); + douglas.LastModificationTime.ShouldBeNull(); + douglas.LastModifierId.ShouldBeNull(); + })); + + EntityChangeEventHelper.Received().PublishEntityUpdatedEvent(Arg.Any()); + } + + [Fact] + public async Task Should_Not_Set_Modification_If_Nested_ComplexProperties_HasDisableAuditing_UpdateModificationProps() + { + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId); + douglas.ContactInformation ??= new PersonContactInformation(); + douglas.ContactInformation.Location.DisableAuditingUpdateModificationPropsProperty = Guid.NewGuid().ToString(); + })); + + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId); + + douglas.ShouldNotBeNull(); + douglas.LastModificationTime.ShouldBeNull(); + douglas.LastModifierId.ShouldBeNull(); + })); + + EntityChangeEventHelper.Received().PublishEntityUpdatedEvent(Arg.Any()); + } + [Fact] public async Task Should_Not_PublishEntityEvent_If_Properties_HasDisableAuditing_PublishEntityEventProperty() { @@ -126,6 +198,48 @@ public class Auditing_Tests : Auditing_Tests EntityChangeEventHelper.DidNotReceive().PublishEntityUpdatedEvent(Arg.Any()); } + [Fact] + public async Task Should_Not_PublishEntityEvent_If_ComplexProperties_HasDisableAuditing_PublishEntityEventProperty() + { + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId); + douglas.ContactInformation ??= new PersonContactInformation(); + douglas.ContactInformation.DisableAuditingPublishEntityEventProperty = Guid.NewGuid().ToString(); + })); + + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId); + + douglas.ShouldNotBeNull(); + douglas.LastModificationTime.ShouldNotBeNull(); + })); + + EntityChangeEventHelper.DidNotReceive().PublishEntityUpdatedEvent(Arg.Any()); + } + + [Fact] + public async Task Should_Not_PublishEntityEvent_If_Nested_ComplexProperties_HasDisableAuditing_PublishEntityEventProperty() + { + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId); + douglas.ContactInformation ??= new PersonContactInformation(); + douglas.ContactInformation.Location.DisableAuditingPublishEntityEventProperty = Guid.NewGuid().ToString(); + })); + + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId); + + douglas.ShouldNotBeNull(); + douglas.LastModificationTime.ShouldNotBeNull(); + })); + + EntityChangeEventHelper.DidNotReceive().PublishEntityUpdatedEvent(Arg.Any()); + } + [Fact] public async Task Should_Set_Modification_And_PublishEntityEvent_If_Properties_HasDisableAuditing() @@ -146,4 +260,46 @@ public class Auditing_Tests : Auditing_Tests EntityChangeEventHelper.Received().PublishEntityUpdatedEvent(Arg.Any()); } + + [Fact] + public async Task Should_Set_Modification_And_PublishEntityEvent_If_ComplexProperties_HasDisableAuditing() + { + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId); + douglas.ContactInformation ??= new PersonContactInformation(); + douglas.ContactInformation.DisableAuditingProperty = Guid.NewGuid().ToString(); + })); + + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId); + + douglas.ShouldNotBeNull(); + douglas.LastModificationTime.ShouldNotBeNull(); + })); + + EntityChangeEventHelper.Received().PublishEntityUpdatedEvent(Arg.Any()); + } + + [Fact] + public async Task Should_Set_Modification_And_PublishEntityEvent_If_Nested_ComplexProperties_HasDisableAuditing() + { + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId); + douglas.ContactInformation ??= new PersonContactInformation(); + douglas.ContactInformation.Location.DisableAuditingProperty = Guid.NewGuid().ToString(); + })); + + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId); + + douglas.ShouldNotBeNull(); + douglas.LastModificationTime.ShouldNotBeNull(); + })); + + EntityChangeEventHelper.Received().PublishEntityUpdatedEvent(Arg.Any()); + } } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs index 4c6efa5a02..96f4b1a2e1 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs @@ -78,6 +78,14 @@ public class TestMigrationsDbContext : AbpDbContext b.Property(x => x.HasDefaultValue).HasDefaultValue(DateTime.Now); b.Property(x => x.TenantId).HasColumnName("Tenant_Id"); b.Property(x => x.IsDeleted).HasColumnName("Is_Deleted"); + b.ComplexProperty(x => x.ContactInformation, cb => + { + cb.Property(x => x.Street).IsRequired(); + cb.ComplexProperty(x => x.Location, locationBuilder => + { + locationBuilder.Property(x => x.City).IsRequired(); + }); + }); }); modelBuilder.Entity(b => diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs index a8e68dfca8..2b95877bed 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs @@ -92,6 +92,14 @@ public class TestAppDbContext : AbpDbContext, IThirdDbContext, b.Property(x => x.HasDefaultValue).HasDefaultValue(DateTime.Now); b.Property(x => x.TenantId).HasColumnName("Tenant_Id"); b.Property(x => x.IsDeleted).HasColumnName("Is_Deleted"); + b.ComplexProperty(x => x.ContactInformation, cb => + { + cb.Property(x => x.Street).IsRequired(); + cb.ComplexProperty(x => x.Location, locationBuilder => + { + locationBuilder.Property(x => x.City).IsRequired(); + }); + }); }); modelBuilder diff --git a/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager_Tests.cs b/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager_Tests.cs index e442d80953..bb527d2fcd 100644 --- a/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager_Tests.cs +++ b/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager_Tests.cs @@ -1,37 +1,38 @@ -using System; -using System.Collections.Generic; +using System; +using System.Collections.Frozen; +using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Shouldly; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; using Volo.Abp.AutoMapper; -using Volo.Abp.Localization; -using Volo.Abp.MultiLingualObjects.TestObjects; -using Volo.Abp.Testing; -using Xunit; - -namespace Volo.Abp.MultiLingualObjects; - -public class MultiLingualObjectManager_Tests : AbpIntegratedTest -{ - private readonly IMultiLingualObjectManager _multiLingualObjectManager; - private readonly MultiLingualBook _book; - private readonly List _books; - private readonly IMapperAccessor _mapperAccessor; - private readonly Dictionary _testTranslations = new() - { - ["ar"] = "C# التعمق في", - ["zh-Hans"] = "深入理解C#", - ["en"] = "C# in Depth" - }; +using Volo.Abp.Localization; +using Volo.Abp.MultiLingualObjects.TestObjects; +using Volo.Abp.Testing; +using Xunit; + +namespace Volo.Abp.MultiLingualObjects; + +public class MultiLingualObjectManager_Tests : AbpIntegratedTest +{ + private readonly IMultiLingualObjectManager _multiLingualObjectManager; + private readonly MultiLingualBook _book; + private readonly List _books; + private readonly IMapperAccessor _mapperAccessor; + private readonly FrozenDictionary _testTranslations = new Dictionary + { + ["ar"] = "C# التعمق في", + ["zh-Hans"] = "深入理解C#", + ["en"] = "C# in Depth" + }.ToFrozenDictionary(); - public MultiLingualObjectManager_Tests() - { + public MultiLingualObjectManager_Tests() + { _multiLingualObjectManager = ServiceProvider.GetRequiredService(); //Single Lookup - _book = GetTestBook("en", "zh-Hans"); - //Bulk lookup + _book = GetTestBook("en", "zh-Hans"); + //Bulk lookup _books = new List { //has no translations @@ -45,14 +46,14 @@ public class MultiLingualObjectManager_Tests : AbpIntegratedTest(); + _mapperAccessor = ServiceProvider.GetRequiredService(); } MultiLingualBook GetTestBook(params string[] included) { - var id = Guid.NewGuid(); - //Single book - var res = new MultiLingualBook(id, 100); - + var id = Guid.NewGuid(); + //Single book + var res = new MultiLingualBook(id, 100); + foreach (var language in included) { res.Translations.Add(new MultiLingualBookTranslation @@ -65,45 +66,45 @@ public class MultiLingualObjectManager_Tests : AbpIntegratedTest(_book); - translation.ShouldNotBeNull(); - translation.Name.ShouldBe(_testTranslations["en"]); - } - } - - [Fact] - public async Task GetTranslationFromListAsync() - { - using (CultureHelper.Use("en-us")) - { - var translation = await _multiLingualObjectManager.GetTranslationAsync(_book.Translations); - translation.ShouldNotBeNull(); - translation.Name.ShouldBe(_testTranslations["en"]); - } - } - - [Fact] - public async Task Should_Get_Specified_Language() - { - using (CultureHelper.Use("zh-Hans")) - { - var translation = await _multiLingualObjectManager.GetTranslationAsync(_book, culture: "en"); - translation.ShouldNotBeNull(); - translation.Name.ShouldBe(_testTranslations["en"]); - } + [Fact] + public async Task GetTranslationAsync() + { + using (CultureHelper.Use("en-us")) + { + var translation = await _multiLingualObjectManager.GetTranslationAsync(_book); + translation.ShouldNotBeNull(); + translation.Name.ShouldBe(_testTranslations["en"]); + } + } + + [Fact] + public async Task GetTranslationFromListAsync() + { + using (CultureHelper.Use("en-us")) + { + var translation = await _multiLingualObjectManager.GetTranslationAsync(_book.Translations); + translation.ShouldNotBeNull(); + translation.Name.ShouldBe(_testTranslations["en"]); + } + } + + [Fact] + public async Task Should_Get_Specified_Language() + { + using (CultureHelper.Use("zh-Hans")) + { + var translation = await _multiLingualObjectManager.GetTranslationAsync(_book, culture: "en"); + translation.ShouldNotBeNull(); + translation.Name.ShouldBe(_testTranslations["en"]); + } } - [Fact] - public async Task GetBulkTranslationsAsync() - { - using (CultureHelper.Use("en-us")) - { + [Fact] + public async Task GetBulkTranslationsAsync() + { + using (CultureHelper.Use("en-us")) + { var translations = await _multiLingualObjectManager.GetBulkTranslationsAsync(_books); foreach (var (entity, translation) in translations) { @@ -117,26 +118,26 @@ public class MultiLingualObjectManager_Tests : AbpIntegratedTest x.Translations)); foreach (var translation in translations) { translation?.Name.ShouldBe(_testTranslations["en"]); } - } - } - - [Fact] + } + } + + [Fact] public async Task TestBulkMapping() { - using (CultureHelper.Use("en-us")) + using (CultureHelper.Use("en-us")) { var translations = await _multiLingualObjectManager.GetBulkTranslationsAsync(_books); var translationsDict = translations.ToDictionary(x => x.entity.Id, x => x.translation); @@ -152,5 +153,5 @@ public class MultiLingualObjectManager_Tests : AbpIntegratedTest x.Language == "en")?.Name, m.Name); } } - } -} + } +} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/IPeopleAppService.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/IPeopleAppService.cs index 7aea19c141..a39216add5 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/IPeopleAppService.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/IPeopleAppService.cs @@ -20,6 +20,10 @@ public interface IPeopleAppService : ICrudAppService Task GetWithAuthorized(); + Task GetWithAllowAnonymous(); + + Task GetWithAuthorizePolicy(); + Task GetWithComplexType(GetWithComplexTypeInput input); Task DownloadAsync(); diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs index 6981eb1e57..a3920ec8ca 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs @@ -67,6 +67,19 @@ public class PeopleAppService : CrudAppService, IPeople return Task.CompletedTask; } + [AllowAnonymous] + public Task GetWithAllowAnonymous() + { + return Task.CompletedTask; + } + + [Authorize("TestPolicy", Roles = "Admin")] + [Authorize("TestPolicy2", Roles = "Manager")] + public Task GetWithAuthorizePolicy() + { + return Task.CompletedTask; + } + public Task GetWithComplexType(GetWithComplexTypeInput input) { return Task.FromResult(input); diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs index c05d0013d3..9da2357d70 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs @@ -32,6 +32,8 @@ public class Person : FullAuditedAggregateRoot, IMultiTenant, IHasEntityVe public virtual DateTime HasDefaultValue { get; set; } + public virtual PersonContactInformation? ContactInformation { get; set; } + public int EntityVersion { get; set; } [DisableAuditing(UpdateModificationProps = false)] @@ -84,3 +86,33 @@ public class Person : FullAuditedAggregateRoot, IMultiTenant, IHasEntityVe ); } } + +public class PersonContactInformation +{ + public string Street { get; set; } = string.Empty; + + public PersonContactLocation Location { get; set; } = new(); + + [DisableAuditing(UpdateModificationProps = false)] + public string? DisableAuditingUpdateModificationPropsProperty { get; set; } + + [DisableAuditing(PublishEntityEvent = false)] + public string? DisableAuditingPublishEntityEventProperty { get; set; } + + [DisableAuditing] + public string? DisableAuditingProperty { get; set; } +} + +public class PersonContactLocation +{ + public string City { get; set; } = string.Empty; + + [DisableAuditing(UpdateModificationProps = false)] + public string? DisableAuditingUpdateModificationPropsProperty { get; set; } + + [DisableAuditing(PublishEntityEvent = false)] + public string? DisableAuditingPublishEntityEventProperty { get; set; } + + [DisableAuditing] + public string? DisableAuditingProperty { get; set; } +} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs index f30774838e..438bf4b3b9 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs @@ -30,8 +30,15 @@ public class TestAppModule : AbpModule context.Services.AddHttpContextAccessor(); context.Services.Replace(ServiceDescriptor.Singleton()); - context.Services.AddEntityCache(); - context.Services.AddEntityCache(); + context.Services.AddEntityCache(new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(7) + }); + context.Services.AddEntityCache(new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(9) + }); + context.Services.AddEntityCache(); } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestDataBuilder.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestDataBuilder.cs index de2e95895c..d46762615c 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestDataBuilder.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestDataBuilder.cs @@ -76,6 +76,10 @@ public class TestDataBuilder : ITransientDependency private async Task AddPeople() { var douglas = new Person(UserDouglasId, "Douglas", 42, cityId: LondonCityId); + douglas.ContactInformation = new PersonContactInformation + { + Street = "Test Street" + }; douglas.Phones.Add(new Phone(douglas.Id, "123456789")); douglas.Phones.Add(new Phone(douglas.Id, "123456780", PhoneType.Home)); diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs index 5e321736d4..6ef8da9b7c 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs @@ -1,5 +1,7 @@ using System; +using System.Reflection; using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; using Shouldly; using Volo.Abp.Caching; using Volo.Abp.Domain.Entities; @@ -116,6 +118,49 @@ public abstract class EntityCache_Tests : TestAppTestBase, Guid>>(); + + var productOptions = GetDefaultCachingOptions(productCache); + productOptions.AbsoluteExpirationRelativeToNow.ShouldBe(TimeSpan.FromMinutes(2)); + productOptions.SlidingExpiration.ShouldBeNull(); + } + + [Fact] + public void EntityCache_Configured_Options_Should_Be_Applied() + { + var productCache = GetRequiredService, Guid>>(); + var productCacheItemCache = GetRequiredService, Guid>>(); + + var productOptions = GetDefaultCachingOptions(productCache); + productOptions.AbsoluteExpirationRelativeToNow.ShouldBe(TimeSpan.FromMinutes(7)); + productOptions.SlidingExpiration.ShouldBeNull(); + + var productCacheItemOptions = GetDefaultCachingOptions(productCacheItemCache); + productCacheItemOptions.AbsoluteExpirationRelativeToNow.ShouldBe(TimeSpan.FromMinutes(9)); + productCacheItemOptions.SlidingExpiration.ShouldBeNull(); + } + + private static DistributedCacheEntryOptions GetDefaultCachingOptions(object instance) + { + var internalCacheProperty = instance + .GetType() + .GetProperty("InternalCache", BindingFlags.Instance | BindingFlags.Public); + + if (internalCacheProperty != null) + { + instance = internalCacheProperty.GetValue(instance); + } + + var defaultOptionsField = instance + .GetType() + .GetField("DefaultCacheOptions", BindingFlags.Instance | BindingFlags.NonPublic); + + return (DistributedCacheEntryOptions)defaultOptionsField.GetValue(instance); + } } [Serializable] @@ -148,3 +193,14 @@ public class ProductCacheItem public decimal Price { get; set; } } + +[Serializable] +[CacheName("ProductCacheItem2")] +public class ProductCacheItem2 +{ + public Guid Id { get; set; } + + public string Name { get; set; } + + public decimal Price { get; set; } +} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChange_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChange_Tests.cs index adb80c89d7..538fa45778 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChange_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChange_Tests.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Domain.Repositories; using Volo.Abp.Modularity; using Volo.Abp.TestApp.Domain; +using Volo.Abp.Uow; using Xunit; namespace Volo.Abp.TestApp.Testing; @@ -100,6 +102,116 @@ public abstract class EntityChange_Tests : TestAppTestBase() + { + new AppEntityWithNavigationChildOneToMany(child1Id) + { + AppEntityWithNavigationId = entityId, + ChildName = "Child1" + } + } + }); + + var unitOfWorkManager = ServiceProvider.GetRequiredService(); + + string concurrencyStampAfterFirstSave = null; + + // Within a single UoW, remove Child1 (first SaveChanges), then add Child2 (second SaveChanges). + // Before the fix, the second SaveChanges would not detect the navigation change + // because the entity entries were removed after the first SaveChanges. + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + var originalConcurrencyStamp = entity.ConcurrencyStamp; + + // Remove Child1 + entity.OneToMany.Clear(); + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + await unitOfWorkManager.Current!.SaveChangesAsync(); + + // ConcurrencyStamp should have been updated after the first navigation change + entity.ConcurrencyStamp.ShouldNotBe(originalConcurrencyStamp); + concurrencyStampAfterFirstSave = entity.ConcurrencyStamp; + + // Add Child2 + entity.OneToMany.Add(new AppEntityWithNavigationChildOneToMany(Guid.NewGuid()) + { + AppEntityWithNavigationId = entityId, + ChildName = "Child2" + }); + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + + // After UoW completes, verify ConcurrencyStamp was updated again by the second SaveChanges + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.ConcurrencyStamp.ShouldNotBe(concurrencyStampAfterFirstSave); + entity.OneToMany.Count.ShouldBe(1); + entity.OneToMany[0].ChildName.ShouldBe("Child2"); + }); + } + + [Fact] + public async Task Should_Detect_Navigation_Changes_On_Second_SaveChanges_After_Remove_And_Add_ManyToMany() + { + var entityId = Guid.NewGuid(); + + await AppEntityWithNavigationsRepository.InsertAsync(new AppEntityWithNavigations(entityId, "TestEntity") + { + ManyToMany = new List() + { + new AppEntityWithNavigationChildManyToMany + { + ChildName = "ManyToManyChild1" + } + } + }); + + var unitOfWorkManager = ServiceProvider.GetRequiredService(); + + string concurrencyStampAfterFirstSave = null; + // Within a single UoW, remove ManyToManyChild1 (first SaveChanges), then add ManyToManyChild2 (second SaveChanges). + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + var originalConcurrencyStamp = entity.ConcurrencyStamp; + + // Remove ManyToManyChild1 + entity.ManyToMany.Clear(); + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + await unitOfWorkManager.Current!.SaveChangesAsync(); + + // ConcurrencyStamp should have been updated after the first navigation change + entity.ConcurrencyStamp.ShouldNotBe(originalConcurrencyStamp); + concurrencyStampAfterFirstSave = entity.ConcurrencyStamp; + + // Add ManyToManyChild2 + entity.ManyToMany.Add(new AppEntityWithNavigationChildManyToMany + { + ChildName = "ManyToManyChild2" + }); + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + + // After UoW completes, verify ConcurrencyStamp was updated again by the second SaveChanges + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.ConcurrencyStamp.ShouldNotBe(concurrencyStampAfterFirstSave); + entity.ManyToMany.Count.ShouldBe(1); + entity.ManyToMany[0].ChildName.ShouldBe("ManyToManyChild2"); + }); } } diff --git a/latest-versions.json b/latest-versions.json index 59f9c65cf3..448a2fc3d8 100644 --- a/latest-versions.json +++ b/latest-versions.json @@ -1,4 +1,31 @@ [ + { + "version": "10.1.0", + "releaseDate": "", + "type": "stable", + "message": "", + "leptonx": { + "version": "5.1.0" + } + }, + { + "version": "10.0.3", + "releaseDate": "", + "type": "stable", + "message": "", + "leptonx": { + "version": "5.0.3" + } + }, + { + "version": "10.0.2", + "releaseDate": "", + "type": "stable", + "message": "", + "leptonx": { + "version": "5.0.2" + } + }, { "version": "9.3.7", "releaseDate": "", diff --git a/lowcode/schema/definitions/command-interceptor-descriptor.schema.json b/lowcode/schema/definitions/command-interceptor-descriptor.schema.json new file mode 100644 index 0000000000..ad0d0b02bd --- /dev/null +++ b/lowcode/schema/definitions/command-interceptor-descriptor.schema.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "command-interceptor-descriptor.schema.json", + "title": "CommandInterceptorDescriptor", + "description": "Describes a command interceptor", + "type": "object", + "properties": { + "commandName": { + "type": "string", + "description": "Name of the command to intercept", + "enum": ["Create", "Update", "Delete"] + }, + "type": { + "$ref": "interceptor-type.schema.json" + }, + "javascript": { + "type": "string", + "description": "JavaScript code to execute" + } + }, + "required": ["commandName", "type", "javascript"], + "additionalProperties": false +} \ No newline at end of file diff --git a/lowcode/schema/definitions/endpoint-descriptor.schema.json b/lowcode/schema/definitions/endpoint-descriptor.schema.json new file mode 100644 index 0000000000..7837e47f69 --- /dev/null +++ b/lowcode/schema/definitions/endpoint-descriptor.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "urn:abp:lowcode:endpoint-descriptor", + "title": "Custom Endpoint Descriptor", + "description": "Defines a custom HTTP endpoint that executes JavaScript code", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Unique identifier for the endpoint" + }, + "route": { + "type": "string", + "description": "URL route pattern (e.g., '/api/custom/products/{id}')" + }, + "method": { + "type": "string", + "description": "HTTP method", + "enum": ["GET", "POST", "PUT", "DELETE", "PATCH"], + "default": "GET" + }, + "javascript": { + "type": "string", + "description": "JavaScript code to execute. Has access to context object with request, db, currentUser, emailSender." + }, + "requireAuthentication": { + "type": "boolean", + "description": "Whether authentication is required", + "default": true + }, + "requiredPermissions": { + "type": "array", + "description": "Permission names required to access the endpoint", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "description": "Optional description for documentation" + } + }, + "required": ["name", "route", "javascript"], + "additionalProperties": false +} diff --git a/lowcode/schema/definitions/entity-descriptor.schema.json b/lowcode/schema/definitions/entity-descriptor.schema.json new file mode 100644 index 0000000000..2023a043bc --- /dev/null +++ b/lowcode/schema/definitions/entity-descriptor.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "entity-descriptor.schema.json", + "title": "EntityDescriptor", + "description": "Describes an entity configuration", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Full name of the entity (e.g., 'Namespace.EntityName')", + "minLength": 1 + }, + "displayProperty": { + "type": "string", + "description": "The property to be used as the display property for the entity" + }, + "parent": { + "type": "string", + "description": "Full name of the parent entity (e.g., 'Namespace.EntityName')", + "minLength": 1 + }, + "ui": { + "$ref": "entity-ui-descriptor.schema.json" + }, + "properties": { + "type": "array", + "description": "List of property descriptors", + "items": { + "$ref": "entity-property-descriptor.schema.json" + } + }, + "interceptors": { + "type": "array", + "description": "List of command interceptors", + "items": { + "$ref": "command-interceptor-descriptor.schema.json" + } + } + }, + "required": ["name"], + "additionalProperties": false +} \ No newline at end of file diff --git a/lowcode/schema/definitions/entity-property-descriptor.schema.json b/lowcode/schema/definitions/entity-property-descriptor.schema.json new file mode 100644 index 0000000000..ceeeb9eb60 --- /dev/null +++ b/lowcode/schema/definitions/entity-property-descriptor.schema.json @@ -0,0 +1,58 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "entity-property-descriptor.schema.json", + "title": "EntityPropertyDescriptor", + "description": "Describes a property configuration", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the property", + "minLength": 1 + }, + "type": { + "$ref": "entity-property-type.schema.json" + }, + "enumType": { + "type": "string", + "description": "Name of a JSON-defined enum (or full type name for code enums)" + }, + "allowSetByClients": { + "type": "boolean", + "description": "Indicates whether clients are allowed to set this property" + }, + "serverOnly": { + "type": "boolean", + "description": "When true, this property is completely hidden from clients (API responses and UI definitions). Use for sensitive data like passwords." + }, + "isMappedToDbField": { + "type": "boolean", + "description": "Indicates whether the property is mapped to a database field" + }, + "isUnique": { + "type": "boolean", + "description": "Indicates whether the property value must be unique across all entities" + }, + "isRequired": { + "type": "boolean", + "description": "When true, the property is required (not nullable). Affects DB column (NOT NULL), UI validation, and backend validation." + }, + "ui": { + "$ref": "entity-property-ui-descriptor.schema.json" + }, + "foreignKey": { + "$ref": "foreign-key-descriptor.schema.json" + }, + "validators": { + "type": "array", + "description": "Array of validators to apply to this property", + "items": { + "$ref": "validator-descriptor.schema.json" + } + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/lowcode/schema/definitions/entity-property-type.schema.json b/lowcode/schema/definitions/entity-property-type.schema.json new file mode 100644 index 0000000000..5eb7defa6a --- /dev/null +++ b/lowcode/schema/definitions/entity-property-type.schema.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "entity-property-type.schema.json", + "title": "EntityPropertyType", + "description": "Data type of the property", + "type": "string", + "enum": [ + "string", + "String", + "int", + "Int", + "long", + "Long", + "decimal", + "Decimal", + "dateTime", + "DateTime", + "boolean", + "Boolean", + "guid", + "Guid", + "enum", + "Enum" + ] +} \ No newline at end of file diff --git a/lowcode/schema/definitions/entity-property-ui-descriptor.schema.json b/lowcode/schema/definitions/entity-property-ui-descriptor.schema.json new file mode 100644 index 0000000000..1a0ded7b76 --- /dev/null +++ b/lowcode/schema/definitions/entity-property-ui-descriptor.schema.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "entity-property-ui-descriptor.schema.json", + "title": "EntityPropertyUIDescriptor", + "description": "UI configuration for a property", + "type": "object", + "properties": { + "displayName": { + "type": "string", + "description": "Display name for the property in UI. Falls back to property name if not set." + }, + "isAvailableOnDataTable": { + "type": "boolean", + "description": "Whether the property is shown in the data table listing" + }, + "isAvailableOnDataTableFiltering": { + "type": "boolean", + "description": "Whether the property is available for filtering in the data table" + }, + "creationFormAvailability": { + "$ref": "entity-property-ui-form-availability.schema.json" + }, + "editingFormAvailability": { + "$ref": "entity-property-ui-form-availability.schema.json" + }, + "quickLookOrder": { + "type": "integer", + "description": "Order of the property in quick look views. Higher numbers appear first. Set to -1 to exclude from quick look. If no property has a value, first 5 properties by name are shown." + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/lowcode/schema/definitions/entity-property-ui-form-availability.schema.json b/lowcode/schema/definitions/entity-property-ui-form-availability.schema.json new file mode 100644 index 0000000000..dff4a5665c --- /dev/null +++ b/lowcode/schema/definitions/entity-property-ui-form-availability.schema.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "entity-property-ui-form-availability.schema.json", + "title": "EntityPropertyUIFormAvailability", + "description": "Availability of the property on forms", + "type": "string", + "enum": [ + "Available", + "available", + "Hidden", + "hidden", + "NotAvailable", + "notAvailable" + ] +} \ No newline at end of file diff --git a/lowcode/schema/definitions/entity-ui-descriptor.schema.json b/lowcode/schema/definitions/entity-ui-descriptor.schema.json new file mode 100644 index 0000000000..3525d6c38e --- /dev/null +++ b/lowcode/schema/definitions/entity-ui-descriptor.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "entity-ui-descriptor.schema.json", + "title": "EntityUIDescriptor", + "description": "UI configuration for the entity", + "type": "object", + "properties": { + "pageTitle": { + "type": "string", + "description": "Title to display on the entity's page" + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/lowcode/schema/definitions/enum-descriptor.schema.json b/lowcode/schema/definitions/enum-descriptor.schema.json new file mode 100644 index 0000000000..347f7e66ff --- /dev/null +++ b/lowcode/schema/definitions/enum-descriptor.schema.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "enum-descriptor.schema.json", + "title": "EnumDescriptor", + "description": "Describes an enum definition for use in entity properties", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Unique name for the enum", + "minLength": 1 + }, + "values": { + "type": "array", + "description": "List of enum values", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Display name of the enum value" + }, + "value": { + "type": "integer", + "description": "Integer value (auto-assigned if omitted)" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [ + "name", + "values" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/lowcode/schema/definitions/foreign-key-descriptor.schema.json b/lowcode/schema/definitions/foreign-key-descriptor.schema.json new file mode 100644 index 0000000000..27d0e81f03 --- /dev/null +++ b/lowcode/schema/definitions/foreign-key-descriptor.schema.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "foreign-key-descriptor.schema.json", + "title": "ForeignKeyDescriptor", + "description": "Describes a foreign key relationship", + "type": "object", + "properties": { + "entityName": { + "type": "string", + "description": "Full name of the related entity", + "minLength": 1 + }, + "displayPropertyName": { + "type": "string", + "description": "Property name to display from the related entity", + "minLength": 1 + }, + "access": { + "type": "string", + "description": "Access level for managing this relation from the referenced entity side. When set to 'view' or 'edit', the referenced entity can see/manage items that reference it.", + "enum": ["none", "view", "edit"], + "default": "none" + } + }, + "required": ["entityName"], + "additionalProperties": false +} \ No newline at end of file diff --git a/lowcode/schema/definitions/interceptor-type.schema.json b/lowcode/schema/definitions/interceptor-type.schema.json new file mode 100644 index 0000000000..435c26b434 --- /dev/null +++ b/lowcode/schema/definitions/interceptor-type.schema.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "interceptor-type.schema.json", + "title": "InterceptorType", + "description": "When the interceptor runs", + "type": "string", + "enum": [ + "Pre", + "pre", + "Post", + "post", + "Replace", + "replace" + ] +} \ No newline at end of file diff --git a/lowcode/schema/definitions/validator-descriptor.schema.json b/lowcode/schema/definitions/validator-descriptor.schema.json new file mode 100644 index 0000000000..7eeac0eba9 --- /dev/null +++ b/lowcode/schema/definitions/validator-descriptor.schema.json @@ -0,0 +1,69 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "validator-descriptor.schema.json", + "title": "ValidatorDescriptor", + "description": "A single validator in the validators array", + "type": "object", + "required": ["type"], + "properties": { + "type": { + "type": "string", + "description": "Type of validator", + "enum": [ + "required", + "minLength", + "maxLength", + "stringLength", + "min", + "minimum", + "max", + "maximum", + "range", + "pattern", + "regularExpression", + "email", + "emailAddress", + "phone", + "url", + "creditCard" + ] + }, + "message": { + "type": "string", + "description": "Custom error message for this validator" + }, + "length": { + "type": "integer", + "description": "Length value for minLength, maxLength validators", + "minimum": 0 + }, + "minimumLength": { + "type": "integer", + "description": "Minimum length for stringLength validator", + "minimum": 0 + }, + "maximumLength": { + "type": "integer", + "description": "Maximum length for stringLength validator", + "minimum": 0 + }, + "value": { + "type": "number", + "description": "Value for min/minimum, max/maximum validators" + }, + "minimum": { + "type": "number", + "description": "Minimum value for range validator" + }, + "maximum": { + "type": "number", + "description": "Maximum value for range validator" + }, + "pattern": { + "type": "string", + "description": "Regular expression pattern for pattern/regularExpression validators" + } + }, + "additionalProperties": true +} + diff --git a/lowcode/schema/model.schema.json b/lowcode/schema/model.schema.json new file mode 100644 index 0000000000..c958f126fe --- /dev/null +++ b/lowcode/schema/model.schema.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "model.schema.json", + "title": "ABP Low Code Model", + "description": "Schema for ABP Low Code model.json configuration file", + "type": "object", + "properties": { + "$schema": { + "type": "string", + "description": "Reference to the JSON schema" + }, + "enums": { + "type": "array", + "description": "List of enum definitions", + "items": { + "$ref": "definitions/enum-descriptor.schema.json" + } + }, + "entities": { + "type": "array", + "description": "List of entity descriptors", + "items": { + "$ref": "definitions/entity-descriptor.schema.json" + } + }, + "endpoints": { + "type": "array", + "description": "List of custom HTTP endpoints that execute JavaScript code", + "items": { + "$ref": "definitions/endpoint-descriptor.schema.json" + } + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json index 841cd18775..07309d4922 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json @@ -34,14 +34,14 @@ "DisplayName:PhoneNumber": "Telefon numarası", "PersonalSettings": "Kişisel ayarlar", "PersonalSettingsSaved": "Kişisel ayarlar kaydedildi", - "PersonalSettingsChangedConfirmationModalTitle": "Personal info changed", - "PersonalSettingsChangedConfirmationModalDescription": "If you want to apply these changes, you have to login. Do you want to log out?", + "PersonalSettingsChangedConfirmationModalTitle": "Kişisel bilgiler değişti", + "PersonalSettingsChangedConfirmationModalDescription": "Değişikliklerin yansıtılması için tekrar giriş yapmanız gerekmektedir. Şimdi oturumu kapatmak istiyor musunuz?", "PasswordChanged": "Şifre değiştirildi", "NewPasswordConfirmFailed": "Lütfen yeni şifreyi onaylayın.", "NewPasswordSameAsOld": "Yeni şifre eski şifre ile aynı olamaz.", - "Manage": "Manage", + "Manage": "Yönet", "MyAccount": "Hesabım", - "DisplayName:Abp.Account.IsSelfRegistrationEnabled": "self-registration etkin mi ?", + "DisplayName:Abp.Account.IsSelfRegistrationEnabled": "Kendi kendine kayıt etkin mi?", "Description:Abp.Account.IsSelfRegistrationEnabled": "Bir kullanıcının hesabı kendisi tarafından kaydedip kaydedememesidir.", "DisplayName:Abp.Account.EnableLocalLogin": "Yerel bir hesapla kimlik doğrulaması", "Description:Abp.Account.EnableLocalLogin": "Sunucunun, kullanıcıların yerel bir hesapla kimlik doğrulamasına izin verip vermeyeceğini belirtir.", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs index 9a01c44454..adb7d2334f 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs @@ -3,9 +3,9 @@ public class EntityChangeConsts { /// - /// Default value: 128 + /// Default value: 512 /// - public static int MaxEntityTypeFullNameLength { get; set; } = 128; + public static int MaxEntityTypeFullNameLength { get; set; } = 512; /// /// Default value: 128 diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs index 86f1b0588a..60fe5ce7df 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs @@ -18,7 +18,7 @@ public class EntityPropertyChangeConsts public static int MaxPropertyNameLength { get; set; } = 128; /// - /// Default value: 64 + /// Default value: 512 /// - public static int MaxPropertyTypeFullNameLength { get; set; } = 64; + public static int MaxPropertyTypeFullNameLength { get; set; } = 512; } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json index 334ada8c9a..38a291b077 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json @@ -24,7 +24,7 @@ "BrowserInfo": "Browser-Informationen", "Url": "URL", "UserName": "Benutzername", - "TenantImpersonator": "Mieter-Imitator", + "TenantImpersonator": "Mandanten-Imitator", "UserImpersonator": "Benutzer-Imitator", "UrlFilter": "URL-Filter", "Exceptions": "Ausnahmen", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json index 64f7ef591d..0f236d0393 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json @@ -24,7 +24,7 @@ "BrowserInfo": "Browserinformationen", "Url": "URL", "UserName": "Nutzername", - "TenantImpersonator": "Mieter-Imitator", + "TenantImpersonator": "Mandanten-Imitator", "UserImpersonator": "Benutzer-Imitator", "UrlFilter": "URL-Filter", "Exceptions": "Ausnahmen", diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json index e372a4405b..d787d89173 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json @@ -3,8 +3,8 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~10.1.0-rc.2", - "@abp/prismjs": "~10.1.0-rc.2", - "@abp/highlight.js": "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared": "~10.1.0", + "@abp/prismjs": "~10.1.0", + "@abp/highlight.js": "~10.1.0" } } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock index 07e9b7f188..ba0eed3a53 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock @@ -2,203 +2,203 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0-rc.2.tgz#e5056e4e159f5815e3cffecab5c46f3d7d4f79d7" - integrity sha512-bo56XzQZPYL/3ckWTTTSSUsSFSFJobvfE29cz13NIrZ/tBtWyQCAJn92wYHuY+6IezYUWb4ga3PkFeHRzR142A== - dependencies: - "@abp/aspnetcore.mvc.ui" "~10.1.0-rc.2" - "@abp/bootstrap" "~10.1.0-rc.2" - "@abp/bootstrap-datepicker" "~10.1.0-rc.2" - "@abp/bootstrap-daterangepicker" "~10.1.0-rc.2" - "@abp/datatables.net-bs5" "~10.1.0-rc.2" - "@abp/font-awesome" "~10.1.0-rc.2" - "@abp/jquery-form" "~10.1.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~10.1.0-rc.2" - "@abp/lodash" "~10.1.0-rc.2" - "@abp/luxon" "~10.1.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~10.1.0-rc.2" - "@abp/moment" "~10.1.0-rc.2" - "@abp/select2" "~10.1.0-rc.2" - "@abp/sweetalert2" "~10.1.0-rc.2" - "@abp/timeago" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0-rc.2.tgz#e25d3575d40bfcb3f809bd2d355671181ee5ff40" - integrity sha512-MOF86bVbi7N/nIla+361nsBrN4tiSka8xzpWcgqlLcCAl9ILG4rugbtafBAjN81taPma2peZM7egaOR4SDkTMw== +"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0.tgz#b89c5d38fdeceda9e421f9357842838be36dce49" + integrity sha512-9QyZ7lYr17thTKxq9WN/KVCxNyYurY5Ph9y3vFBkA3u+uOZcaxdw0T417vy0hJvAB7RGlkpLRTmZL7q5P9FzJA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.1.0" + "@abp/bootstrap" "~10.1.0" + "@abp/bootstrap-datepicker" "~10.1.0" + "@abp/bootstrap-daterangepicker" "~10.1.0" + "@abp/datatables.net-bs5" "~10.1.0" + "@abp/font-awesome" "~10.1.0" + "@abp/jquery-form" "~10.1.0" + "@abp/jquery-validation-unobtrusive" "~10.1.0" + "@abp/lodash" "~10.1.0" + "@abp/luxon" "~10.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.1.0" + "@abp/moment" "~10.1.0" + "@abp/select2" "~10.1.0" + "@abp/sweetalert2" "~10.1.0" + "@abp/timeago" "~10.1.0" + +"@abp/aspnetcore.mvc.ui@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0.tgz#79d76232aacb9c8e1762d903f75007d0418bf5a8" + integrity sha512-brVfaSUicZuSuwtizrEcMvtRjFsoAHr9i56HjJZb7bmElr+q5STiul3stRumly4IfoLkYqdy85hMk+B3G0bJDg== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0-rc.2.tgz#be80c6104ba53e18935fbf62ca2c1890f4b2fde4" - integrity sha512-BNcDYUSbZaLah4SfXm0efoqFTsOViVm6370k9L7vix/OGpIWwklJsr8y78lvdM5ANgNCfl0LPSq+seLJFc/OLA== +"@abp/bootstrap-datepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0.tgz#68270ed8cf8e0c23a77331ef2ba6ef2d1da3cefc" + integrity sha512-ahKKHlluo4U1Z238mBNzpL0YaErTPENLQDVLNZB1BnZcUTqz1j7WJHGZoy4j3CXZKt7mnFCRe1+vJMCcwP+DYA== dependencies: bootstrap-datepicker "^1.10.1" -"@abp/bootstrap-daterangepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0-rc.2.tgz#f189f7d070ebd97d9cfdcb99571cab2d6a198ab5" - integrity sha512-bV8J0MuiAFVLkr48JsB6aZU6aPoqw+Gyhq1szQ74bEwNQlRBPuF92WVA5FACaUBj8dMUzR9HDDAYQuxUzpKYKA== +"@abp/bootstrap-daterangepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0.tgz#69f7775eafe7c038c2684d3e990384c8f2966cff" + integrity sha512-mFMaH7GqPn7W5zzIMOOTl4f0at9Vx8da4ewvPU/IvngrTeezMRPC1tofHmiWDhHfZpzF5J9DDMCGul9Q4nOl5A== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0-rc.2.tgz#2300800a29ea09b91f5ed2e6177e5921fe7d2a0f" - integrity sha512-K+tDI9vz/Y9B/yu0i3AVpm4v3Odi44Q/yH5hAprL7f4pGxEOiqAFB/qzHAxG+7Oa7wjv5tPLv+Cz4DavBQjd8Q== +"@abp/bootstrap@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0.tgz#816436ab547fc46d4c00b1facbdd80e3f4f78af1" + integrity sha512-ioqQDOvjXIUWncmLJuTcLPTnlJ3xGxyKXC9veSTJWFd+5pZswK7/QIlAuTvIIujs/7Z13GLunUIMMjny7WFBMw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" bootstrap "^5.3.8" -"@abp/clipboard@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.1.0-rc.2.tgz#e99dbf190e3684e99c8e909bf38201c70e267502" - integrity sha512-kRS9pWc1jRgr4D4/EV9zdAy3rhhGBrcqk2as5+6Ih49npsEJY/cF5mYH7mj/ZYy8SHqtae/CR7bZsR+uCDKYrQ== +"@abp/clipboard@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.1.0.tgz#a59b14370b99fd7df447250b293fd7ac3f8c1a51" + integrity sha512-OulNwy9vhASO8TJ+m0ql6/iXNflE59oGUNAW+qzcaxaazre1mVPahPMBoLSVuOAGtAjLZAN4SWCOC5r3tLt9pA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" clipboard "^2.0.11" -"@abp/core@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0-rc.2.tgz#403687aff5a30788f7b7ca660abdfd85d89438aa" - integrity sha512-euuG2Hna/DT6/R1dGOjgp3vcehYtF+CcOkRj31oquYKaM5YWk4OaZ314DSpnjgs/xo8DuVc4eKFQwIxD9RK41w== +"@abp/core@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0.tgz#7cb21012deee5510a0774d982f85627d47b368f4" + integrity sha512-/N0K2NVdk5/OM+Q5JDnpC+0CD0mS4wpDhLO1SIQbMXSTFbplhfPw2SFm7+MvPA9pVx2L8TYAzXmS7CtAJxKvCg== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.1.0" -"@abp/datatables.net-bs5@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0-rc.2.tgz#a60650d1802b40751d30f8f6c56beb23fd66481b" - integrity sha512-IWwexNqbMpET54Fvm9LoPTJYf+4CoBbjFOvz3sL6CgO2feV5R5fKigjVU8zXKNh2W+RG8L6zEarfVxrr114TsA== +"@abp/datatables.net-bs5@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0.tgz#ea2a60c22bdcc80882662b9f55f198793f6ea556" + integrity sha512-dPe3bVW3Hfnm/X9Bw5k7TuEIsYYwFk1faC8kIxf2Spk+4Z9TdYFS2zGaHBYStE9iRtKmneNYMykG2O88mX3quA== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.1.0" datatables.net-bs5 "^2.3.4" -"@abp/datatables.net@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0-rc.2.tgz#9147f68bc6dbc4eb40a9ddf65c7859e788cdcac2" - integrity sha512-a9DJpwg14S4nVOiC4ipw0CQwEYWB602e2gCJiH7W1mxopbQb135RxwhtdTnW//eIONcxC9IrEuvcBEAUVt2B7Q== +"@abp/datatables.net@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0.tgz#7fe641883e6d1417c86a030481777a75c9a5a555" + integrity sha512-p9S/ZaJ4OXpihTOWIxsSQ0s3G4S+ScQLD+Q+w0NrWbUa7HTKg9tdqSh6VDhyW9KZ/iiLUO5jNzsAFXyUjjDQuw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" datatables.net "^2.3.4" -"@abp/font-awesome@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0-rc.2.tgz#364466cfe67e41e0c4d16b57d3923d10f66369f1" - integrity sha512-F1Jy8xoFV2aA+VN+NH1gtrG96/j9w7Picc+KLoCoIyNnJr/xJur11XkJyu5ln8KF4V7p/DY7QaQodWV/btOs8g== +"@abp/font-awesome@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0.tgz#79c5b7eb9a85467b0078b9f9bf201493fc3de358" + integrity sha512-dm4VRtZnvm5p8mYQys9KWLkQ+JdwPahQSan2DV1s5Rq4P96hk8p8VshZu7pI3iE0MS+rSZnXYvetZrqCdt1mOQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@fortawesome/fontawesome-free" "^7.0.1" -"@abp/highlight.js@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-10.1.0-rc.2.tgz#6ad0e1ef9e49f0f90eba9d899fd72b6c30a4f9f0" - integrity sha512-jAX4p+i3secAaI3waXoMr7yoH6G1nWvcjR5UVin168H7I4UySxbF799T89v5tK8gtfWgaTjEydFZRypSQU/dHg== +"@abp/highlight.js@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-10.1.0.tgz#b0a798ccdd71b437710978d1ced794c178de6b7c" + integrity sha512-kyDjTkLwkDEBY0jqpPf5KmZWmzJQPsPto4TidX9GG7U8e+biFK4MF/gtPUjjFs9POTQ585AKfk0U/xDjhr42qg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@highlightjs/cdn-assets" "~11.11.1" -"@abp/jquery-form@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0-rc.2.tgz#3857717d07569c22d4bbbe459238abeb816d606a" - integrity sha512-2D5WHVnfK9bhRces1tgPwOEoc7KCYKYiKHBOcqct+LTA7zoRjJv/PM8/JhFVl+grVIw1aSwO4tU3YfZ22Vxipg== +"@abp/jquery-form@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0.tgz#7c19605eb103519fea332d0f153cac185b7f2ebb" + integrity sha512-ddlapZqFVwpXU3uDi/RnQ6uSpseMxPAKE+/LgLF+SVyPzazNFognxPT3ztzqTk84P/gFleNgNjAfUlKrfyIfGw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0-rc.2.tgz#efd7b69a078a20c0bf405408dbdf52a7bf770b3b" - integrity sha512-tZ0MWgzBqp+SNfMxM0z2cGB21NiTHuVJyyQaXKE/ptuD5pc0uRkcqw/J2kWfiqsoVgChz27IB6h8/jqDafS4qg== +"@abp/jquery-validation-unobtrusive@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0.tgz#13aa462c4347d3459541a9a9ea19a60458805328" + integrity sha512-94smwn/W3d+gkX2UKH+/OiB7poKDP1ZK0DqWiiH4BGGmpRk9j3B+eJxPbL86dwNG4XT8upuX3ZOrUb6Fy2SA3A== dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0-rc.2.tgz#d39537a7356c51f9db2e66f6740cf6df86bd0442" - integrity sha512-LOkS0NKk4pLtLjPU0CCbwROyUg6EtJN8Z/it7QuKK1CIRfYYcAStgNnNm5geZP7CqECIkoiFfgWjI+L5Z9/Tfg== +"@abp/jquery-validation@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0.tgz#5389785f5ff359ecd6291889420d6c2f84e633aa" + integrity sha512-/X5smp0xpNqCM+BuLI9eEyMPQ0uF42hmEfBvCIfWWBhfp7uFfq7sS706QcGfXYqFdpprRYoUJGKDfSaHxPaJUA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0-rc.2.tgz#101a55f70d510978c8c05f5857d0e9d4965263f7" - integrity sha512-bQV1uFWGtwRYjNOsqJ8FM2004idX2Jj7YVL19YF1/PjyPUSMX+s8/IvJizBjyY5hPAiWBBhmV9g+IFWzxlDQoQ== +"@abp/jquery@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0.tgz#d8812a7d410ad959a1ed27696beb9b7885142684" + integrity sha512-cVF2hOP6GGp0N3VMBOFjEHuHFgXbDH8x0d7Agw4DN2ydFU8wYuj3m9u0HCc0aoBG6Zls90tMpTfM0RqDNFgCKA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" jquery "~3.7.1" -"@abp/lodash@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0-rc.2.tgz#d08c03f8d3d0fbaa3e71e603cbe5fb7f176933ef" - integrity sha512-KCnD1p2y52ZI+2ifpiFIUAiDPsKehnOD8HV5qKeObO6UCP97okif8IP+sQDmNQb8O33y/NKTyx/HcpwBbe/NYQ== +"@abp/lodash@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0.tgz#fdebe764d1142abfd3ecdeef56aa33746e31815b" + integrity sha512-r4WwpqLFFQi721edd8XF5wueAdqEvx75dmRlEuhZoIBA6RQ0yYjTRMNWjTOlIEzFDGj7XrisV5CSUQ9BhhuS+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" lodash "^4.17.21" -"@abp/luxon@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0-rc.2.tgz#ef8d2b323bac054fc9610e241e1b1763d229e065" - integrity sha512-qYFl6XO3g9mZiu0dtIczI7LRuYWwc+RkpbDzSmruXcRks3KA+ZZco2vhHNnlwtXcINl/TXtbW7Wc0MX+8IB1Kw== +"@abp/luxon@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0.tgz#c80cdb1a85e9cc824946dc0009df0daba384a4ca" + integrity sha512-slwiGSrevvWZrBhuy9sw7UP6akk2Ln9eAY3nxxo8xzE7C7uezcNk12dbKN4psdSAVpbDwuqC3GGrkmcFL+6sBQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" luxon "^3.7.2" -"@abp/malihu-custom-scrollbar-plugin@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0-rc.2.tgz#dfaf666442c7c122f7da72c83b9adf194d5b6ec8" - integrity sha512-PudMHmNQgZ6JZeaVt1ZoXLqO0UZXJzUYiBah2LDkC4EMLjnMJFINHBoEVVa4ooXH0yjFv+zsbN0vWZYJ8TBJIA== +"@abp/malihu-custom-scrollbar-plugin@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0.tgz#d257e83b7cc1af89a708e365eef7af0136ccebcf" + integrity sha512-+h8hoYUkjcYBdm/M3b8c3CeE5WNU8K6kQ5MwQXNaaGLCvwEmZHy0A6+U8yxtKv2eRRhAkAqOkQyWYRWA5w1XzQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0-rc.2.tgz#610a1592d13984aea51abbd13df8c5995a089149" - integrity sha512-ep8PnAXARw0t/wtGOVp/oiNhF3B0Bh6y2vRzKrcSoyXAQREGGm4fJdZVYZLGTfI4lFLTjebEgf4O7T9feUwJAw== +"@abp/moment@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0.tgz#5755e4e10a7302e2832b1a1ce571f20b27600303" + integrity sha512-faHV7vmPEjFUJTRNTTlmnpx0VZuyvQt4O98WBLAjPdcqpLfWazdS9Ro405St5liIkgvmAXWsrwVmZb0VKTLcNA== dependencies: moment "^2.30.1" -"@abp/prismjs@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.1.0-rc.2.tgz#8565bab503a16fc349f4b0fa2609ad412ff838be" - integrity sha512-SmZWMyJ3cJW+qj4CWJ7y2kD6PMx2zfZMA5X5jPunsytG4Eht4AVyIR38Y4QSpO62zZgkHyZlSTFOozBfhrlv9A== +"@abp/prismjs@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.1.0.tgz#632e06b47a9ac11d0131d06a270b97292266df47" + integrity sha512-iqXB3bgrlXDyfuFr23R2JtfN0Ij3ai81KkWM3oc3QikKaCwAHtiU0ZvshRlL9y3YfwjlNpYYFLE4en2xx1xThQ== dependencies: - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/core" "~10.1.0-rc.2" + "@abp/clipboard" "~10.1.0" + "@abp/core" "~10.1.0" prismjs "^1.30.0" -"@abp/select2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0-rc.2.tgz#40c5418d007fc36817eecbe6388d767e4e7ca887" - integrity sha512-Pq0wlpL01sWRLUg5um3JtBXIqi3mmbwPwvgxP8hFbQngAt9JXAK8geNRiTMrIZgtW/ycXtM1v6I4zuWOLOeAGg== +"@abp/select2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0.tgz#8b15954e462e65329b8eb481226170df6d55d36a" + integrity sha512-7+1GirZe4i/2/LR4jZgWhiN6lFHhClLtUmrdCjh7FeeuBvy5GGA417DybDihna/GzlcOVI4GHnn2fjEwcFqJiw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0-rc.2.tgz#d35858c69e10c6726b02cdfcea88dfc32385963f" - integrity sha512-s9VPRToohN45uzHcKCF5Mcj8FVjsXcXUb0U3tuaT/Y+u4adHB3fBxYiXJFM0sVsCJ81dFktxwka40Wm8Taz/zA== +"@abp/sweetalert2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0.tgz#6997cb7909671f9deddaea53f17ed054aab27cd3" + integrity sha512-vlkH+DkuQBvOqnDPqTtyZ5mHb+GfIR/QJBXI7yrS62ML+ZNqkg0vXftCrm4aAR2kPmvgYsbUOJcKJAmgydcOEQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" sweetalert2 "^11.23.0" -"@abp/timeago@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0-rc.2.tgz#98d630cc3843eee64dbcc34fb8ca5afbab034718" - integrity sha512-vJmk+otyXXJE2s2J8iYpLVaFuNAYnIUSOitmi7umYnL+k/UE2KQhBXU7FR0/OBY9mAZYd+shaiGIU1LMSaJ+Xg== +"@abp/timeago@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0.tgz#45c1e8b1451e31910e330053981a871787fe02f1" + integrity sha512-3RVMlBbOepa4WBTLthRmf2VddkNwsjE+FNnaSUaMQ2ZQaXnghnZc4xZ3f3oKraGcWMgqpz1IfrWWV1POKRsEXw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" timeago "^1.6.7" -"@abp/utils@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0-rc.2.tgz#86a980c6536b3b5ce185d406723b28be421864ac" - integrity sha512-Oz863VNA8fraQ81vTvqM0IqwiaseLwfFU5QNn6iOGOfn5wQrEkPwtZ0jMI+DGNtJgPzoKiq+iKc3K+SiuVgldg== +"@abp/utils@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0.tgz#ef7f6bf16abb34b77fa57c156b264154827bc0af" + integrity sha512-UDgbvDMbcQklNu+SlQPhkIcIfZoWsQjCCzihanLBiHc474BCOlcTsO6K/EatV9LwqG3zY0mYd0ExAWjH44G0rQ== dependencies: just-compare "^2.3.0" diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json index a3ecabd4c4..ed8ec8cb2a 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json @@ -3,8 +3,8 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0-rc.2", - "@abp/prismjs": "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0", + "@abp/prismjs": "~10.1.0" }, "devDependencies": {} } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock index f29a796639..cf3f814ae9 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock @@ -2,202 +2,202 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0-rc.2.tgz#599f5c47a417d1230fc17c0446a0229f920f7246" - integrity sha512-8F4nEK+VtgRRf8n+66HMbtCEaOMCW/OdbSEWRl9ahMNoj860oPIJ8P8Qn/2+LjtkPMdDAfCdEzyDzCd3igaFaA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0-rc.2.tgz#e5056e4e159f5815e3cffecab5c46f3d7d4f79d7" - integrity sha512-bo56XzQZPYL/3ckWTTTSSUsSFSFJobvfE29cz13NIrZ/tBtWyQCAJn92wYHuY+6IezYUWb4ga3PkFeHRzR142A== - dependencies: - "@abp/aspnetcore.mvc.ui" "~10.1.0-rc.2" - "@abp/bootstrap" "~10.1.0-rc.2" - "@abp/bootstrap-datepicker" "~10.1.0-rc.2" - "@abp/bootstrap-daterangepicker" "~10.1.0-rc.2" - "@abp/datatables.net-bs5" "~10.1.0-rc.2" - "@abp/font-awesome" "~10.1.0-rc.2" - "@abp/jquery-form" "~10.1.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~10.1.0-rc.2" - "@abp/lodash" "~10.1.0-rc.2" - "@abp/luxon" "~10.1.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~10.1.0-rc.2" - "@abp/moment" "~10.1.0-rc.2" - "@abp/select2" "~10.1.0-rc.2" - "@abp/sweetalert2" "~10.1.0-rc.2" - "@abp/timeago" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0-rc.2.tgz#e25d3575d40bfcb3f809bd2d355671181ee5ff40" - integrity sha512-MOF86bVbi7N/nIla+361nsBrN4tiSka8xzpWcgqlLcCAl9ILG4rugbtafBAjN81taPma2peZM7egaOR4SDkTMw== +"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0.tgz#94f68982ce8b67b6ac827f824aed3faad50e56e9" + integrity sha512-wqbEANW8CRZ+/7qGNprC828yNN17TsYtFxywL0B+EA2UfUtcTpzR/3ompZd/XcDm3N2NmS1n5Ao3WEn2NJlHgA== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0.tgz#b89c5d38fdeceda9e421f9357842838be36dce49" + integrity sha512-9QyZ7lYr17thTKxq9WN/KVCxNyYurY5Ph9y3vFBkA3u+uOZcaxdw0T417vy0hJvAB7RGlkpLRTmZL7q5P9FzJA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.1.0" + "@abp/bootstrap" "~10.1.0" + "@abp/bootstrap-datepicker" "~10.1.0" + "@abp/bootstrap-daterangepicker" "~10.1.0" + "@abp/datatables.net-bs5" "~10.1.0" + "@abp/font-awesome" "~10.1.0" + "@abp/jquery-form" "~10.1.0" + "@abp/jquery-validation-unobtrusive" "~10.1.0" + "@abp/lodash" "~10.1.0" + "@abp/luxon" "~10.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.1.0" + "@abp/moment" "~10.1.0" + "@abp/select2" "~10.1.0" + "@abp/sweetalert2" "~10.1.0" + "@abp/timeago" "~10.1.0" + +"@abp/aspnetcore.mvc.ui@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0.tgz#79d76232aacb9c8e1762d903f75007d0418bf5a8" + integrity sha512-brVfaSUicZuSuwtizrEcMvtRjFsoAHr9i56HjJZb7bmElr+q5STiul3stRumly4IfoLkYqdy85hMk+B3G0bJDg== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0-rc.2.tgz#be80c6104ba53e18935fbf62ca2c1890f4b2fde4" - integrity sha512-BNcDYUSbZaLah4SfXm0efoqFTsOViVm6370k9L7vix/OGpIWwklJsr8y78lvdM5ANgNCfl0LPSq+seLJFc/OLA== +"@abp/bootstrap-datepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0.tgz#68270ed8cf8e0c23a77331ef2ba6ef2d1da3cefc" + integrity sha512-ahKKHlluo4U1Z238mBNzpL0YaErTPENLQDVLNZB1BnZcUTqz1j7WJHGZoy4j3CXZKt7mnFCRe1+vJMCcwP+DYA== dependencies: bootstrap-datepicker "^1.10.1" -"@abp/bootstrap-daterangepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0-rc.2.tgz#f189f7d070ebd97d9cfdcb99571cab2d6a198ab5" - integrity sha512-bV8J0MuiAFVLkr48JsB6aZU6aPoqw+Gyhq1szQ74bEwNQlRBPuF92WVA5FACaUBj8dMUzR9HDDAYQuxUzpKYKA== +"@abp/bootstrap-daterangepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0.tgz#69f7775eafe7c038c2684d3e990384c8f2966cff" + integrity sha512-mFMaH7GqPn7W5zzIMOOTl4f0at9Vx8da4ewvPU/IvngrTeezMRPC1tofHmiWDhHfZpzF5J9DDMCGul9Q4nOl5A== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0-rc.2.tgz#2300800a29ea09b91f5ed2e6177e5921fe7d2a0f" - integrity sha512-K+tDI9vz/Y9B/yu0i3AVpm4v3Odi44Q/yH5hAprL7f4pGxEOiqAFB/qzHAxG+7Oa7wjv5tPLv+Cz4DavBQjd8Q== +"@abp/bootstrap@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0.tgz#816436ab547fc46d4c00b1facbdd80e3f4f78af1" + integrity sha512-ioqQDOvjXIUWncmLJuTcLPTnlJ3xGxyKXC9veSTJWFd+5pZswK7/QIlAuTvIIujs/7Z13GLunUIMMjny7WFBMw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" bootstrap "^5.3.8" -"@abp/clipboard@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.1.0-rc.2.tgz#e99dbf190e3684e99c8e909bf38201c70e267502" - integrity sha512-kRS9pWc1jRgr4D4/EV9zdAy3rhhGBrcqk2as5+6Ih49npsEJY/cF5mYH7mj/ZYy8SHqtae/CR7bZsR+uCDKYrQ== +"@abp/clipboard@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.1.0.tgz#a59b14370b99fd7df447250b293fd7ac3f8c1a51" + integrity sha512-OulNwy9vhASO8TJ+m0ql6/iXNflE59oGUNAW+qzcaxaazre1mVPahPMBoLSVuOAGtAjLZAN4SWCOC5r3tLt9pA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" clipboard "^2.0.11" -"@abp/core@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0-rc.2.tgz#403687aff5a30788f7b7ca660abdfd85d89438aa" - integrity sha512-euuG2Hna/DT6/R1dGOjgp3vcehYtF+CcOkRj31oquYKaM5YWk4OaZ314DSpnjgs/xo8DuVc4eKFQwIxD9RK41w== +"@abp/core@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0.tgz#7cb21012deee5510a0774d982f85627d47b368f4" + integrity sha512-/N0K2NVdk5/OM+Q5JDnpC+0CD0mS4wpDhLO1SIQbMXSTFbplhfPw2SFm7+MvPA9pVx2L8TYAzXmS7CtAJxKvCg== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.1.0" -"@abp/datatables.net-bs5@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0-rc.2.tgz#a60650d1802b40751d30f8f6c56beb23fd66481b" - integrity sha512-IWwexNqbMpET54Fvm9LoPTJYf+4CoBbjFOvz3sL6CgO2feV5R5fKigjVU8zXKNh2W+RG8L6zEarfVxrr114TsA== +"@abp/datatables.net-bs5@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0.tgz#ea2a60c22bdcc80882662b9f55f198793f6ea556" + integrity sha512-dPe3bVW3Hfnm/X9Bw5k7TuEIsYYwFk1faC8kIxf2Spk+4Z9TdYFS2zGaHBYStE9iRtKmneNYMykG2O88mX3quA== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.1.0" datatables.net-bs5 "^2.3.4" -"@abp/datatables.net@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0-rc.2.tgz#9147f68bc6dbc4eb40a9ddf65c7859e788cdcac2" - integrity sha512-a9DJpwg14S4nVOiC4ipw0CQwEYWB602e2gCJiH7W1mxopbQb135RxwhtdTnW//eIONcxC9IrEuvcBEAUVt2B7Q== +"@abp/datatables.net@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0.tgz#7fe641883e6d1417c86a030481777a75c9a5a555" + integrity sha512-p9S/ZaJ4OXpihTOWIxsSQ0s3G4S+ScQLD+Q+w0NrWbUa7HTKg9tdqSh6VDhyW9KZ/iiLUO5jNzsAFXyUjjDQuw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" datatables.net "^2.3.4" -"@abp/font-awesome@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0-rc.2.tgz#364466cfe67e41e0c4d16b57d3923d10f66369f1" - integrity sha512-F1Jy8xoFV2aA+VN+NH1gtrG96/j9w7Picc+KLoCoIyNnJr/xJur11XkJyu5ln8KF4V7p/DY7QaQodWV/btOs8g== +"@abp/font-awesome@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0.tgz#79c5b7eb9a85467b0078b9f9bf201493fc3de358" + integrity sha512-dm4VRtZnvm5p8mYQys9KWLkQ+JdwPahQSan2DV1s5Rq4P96hk8p8VshZu7pI3iE0MS+rSZnXYvetZrqCdt1mOQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@fortawesome/fontawesome-free" "^7.0.1" -"@abp/jquery-form@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0-rc.2.tgz#3857717d07569c22d4bbbe459238abeb816d606a" - integrity sha512-2D5WHVnfK9bhRces1tgPwOEoc7KCYKYiKHBOcqct+LTA7zoRjJv/PM8/JhFVl+grVIw1aSwO4tU3YfZ22Vxipg== +"@abp/jquery-form@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0.tgz#7c19605eb103519fea332d0f153cac185b7f2ebb" + integrity sha512-ddlapZqFVwpXU3uDi/RnQ6uSpseMxPAKE+/LgLF+SVyPzazNFognxPT3ztzqTk84P/gFleNgNjAfUlKrfyIfGw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0-rc.2.tgz#efd7b69a078a20c0bf405408dbdf52a7bf770b3b" - integrity sha512-tZ0MWgzBqp+SNfMxM0z2cGB21NiTHuVJyyQaXKE/ptuD5pc0uRkcqw/J2kWfiqsoVgChz27IB6h8/jqDafS4qg== +"@abp/jquery-validation-unobtrusive@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0.tgz#13aa462c4347d3459541a9a9ea19a60458805328" + integrity sha512-94smwn/W3d+gkX2UKH+/OiB7poKDP1ZK0DqWiiH4BGGmpRk9j3B+eJxPbL86dwNG4XT8upuX3ZOrUb6Fy2SA3A== dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0-rc.2.tgz#d39537a7356c51f9db2e66f6740cf6df86bd0442" - integrity sha512-LOkS0NKk4pLtLjPU0CCbwROyUg6EtJN8Z/it7QuKK1CIRfYYcAStgNnNm5geZP7CqECIkoiFfgWjI+L5Z9/Tfg== +"@abp/jquery-validation@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0.tgz#5389785f5ff359ecd6291889420d6c2f84e633aa" + integrity sha512-/X5smp0xpNqCM+BuLI9eEyMPQ0uF42hmEfBvCIfWWBhfp7uFfq7sS706QcGfXYqFdpprRYoUJGKDfSaHxPaJUA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0-rc.2.tgz#101a55f70d510978c8c05f5857d0e9d4965263f7" - integrity sha512-bQV1uFWGtwRYjNOsqJ8FM2004idX2Jj7YVL19YF1/PjyPUSMX+s8/IvJizBjyY5hPAiWBBhmV9g+IFWzxlDQoQ== +"@abp/jquery@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0.tgz#d8812a7d410ad959a1ed27696beb9b7885142684" + integrity sha512-cVF2hOP6GGp0N3VMBOFjEHuHFgXbDH8x0d7Agw4DN2ydFU8wYuj3m9u0HCc0aoBG6Zls90tMpTfM0RqDNFgCKA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" jquery "~3.7.1" -"@abp/lodash@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0-rc.2.tgz#d08c03f8d3d0fbaa3e71e603cbe5fb7f176933ef" - integrity sha512-KCnD1p2y52ZI+2ifpiFIUAiDPsKehnOD8HV5qKeObO6UCP97okif8IP+sQDmNQb8O33y/NKTyx/HcpwBbe/NYQ== +"@abp/lodash@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0.tgz#fdebe764d1142abfd3ecdeef56aa33746e31815b" + integrity sha512-r4WwpqLFFQi721edd8XF5wueAdqEvx75dmRlEuhZoIBA6RQ0yYjTRMNWjTOlIEzFDGj7XrisV5CSUQ9BhhuS+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" lodash "^4.17.21" -"@abp/luxon@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0-rc.2.tgz#ef8d2b323bac054fc9610e241e1b1763d229e065" - integrity sha512-qYFl6XO3g9mZiu0dtIczI7LRuYWwc+RkpbDzSmruXcRks3KA+ZZco2vhHNnlwtXcINl/TXtbW7Wc0MX+8IB1Kw== +"@abp/luxon@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0.tgz#c80cdb1a85e9cc824946dc0009df0daba384a4ca" + integrity sha512-slwiGSrevvWZrBhuy9sw7UP6akk2Ln9eAY3nxxo8xzE7C7uezcNk12dbKN4psdSAVpbDwuqC3GGrkmcFL+6sBQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" luxon "^3.7.2" -"@abp/malihu-custom-scrollbar-plugin@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0-rc.2.tgz#dfaf666442c7c122f7da72c83b9adf194d5b6ec8" - integrity sha512-PudMHmNQgZ6JZeaVt1ZoXLqO0UZXJzUYiBah2LDkC4EMLjnMJFINHBoEVVa4ooXH0yjFv+zsbN0vWZYJ8TBJIA== +"@abp/malihu-custom-scrollbar-plugin@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0.tgz#d257e83b7cc1af89a708e365eef7af0136ccebcf" + integrity sha512-+h8hoYUkjcYBdm/M3b8c3CeE5WNU8K6kQ5MwQXNaaGLCvwEmZHy0A6+U8yxtKv2eRRhAkAqOkQyWYRWA5w1XzQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0-rc.2.tgz#610a1592d13984aea51abbd13df8c5995a089149" - integrity sha512-ep8PnAXARw0t/wtGOVp/oiNhF3B0Bh6y2vRzKrcSoyXAQREGGm4fJdZVYZLGTfI4lFLTjebEgf4O7T9feUwJAw== +"@abp/moment@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0.tgz#5755e4e10a7302e2832b1a1ce571f20b27600303" + integrity sha512-faHV7vmPEjFUJTRNTTlmnpx0VZuyvQt4O98WBLAjPdcqpLfWazdS9Ro405St5liIkgvmAXWsrwVmZb0VKTLcNA== dependencies: moment "^2.30.1" -"@abp/prismjs@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.1.0-rc.2.tgz#8565bab503a16fc349f4b0fa2609ad412ff838be" - integrity sha512-SmZWMyJ3cJW+qj4CWJ7y2kD6PMx2zfZMA5X5jPunsytG4Eht4AVyIR38Y4QSpO62zZgkHyZlSTFOozBfhrlv9A== +"@abp/prismjs@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.1.0.tgz#632e06b47a9ac11d0131d06a270b97292266df47" + integrity sha512-iqXB3bgrlXDyfuFr23R2JtfN0Ij3ai81KkWM3oc3QikKaCwAHtiU0ZvshRlL9y3YfwjlNpYYFLE4en2xx1xThQ== dependencies: - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/core" "~10.1.0-rc.2" + "@abp/clipboard" "~10.1.0" + "@abp/core" "~10.1.0" prismjs "^1.30.0" -"@abp/select2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0-rc.2.tgz#40c5418d007fc36817eecbe6388d767e4e7ca887" - integrity sha512-Pq0wlpL01sWRLUg5um3JtBXIqi3mmbwPwvgxP8hFbQngAt9JXAK8geNRiTMrIZgtW/ycXtM1v6I4zuWOLOeAGg== +"@abp/select2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0.tgz#8b15954e462e65329b8eb481226170df6d55d36a" + integrity sha512-7+1GirZe4i/2/LR4jZgWhiN6lFHhClLtUmrdCjh7FeeuBvy5GGA417DybDihna/GzlcOVI4GHnn2fjEwcFqJiw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0-rc.2.tgz#d35858c69e10c6726b02cdfcea88dfc32385963f" - integrity sha512-s9VPRToohN45uzHcKCF5Mcj8FVjsXcXUb0U3tuaT/Y+u4adHB3fBxYiXJFM0sVsCJ81dFktxwka40Wm8Taz/zA== +"@abp/sweetalert2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0.tgz#6997cb7909671f9deddaea53f17ed054aab27cd3" + integrity sha512-vlkH+DkuQBvOqnDPqTtyZ5mHb+GfIR/QJBXI7yrS62ML+ZNqkg0vXftCrm4aAR2kPmvgYsbUOJcKJAmgydcOEQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" sweetalert2 "^11.23.0" -"@abp/timeago@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0-rc.2.tgz#98d630cc3843eee64dbcc34fb8ca5afbab034718" - integrity sha512-vJmk+otyXXJE2s2J8iYpLVaFuNAYnIUSOitmi7umYnL+k/UE2KQhBXU7FR0/OBY9mAZYd+shaiGIU1LMSaJ+Xg== +"@abp/timeago@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0.tgz#45c1e8b1451e31910e330053981a871787fe02f1" + integrity sha512-3RVMlBbOepa4WBTLthRmf2VddkNwsjE+FNnaSUaMQ2ZQaXnghnZc4xZ3f3oKraGcWMgqpz1IfrWWV1POKRsEXw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" timeago "^1.6.7" -"@abp/utils@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0-rc.2.tgz#86a980c6536b3b5ce185d406723b28be421864ac" - integrity sha512-Oz863VNA8fraQ81vTvqM0IqwiaseLwfFU5QNn6iOGOfn5wQrEkPwtZ0jMI+DGNtJgPzoKiq+iKc3K+SiuVgldg== +"@abp/utils@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0.tgz#ef7f6bf16abb34b77fa57c156b264154827bc0af" + integrity sha512-UDgbvDMbcQklNu+SlQPhkIcIfZoWsQjCCzihanLBiHc474BCOlcTsO6K/EatV9LwqG3zY0mYd0ExAWjH44G0rQ== dependencies: just-compare "^2.3.0" diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index 0f4e62f9cf..283e915f7e 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/package.json +++ b/modules/blogging/app/Volo.BloggingTestApp/package.json @@ -3,7 +3,7 @@ "name": "volo.blogtestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0-rc.2", - "@abp/blogging": "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0", + "@abp/blogging": "~10.1.0" } } diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 1f2cd9805d..edbedf007e 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,228 +2,228 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0-rc.2.tgz#599f5c47a417d1230fc17c0446a0229f920f7246" - integrity sha512-8F4nEK+VtgRRf8n+66HMbtCEaOMCW/OdbSEWRl9ahMNoj860oPIJ8P8Qn/2+LjtkPMdDAfCdEzyDzCd3igaFaA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0-rc.2.tgz#e5056e4e159f5815e3cffecab5c46f3d7d4f79d7" - integrity sha512-bo56XzQZPYL/3ckWTTTSSUsSFSFJobvfE29cz13NIrZ/tBtWyQCAJn92wYHuY+6IezYUWb4ga3PkFeHRzR142A== - dependencies: - "@abp/aspnetcore.mvc.ui" "~10.1.0-rc.2" - "@abp/bootstrap" "~10.1.0-rc.2" - "@abp/bootstrap-datepicker" "~10.1.0-rc.2" - "@abp/bootstrap-daterangepicker" "~10.1.0-rc.2" - "@abp/datatables.net-bs5" "~10.1.0-rc.2" - "@abp/font-awesome" "~10.1.0-rc.2" - "@abp/jquery-form" "~10.1.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~10.1.0-rc.2" - "@abp/lodash" "~10.1.0-rc.2" - "@abp/luxon" "~10.1.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~10.1.0-rc.2" - "@abp/moment" "~10.1.0-rc.2" - "@abp/select2" "~10.1.0-rc.2" - "@abp/sweetalert2" "~10.1.0-rc.2" - "@abp/timeago" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0-rc.2.tgz#e25d3575d40bfcb3f809bd2d355671181ee5ff40" - integrity sha512-MOF86bVbi7N/nIla+361nsBrN4tiSka8xzpWcgqlLcCAl9ILG4rugbtafBAjN81taPma2peZM7egaOR4SDkTMw== +"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0.tgz#94f68982ce8b67b6ac827f824aed3faad50e56e9" + integrity sha512-wqbEANW8CRZ+/7qGNprC828yNN17TsYtFxywL0B+EA2UfUtcTpzR/3ompZd/XcDm3N2NmS1n5Ao3WEn2NJlHgA== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0.tgz#b89c5d38fdeceda9e421f9357842838be36dce49" + integrity sha512-9QyZ7lYr17thTKxq9WN/KVCxNyYurY5Ph9y3vFBkA3u+uOZcaxdw0T417vy0hJvAB7RGlkpLRTmZL7q5P9FzJA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.1.0" + "@abp/bootstrap" "~10.1.0" + "@abp/bootstrap-datepicker" "~10.1.0" + "@abp/bootstrap-daterangepicker" "~10.1.0" + "@abp/datatables.net-bs5" "~10.1.0" + "@abp/font-awesome" "~10.1.0" + "@abp/jquery-form" "~10.1.0" + "@abp/jquery-validation-unobtrusive" "~10.1.0" + "@abp/lodash" "~10.1.0" + "@abp/luxon" "~10.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.1.0" + "@abp/moment" "~10.1.0" + "@abp/select2" "~10.1.0" + "@abp/sweetalert2" "~10.1.0" + "@abp/timeago" "~10.1.0" + +"@abp/aspnetcore.mvc.ui@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0.tgz#79d76232aacb9c8e1762d903f75007d0418bf5a8" + integrity sha512-brVfaSUicZuSuwtizrEcMvtRjFsoAHr9i56HjJZb7bmElr+q5STiul3stRumly4IfoLkYqdy85hMk+B3G0bJDg== dependencies: ansi-colors "^4.1.3" -"@abp/blogging@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-10.1.0-rc.2.tgz#f60d5fdfef5be11cbbb23ad7b4b246621828e5f9" - integrity sha512-GcI6JWeQKcHA0FaJZYTgx9l63jlSn1cqaWjBx6Y4KYIpy1c8vDKnve85jzsj7UOKgkMFX1c7mN2vwzH3NSr1Qg== +"@abp/blogging@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-10.1.0.tgz#681170a3d27e3726decf60a924e3d9375c77de6b" + integrity sha512-2Dox5XI0EoDigy6cV7GOOFZuN8wpEh5ADjiwMDTpOm0MlHuWUjLdXiHzIogtb/JowxL14SUiUEhendInJ6+eAQ== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" - "@abp/owl.carousel" "~10.1.0-rc.2" - "@abp/prismjs" "~10.1.0-rc.2" - "@abp/tui-editor" "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0" + "@abp/owl.carousel" "~10.1.0" + "@abp/prismjs" "~10.1.0" + "@abp/tui-editor" "~10.1.0" -"@abp/bootstrap-datepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0-rc.2.tgz#be80c6104ba53e18935fbf62ca2c1890f4b2fde4" - integrity sha512-BNcDYUSbZaLah4SfXm0efoqFTsOViVm6370k9L7vix/OGpIWwklJsr8y78lvdM5ANgNCfl0LPSq+seLJFc/OLA== +"@abp/bootstrap-datepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0.tgz#68270ed8cf8e0c23a77331ef2ba6ef2d1da3cefc" + integrity sha512-ahKKHlluo4U1Z238mBNzpL0YaErTPENLQDVLNZB1BnZcUTqz1j7WJHGZoy4j3CXZKt7mnFCRe1+vJMCcwP+DYA== dependencies: bootstrap-datepicker "^1.10.1" -"@abp/bootstrap-daterangepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0-rc.2.tgz#f189f7d070ebd97d9cfdcb99571cab2d6a198ab5" - integrity sha512-bV8J0MuiAFVLkr48JsB6aZU6aPoqw+Gyhq1szQ74bEwNQlRBPuF92WVA5FACaUBj8dMUzR9HDDAYQuxUzpKYKA== +"@abp/bootstrap-daterangepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0.tgz#69f7775eafe7c038c2684d3e990384c8f2966cff" + integrity sha512-mFMaH7GqPn7W5zzIMOOTl4f0at9Vx8da4ewvPU/IvngrTeezMRPC1tofHmiWDhHfZpzF5J9DDMCGul9Q4nOl5A== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0-rc.2.tgz#2300800a29ea09b91f5ed2e6177e5921fe7d2a0f" - integrity sha512-K+tDI9vz/Y9B/yu0i3AVpm4v3Odi44Q/yH5hAprL7f4pGxEOiqAFB/qzHAxG+7Oa7wjv5tPLv+Cz4DavBQjd8Q== +"@abp/bootstrap@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0.tgz#816436ab547fc46d4c00b1facbdd80e3f4f78af1" + integrity sha512-ioqQDOvjXIUWncmLJuTcLPTnlJ3xGxyKXC9veSTJWFd+5pZswK7/QIlAuTvIIujs/7Z13GLunUIMMjny7WFBMw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" bootstrap "^5.3.8" -"@abp/clipboard@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.1.0-rc.2.tgz#e99dbf190e3684e99c8e909bf38201c70e267502" - integrity sha512-kRS9pWc1jRgr4D4/EV9zdAy3rhhGBrcqk2as5+6Ih49npsEJY/cF5mYH7mj/ZYy8SHqtae/CR7bZsR+uCDKYrQ== +"@abp/clipboard@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.1.0.tgz#a59b14370b99fd7df447250b293fd7ac3f8c1a51" + integrity sha512-OulNwy9vhASO8TJ+m0ql6/iXNflE59oGUNAW+qzcaxaazre1mVPahPMBoLSVuOAGtAjLZAN4SWCOC5r3tLt9pA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" clipboard "^2.0.11" -"@abp/core@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0-rc.2.tgz#403687aff5a30788f7b7ca660abdfd85d89438aa" - integrity sha512-euuG2Hna/DT6/R1dGOjgp3vcehYtF+CcOkRj31oquYKaM5YWk4OaZ314DSpnjgs/xo8DuVc4eKFQwIxD9RK41w== +"@abp/core@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0.tgz#7cb21012deee5510a0774d982f85627d47b368f4" + integrity sha512-/N0K2NVdk5/OM+Q5JDnpC+0CD0mS4wpDhLO1SIQbMXSTFbplhfPw2SFm7+MvPA9pVx2L8TYAzXmS7CtAJxKvCg== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.1.0" -"@abp/datatables.net-bs5@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0-rc.2.tgz#a60650d1802b40751d30f8f6c56beb23fd66481b" - integrity sha512-IWwexNqbMpET54Fvm9LoPTJYf+4CoBbjFOvz3sL6CgO2feV5R5fKigjVU8zXKNh2W+RG8L6zEarfVxrr114TsA== +"@abp/datatables.net-bs5@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0.tgz#ea2a60c22bdcc80882662b9f55f198793f6ea556" + integrity sha512-dPe3bVW3Hfnm/X9Bw5k7TuEIsYYwFk1faC8kIxf2Spk+4Z9TdYFS2zGaHBYStE9iRtKmneNYMykG2O88mX3quA== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.1.0" datatables.net-bs5 "^2.3.4" -"@abp/datatables.net@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0-rc.2.tgz#9147f68bc6dbc4eb40a9ddf65c7859e788cdcac2" - integrity sha512-a9DJpwg14S4nVOiC4ipw0CQwEYWB602e2gCJiH7W1mxopbQb135RxwhtdTnW//eIONcxC9IrEuvcBEAUVt2B7Q== +"@abp/datatables.net@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0.tgz#7fe641883e6d1417c86a030481777a75c9a5a555" + integrity sha512-p9S/ZaJ4OXpihTOWIxsSQ0s3G4S+ScQLD+Q+w0NrWbUa7HTKg9tdqSh6VDhyW9KZ/iiLUO5jNzsAFXyUjjDQuw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" datatables.net "^2.3.4" -"@abp/font-awesome@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0-rc.2.tgz#364466cfe67e41e0c4d16b57d3923d10f66369f1" - integrity sha512-F1Jy8xoFV2aA+VN+NH1gtrG96/j9w7Picc+KLoCoIyNnJr/xJur11XkJyu5ln8KF4V7p/DY7QaQodWV/btOs8g== +"@abp/font-awesome@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0.tgz#79c5b7eb9a85467b0078b9f9bf201493fc3de358" + integrity sha512-dm4VRtZnvm5p8mYQys9KWLkQ+JdwPahQSan2DV1s5Rq4P96hk8p8VshZu7pI3iE0MS+rSZnXYvetZrqCdt1mOQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@fortawesome/fontawesome-free" "^7.0.1" -"@abp/jquery-form@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0-rc.2.tgz#3857717d07569c22d4bbbe459238abeb816d606a" - integrity sha512-2D5WHVnfK9bhRces1tgPwOEoc7KCYKYiKHBOcqct+LTA7zoRjJv/PM8/JhFVl+grVIw1aSwO4tU3YfZ22Vxipg== +"@abp/jquery-form@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0.tgz#7c19605eb103519fea332d0f153cac185b7f2ebb" + integrity sha512-ddlapZqFVwpXU3uDi/RnQ6uSpseMxPAKE+/LgLF+SVyPzazNFognxPT3ztzqTk84P/gFleNgNjAfUlKrfyIfGw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0-rc.2.tgz#efd7b69a078a20c0bf405408dbdf52a7bf770b3b" - integrity sha512-tZ0MWgzBqp+SNfMxM0z2cGB21NiTHuVJyyQaXKE/ptuD5pc0uRkcqw/J2kWfiqsoVgChz27IB6h8/jqDafS4qg== +"@abp/jquery-validation-unobtrusive@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0.tgz#13aa462c4347d3459541a9a9ea19a60458805328" + integrity sha512-94smwn/W3d+gkX2UKH+/OiB7poKDP1ZK0DqWiiH4BGGmpRk9j3B+eJxPbL86dwNG4XT8upuX3ZOrUb6Fy2SA3A== dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0-rc.2.tgz#d39537a7356c51f9db2e66f6740cf6df86bd0442" - integrity sha512-LOkS0NKk4pLtLjPU0CCbwROyUg6EtJN8Z/it7QuKK1CIRfYYcAStgNnNm5geZP7CqECIkoiFfgWjI+L5Z9/Tfg== +"@abp/jquery-validation@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0.tgz#5389785f5ff359ecd6291889420d6c2f84e633aa" + integrity sha512-/X5smp0xpNqCM+BuLI9eEyMPQ0uF42hmEfBvCIfWWBhfp7uFfq7sS706QcGfXYqFdpprRYoUJGKDfSaHxPaJUA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0-rc.2.tgz#101a55f70d510978c8c05f5857d0e9d4965263f7" - integrity sha512-bQV1uFWGtwRYjNOsqJ8FM2004idX2Jj7YVL19YF1/PjyPUSMX+s8/IvJizBjyY5hPAiWBBhmV9g+IFWzxlDQoQ== +"@abp/jquery@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0.tgz#d8812a7d410ad959a1ed27696beb9b7885142684" + integrity sha512-cVF2hOP6GGp0N3VMBOFjEHuHFgXbDH8x0d7Agw4DN2ydFU8wYuj3m9u0HCc0aoBG6Zls90tMpTfM0RqDNFgCKA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" jquery "~3.7.1" -"@abp/lodash@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0-rc.2.tgz#d08c03f8d3d0fbaa3e71e603cbe5fb7f176933ef" - integrity sha512-KCnD1p2y52ZI+2ifpiFIUAiDPsKehnOD8HV5qKeObO6UCP97okif8IP+sQDmNQb8O33y/NKTyx/HcpwBbe/NYQ== +"@abp/lodash@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0.tgz#fdebe764d1142abfd3ecdeef56aa33746e31815b" + integrity sha512-r4WwpqLFFQi721edd8XF5wueAdqEvx75dmRlEuhZoIBA6RQ0yYjTRMNWjTOlIEzFDGj7XrisV5CSUQ9BhhuS+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" lodash "^4.17.21" -"@abp/luxon@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0-rc.2.tgz#ef8d2b323bac054fc9610e241e1b1763d229e065" - integrity sha512-qYFl6XO3g9mZiu0dtIczI7LRuYWwc+RkpbDzSmruXcRks3KA+ZZco2vhHNnlwtXcINl/TXtbW7Wc0MX+8IB1Kw== +"@abp/luxon@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0.tgz#c80cdb1a85e9cc824946dc0009df0daba384a4ca" + integrity sha512-slwiGSrevvWZrBhuy9sw7UP6akk2Ln9eAY3nxxo8xzE7C7uezcNk12dbKN4psdSAVpbDwuqC3GGrkmcFL+6sBQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" luxon "^3.7.2" -"@abp/malihu-custom-scrollbar-plugin@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0-rc.2.tgz#dfaf666442c7c122f7da72c83b9adf194d5b6ec8" - integrity sha512-PudMHmNQgZ6JZeaVt1ZoXLqO0UZXJzUYiBah2LDkC4EMLjnMJFINHBoEVVa4ooXH0yjFv+zsbN0vWZYJ8TBJIA== +"@abp/malihu-custom-scrollbar-plugin@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0.tgz#d257e83b7cc1af89a708e365eef7af0136ccebcf" + integrity sha512-+h8hoYUkjcYBdm/M3b8c3CeE5WNU8K6kQ5MwQXNaaGLCvwEmZHy0A6+U8yxtKv2eRRhAkAqOkQyWYRWA5w1XzQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0-rc.2.tgz#610a1592d13984aea51abbd13df8c5995a089149" - integrity sha512-ep8PnAXARw0t/wtGOVp/oiNhF3B0Bh6y2vRzKrcSoyXAQREGGm4fJdZVYZLGTfI4lFLTjebEgf4O7T9feUwJAw== +"@abp/moment@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0.tgz#5755e4e10a7302e2832b1a1ce571f20b27600303" + integrity sha512-faHV7vmPEjFUJTRNTTlmnpx0VZuyvQt4O98WBLAjPdcqpLfWazdS9Ro405St5liIkgvmAXWsrwVmZb0VKTLcNA== dependencies: moment "^2.30.1" -"@abp/owl.carousel@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-10.1.0-rc.2.tgz#e7697b7c8954472758547688fa6724b219a5c99c" - integrity sha512-XKciT8HNWoZvlcMGRwOz9opld4BJsAQwMKsKRu1oD4/KMCnT7LelacFPVbj3CLhsLpU+2eq0M947fEI7hQiPOQ== +"@abp/owl.carousel@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-10.1.0.tgz#dd2138b9381626628fcb719c7f9ea9ea343268f7" + integrity sha512-apJpF1/tCca6Xw0j/9UOHhvXth7a3q1sWRQpVd2450MwSCFTjU11ODLnHYxDNe2uLvqwAvolANOYfBpWmWpYOQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" owl.carousel "^2.3.4" -"@abp/prismjs@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.1.0-rc.2.tgz#8565bab503a16fc349f4b0fa2609ad412ff838be" - integrity sha512-SmZWMyJ3cJW+qj4CWJ7y2kD6PMx2zfZMA5X5jPunsytG4Eht4AVyIR38Y4QSpO62zZgkHyZlSTFOozBfhrlv9A== +"@abp/prismjs@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.1.0.tgz#632e06b47a9ac11d0131d06a270b97292266df47" + integrity sha512-iqXB3bgrlXDyfuFr23R2JtfN0Ij3ai81KkWM3oc3QikKaCwAHtiU0ZvshRlL9y3YfwjlNpYYFLE4en2xx1xThQ== dependencies: - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/core" "~10.1.0-rc.2" + "@abp/clipboard" "~10.1.0" + "@abp/core" "~10.1.0" prismjs "^1.30.0" -"@abp/select2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0-rc.2.tgz#40c5418d007fc36817eecbe6388d767e4e7ca887" - integrity sha512-Pq0wlpL01sWRLUg5um3JtBXIqi3mmbwPwvgxP8hFbQngAt9JXAK8geNRiTMrIZgtW/ycXtM1v6I4zuWOLOeAGg== +"@abp/select2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0.tgz#8b15954e462e65329b8eb481226170df6d55d36a" + integrity sha512-7+1GirZe4i/2/LR4jZgWhiN6lFHhClLtUmrdCjh7FeeuBvy5GGA417DybDihna/GzlcOVI4GHnn2fjEwcFqJiw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0-rc.2.tgz#d35858c69e10c6726b02cdfcea88dfc32385963f" - integrity sha512-s9VPRToohN45uzHcKCF5Mcj8FVjsXcXUb0U3tuaT/Y+u4adHB3fBxYiXJFM0sVsCJ81dFktxwka40Wm8Taz/zA== +"@abp/sweetalert2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0.tgz#6997cb7909671f9deddaea53f17ed054aab27cd3" + integrity sha512-vlkH+DkuQBvOqnDPqTtyZ5mHb+GfIR/QJBXI7yrS62ML+ZNqkg0vXftCrm4aAR2kPmvgYsbUOJcKJAmgydcOEQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" sweetalert2 "^11.23.0" -"@abp/timeago@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0-rc.2.tgz#98d630cc3843eee64dbcc34fb8ca5afbab034718" - integrity sha512-vJmk+otyXXJE2s2J8iYpLVaFuNAYnIUSOitmi7umYnL+k/UE2KQhBXU7FR0/OBY9mAZYd+shaiGIU1LMSaJ+Xg== +"@abp/timeago@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0.tgz#45c1e8b1451e31910e330053981a871787fe02f1" + integrity sha512-3RVMlBbOepa4WBTLthRmf2VddkNwsjE+FNnaSUaMQ2ZQaXnghnZc4xZ3f3oKraGcWMgqpz1IfrWWV1POKRsEXw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" timeago "^1.6.7" -"@abp/tui-editor@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-10.1.0-rc.2.tgz#ebbd5bad1ee180a0c6e6a9cfd894499614a71e96" - integrity sha512-k5V+5ZE+HZebfyXLzddRQDGri3HP7wSjDXEbSMLTgxZTem7IzksyLWLAN/woKRzWX92BJXcsmR8T1rhuMhohhA== +"@abp/tui-editor@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-10.1.0.tgz#3f0556f918a239da9c048bf96f7c6703cff1f796" + integrity sha512-cIpNiIvxkUUzk9TnyhP3wBcsrCcgTFOlqhRWowyq9Kt7iVqoKb6vkCflxKt1oxkLZVBI7qOJGx2o5KmSYFcWiQ== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - "@abp/prismjs" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" + "@abp/prismjs" "~10.1.0" -"@abp/utils@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0-rc.2.tgz#86a980c6536b3b5ce185d406723b28be421864ac" - integrity sha512-Oz863VNA8fraQ81vTvqM0IqwiaseLwfFU5QNn6iOGOfn5wQrEkPwtZ0jMI+DGNtJgPzoKiq+iKc3K+SiuVgldg== +"@abp/utils@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0.tgz#ef7f6bf16abb34b77fa57c156b264154827bc0af" + integrity sha512-UDgbvDMbcQklNu+SlQPhkIcIfZoWsQjCCzihanLBiHc474BCOlcTsO6K/EatV9LwqG3zY0mYd0ExAWjH44G0rQ== dependencies: just-compare "^2.3.0" diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index 66592df9ff..647abdc641 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json @@ -3,6 +3,6 @@ "name": "client-simulation-web", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0" } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index a2b6e13b29..1910c85cf1 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,185 +2,185 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0-rc.2.tgz#599f5c47a417d1230fc17c0446a0229f920f7246" - integrity sha512-8F4nEK+VtgRRf8n+66HMbtCEaOMCW/OdbSEWRl9ahMNoj860oPIJ8P8Qn/2+LjtkPMdDAfCdEzyDzCd3igaFaA== +"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0.tgz#94f68982ce8b67b6ac827f824aed3faad50e56e9" + integrity sha512-wqbEANW8CRZ+/7qGNprC828yNN17TsYtFxywL0B+EA2UfUtcTpzR/3ompZd/XcDm3N2NmS1n5Ao3WEn2NJlHgA== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0" -"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0-rc.2.tgz#e5056e4e159f5815e3cffecab5c46f3d7d4f79d7" - integrity sha512-bo56XzQZPYL/3ckWTTTSSUsSFSFJobvfE29cz13NIrZ/tBtWyQCAJn92wYHuY+6IezYUWb4ga3PkFeHRzR142A== +"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0.tgz#b89c5d38fdeceda9e421f9357842838be36dce49" + integrity sha512-9QyZ7lYr17thTKxq9WN/KVCxNyYurY5Ph9y3vFBkA3u+uOZcaxdw0T417vy0hJvAB7RGlkpLRTmZL7q5P9FzJA== dependencies: - "@abp/aspnetcore.mvc.ui" "~10.1.0-rc.2" - "@abp/bootstrap" "~10.1.0-rc.2" - "@abp/bootstrap-datepicker" "~10.1.0-rc.2" - "@abp/bootstrap-daterangepicker" "~10.1.0-rc.2" - "@abp/datatables.net-bs5" "~10.1.0-rc.2" - "@abp/font-awesome" "~10.1.0-rc.2" - "@abp/jquery-form" "~10.1.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~10.1.0-rc.2" - "@abp/lodash" "~10.1.0-rc.2" - "@abp/luxon" "~10.1.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~10.1.0-rc.2" - "@abp/moment" "~10.1.0-rc.2" - "@abp/select2" "~10.1.0-rc.2" - "@abp/sweetalert2" "~10.1.0-rc.2" - "@abp/timeago" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0-rc.2.tgz#e25d3575d40bfcb3f809bd2d355671181ee5ff40" - integrity sha512-MOF86bVbi7N/nIla+361nsBrN4tiSka8xzpWcgqlLcCAl9ILG4rugbtafBAjN81taPma2peZM7egaOR4SDkTMw== + "@abp/aspnetcore.mvc.ui" "~10.1.0" + "@abp/bootstrap" "~10.1.0" + "@abp/bootstrap-datepicker" "~10.1.0" + "@abp/bootstrap-daterangepicker" "~10.1.0" + "@abp/datatables.net-bs5" "~10.1.0" + "@abp/font-awesome" "~10.1.0" + "@abp/jquery-form" "~10.1.0" + "@abp/jquery-validation-unobtrusive" "~10.1.0" + "@abp/lodash" "~10.1.0" + "@abp/luxon" "~10.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.1.0" + "@abp/moment" "~10.1.0" + "@abp/select2" "~10.1.0" + "@abp/sweetalert2" "~10.1.0" + "@abp/timeago" "~10.1.0" + +"@abp/aspnetcore.mvc.ui@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0.tgz#79d76232aacb9c8e1762d903f75007d0418bf5a8" + integrity sha512-brVfaSUicZuSuwtizrEcMvtRjFsoAHr9i56HjJZb7bmElr+q5STiul3stRumly4IfoLkYqdy85hMk+B3G0bJDg== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0-rc.2.tgz#be80c6104ba53e18935fbf62ca2c1890f4b2fde4" - integrity sha512-BNcDYUSbZaLah4SfXm0efoqFTsOViVm6370k9L7vix/OGpIWwklJsr8y78lvdM5ANgNCfl0LPSq+seLJFc/OLA== +"@abp/bootstrap-datepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0.tgz#68270ed8cf8e0c23a77331ef2ba6ef2d1da3cefc" + integrity sha512-ahKKHlluo4U1Z238mBNzpL0YaErTPENLQDVLNZB1BnZcUTqz1j7WJHGZoy4j3CXZKt7mnFCRe1+vJMCcwP+DYA== dependencies: bootstrap-datepicker "^1.10.1" -"@abp/bootstrap-daterangepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0-rc.2.tgz#f189f7d070ebd97d9cfdcb99571cab2d6a198ab5" - integrity sha512-bV8J0MuiAFVLkr48JsB6aZU6aPoqw+Gyhq1szQ74bEwNQlRBPuF92WVA5FACaUBj8dMUzR9HDDAYQuxUzpKYKA== +"@abp/bootstrap-daterangepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0.tgz#69f7775eafe7c038c2684d3e990384c8f2966cff" + integrity sha512-mFMaH7GqPn7W5zzIMOOTl4f0at9Vx8da4ewvPU/IvngrTeezMRPC1tofHmiWDhHfZpzF5J9DDMCGul9Q4nOl5A== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0-rc.2.tgz#2300800a29ea09b91f5ed2e6177e5921fe7d2a0f" - integrity sha512-K+tDI9vz/Y9B/yu0i3AVpm4v3Odi44Q/yH5hAprL7f4pGxEOiqAFB/qzHAxG+7Oa7wjv5tPLv+Cz4DavBQjd8Q== +"@abp/bootstrap@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0.tgz#816436ab547fc46d4c00b1facbdd80e3f4f78af1" + integrity sha512-ioqQDOvjXIUWncmLJuTcLPTnlJ3xGxyKXC9veSTJWFd+5pZswK7/QIlAuTvIIujs/7Z13GLunUIMMjny7WFBMw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" bootstrap "^5.3.8" -"@abp/core@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0-rc.2.tgz#403687aff5a30788f7b7ca660abdfd85d89438aa" - integrity sha512-euuG2Hna/DT6/R1dGOjgp3vcehYtF+CcOkRj31oquYKaM5YWk4OaZ314DSpnjgs/xo8DuVc4eKFQwIxD9RK41w== +"@abp/core@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0.tgz#7cb21012deee5510a0774d982f85627d47b368f4" + integrity sha512-/N0K2NVdk5/OM+Q5JDnpC+0CD0mS4wpDhLO1SIQbMXSTFbplhfPw2SFm7+MvPA9pVx2L8TYAzXmS7CtAJxKvCg== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.1.0" -"@abp/datatables.net-bs5@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0-rc.2.tgz#a60650d1802b40751d30f8f6c56beb23fd66481b" - integrity sha512-IWwexNqbMpET54Fvm9LoPTJYf+4CoBbjFOvz3sL6CgO2feV5R5fKigjVU8zXKNh2W+RG8L6zEarfVxrr114TsA== +"@abp/datatables.net-bs5@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0.tgz#ea2a60c22bdcc80882662b9f55f198793f6ea556" + integrity sha512-dPe3bVW3Hfnm/X9Bw5k7TuEIsYYwFk1faC8kIxf2Spk+4Z9TdYFS2zGaHBYStE9iRtKmneNYMykG2O88mX3quA== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.1.0" datatables.net-bs5 "^2.3.4" -"@abp/datatables.net@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0-rc.2.tgz#9147f68bc6dbc4eb40a9ddf65c7859e788cdcac2" - integrity sha512-a9DJpwg14S4nVOiC4ipw0CQwEYWB602e2gCJiH7W1mxopbQb135RxwhtdTnW//eIONcxC9IrEuvcBEAUVt2B7Q== +"@abp/datatables.net@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0.tgz#7fe641883e6d1417c86a030481777a75c9a5a555" + integrity sha512-p9S/ZaJ4OXpihTOWIxsSQ0s3G4S+ScQLD+Q+w0NrWbUa7HTKg9tdqSh6VDhyW9KZ/iiLUO5jNzsAFXyUjjDQuw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" datatables.net "^2.3.4" -"@abp/font-awesome@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0-rc.2.tgz#364466cfe67e41e0c4d16b57d3923d10f66369f1" - integrity sha512-F1Jy8xoFV2aA+VN+NH1gtrG96/j9w7Picc+KLoCoIyNnJr/xJur11XkJyu5ln8KF4V7p/DY7QaQodWV/btOs8g== +"@abp/font-awesome@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0.tgz#79c5b7eb9a85467b0078b9f9bf201493fc3de358" + integrity sha512-dm4VRtZnvm5p8mYQys9KWLkQ+JdwPahQSan2DV1s5Rq4P96hk8p8VshZu7pI3iE0MS+rSZnXYvetZrqCdt1mOQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@fortawesome/fontawesome-free" "^7.0.1" -"@abp/jquery-form@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0-rc.2.tgz#3857717d07569c22d4bbbe459238abeb816d606a" - integrity sha512-2D5WHVnfK9bhRces1tgPwOEoc7KCYKYiKHBOcqct+LTA7zoRjJv/PM8/JhFVl+grVIw1aSwO4tU3YfZ22Vxipg== +"@abp/jquery-form@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0.tgz#7c19605eb103519fea332d0f153cac185b7f2ebb" + integrity sha512-ddlapZqFVwpXU3uDi/RnQ6uSpseMxPAKE+/LgLF+SVyPzazNFognxPT3ztzqTk84P/gFleNgNjAfUlKrfyIfGw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0-rc.2.tgz#efd7b69a078a20c0bf405408dbdf52a7bf770b3b" - integrity sha512-tZ0MWgzBqp+SNfMxM0z2cGB21NiTHuVJyyQaXKE/ptuD5pc0uRkcqw/J2kWfiqsoVgChz27IB6h8/jqDafS4qg== +"@abp/jquery-validation-unobtrusive@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0.tgz#13aa462c4347d3459541a9a9ea19a60458805328" + integrity sha512-94smwn/W3d+gkX2UKH+/OiB7poKDP1ZK0DqWiiH4BGGmpRk9j3B+eJxPbL86dwNG4XT8upuX3ZOrUb6Fy2SA3A== dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0-rc.2.tgz#d39537a7356c51f9db2e66f6740cf6df86bd0442" - integrity sha512-LOkS0NKk4pLtLjPU0CCbwROyUg6EtJN8Z/it7QuKK1CIRfYYcAStgNnNm5geZP7CqECIkoiFfgWjI+L5Z9/Tfg== +"@abp/jquery-validation@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0.tgz#5389785f5ff359ecd6291889420d6c2f84e633aa" + integrity sha512-/X5smp0xpNqCM+BuLI9eEyMPQ0uF42hmEfBvCIfWWBhfp7uFfq7sS706QcGfXYqFdpprRYoUJGKDfSaHxPaJUA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0-rc.2.tgz#101a55f70d510978c8c05f5857d0e9d4965263f7" - integrity sha512-bQV1uFWGtwRYjNOsqJ8FM2004idX2Jj7YVL19YF1/PjyPUSMX+s8/IvJizBjyY5hPAiWBBhmV9g+IFWzxlDQoQ== +"@abp/jquery@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0.tgz#d8812a7d410ad959a1ed27696beb9b7885142684" + integrity sha512-cVF2hOP6GGp0N3VMBOFjEHuHFgXbDH8x0d7Agw4DN2ydFU8wYuj3m9u0HCc0aoBG6Zls90tMpTfM0RqDNFgCKA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" jquery "~3.7.1" -"@abp/lodash@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0-rc.2.tgz#d08c03f8d3d0fbaa3e71e603cbe5fb7f176933ef" - integrity sha512-KCnD1p2y52ZI+2ifpiFIUAiDPsKehnOD8HV5qKeObO6UCP97okif8IP+sQDmNQb8O33y/NKTyx/HcpwBbe/NYQ== +"@abp/lodash@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0.tgz#fdebe764d1142abfd3ecdeef56aa33746e31815b" + integrity sha512-r4WwpqLFFQi721edd8XF5wueAdqEvx75dmRlEuhZoIBA6RQ0yYjTRMNWjTOlIEzFDGj7XrisV5CSUQ9BhhuS+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" lodash "^4.17.21" -"@abp/luxon@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0-rc.2.tgz#ef8d2b323bac054fc9610e241e1b1763d229e065" - integrity sha512-qYFl6XO3g9mZiu0dtIczI7LRuYWwc+RkpbDzSmruXcRks3KA+ZZco2vhHNnlwtXcINl/TXtbW7Wc0MX+8IB1Kw== +"@abp/luxon@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0.tgz#c80cdb1a85e9cc824946dc0009df0daba384a4ca" + integrity sha512-slwiGSrevvWZrBhuy9sw7UP6akk2Ln9eAY3nxxo8xzE7C7uezcNk12dbKN4psdSAVpbDwuqC3GGrkmcFL+6sBQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" luxon "^3.7.2" -"@abp/malihu-custom-scrollbar-plugin@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0-rc.2.tgz#dfaf666442c7c122f7da72c83b9adf194d5b6ec8" - integrity sha512-PudMHmNQgZ6JZeaVt1ZoXLqO0UZXJzUYiBah2LDkC4EMLjnMJFINHBoEVVa4ooXH0yjFv+zsbN0vWZYJ8TBJIA== +"@abp/malihu-custom-scrollbar-plugin@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0.tgz#d257e83b7cc1af89a708e365eef7af0136ccebcf" + integrity sha512-+h8hoYUkjcYBdm/M3b8c3CeE5WNU8K6kQ5MwQXNaaGLCvwEmZHy0A6+U8yxtKv2eRRhAkAqOkQyWYRWA5w1XzQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0-rc.2.tgz#610a1592d13984aea51abbd13df8c5995a089149" - integrity sha512-ep8PnAXARw0t/wtGOVp/oiNhF3B0Bh6y2vRzKrcSoyXAQREGGm4fJdZVYZLGTfI4lFLTjebEgf4O7T9feUwJAw== +"@abp/moment@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0.tgz#5755e4e10a7302e2832b1a1ce571f20b27600303" + integrity sha512-faHV7vmPEjFUJTRNTTlmnpx0VZuyvQt4O98WBLAjPdcqpLfWazdS9Ro405St5liIkgvmAXWsrwVmZb0VKTLcNA== dependencies: moment "^2.30.1" -"@abp/select2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0-rc.2.tgz#40c5418d007fc36817eecbe6388d767e4e7ca887" - integrity sha512-Pq0wlpL01sWRLUg5um3JtBXIqi3mmbwPwvgxP8hFbQngAt9JXAK8geNRiTMrIZgtW/ycXtM1v6I4zuWOLOeAGg== +"@abp/select2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0.tgz#8b15954e462e65329b8eb481226170df6d55d36a" + integrity sha512-7+1GirZe4i/2/LR4jZgWhiN6lFHhClLtUmrdCjh7FeeuBvy5GGA417DybDihna/GzlcOVI4GHnn2fjEwcFqJiw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0-rc.2.tgz#d35858c69e10c6726b02cdfcea88dfc32385963f" - integrity sha512-s9VPRToohN45uzHcKCF5Mcj8FVjsXcXUb0U3tuaT/Y+u4adHB3fBxYiXJFM0sVsCJ81dFktxwka40Wm8Taz/zA== +"@abp/sweetalert2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0.tgz#6997cb7909671f9deddaea53f17ed054aab27cd3" + integrity sha512-vlkH+DkuQBvOqnDPqTtyZ5mHb+GfIR/QJBXI7yrS62ML+ZNqkg0vXftCrm4aAR2kPmvgYsbUOJcKJAmgydcOEQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" sweetalert2 "^11.23.0" -"@abp/timeago@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0-rc.2.tgz#98d630cc3843eee64dbcc34fb8ca5afbab034718" - integrity sha512-vJmk+otyXXJE2s2J8iYpLVaFuNAYnIUSOitmi7umYnL+k/UE2KQhBXU7FR0/OBY9mAZYd+shaiGIU1LMSaJ+Xg== +"@abp/timeago@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0.tgz#45c1e8b1451e31910e330053981a871787fe02f1" + integrity sha512-3RVMlBbOepa4WBTLthRmf2VddkNwsjE+FNnaSUaMQ2ZQaXnghnZc4xZ3f3oKraGcWMgqpz1IfrWWV1POKRsEXw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" timeago "^1.6.7" -"@abp/utils@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0-rc.2.tgz#86a980c6536b3b5ce185d406723b28be421864ac" - integrity sha512-Oz863VNA8fraQ81vTvqM0IqwiaseLwfFU5QNn6iOGOfn5wQrEkPwtZ0jMI+DGNtJgPzoKiq+iKc3K+SiuVgldg== +"@abp/utils@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0.tgz#ef7f6bf16abb34b77fa57c156b264154827bc0af" + integrity sha512-UDgbvDMbcQklNu+SlQPhkIcIfZoWsQjCCzihanLBiHc474BCOlcTsO6K/EatV9LwqG3zY0mYd0ExAWjH44G0rQ== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index d4bc7712ef..530ccee465 100644 --- a/modules/cms-kit/angular/package.json +++ b/modules/cms-kit/angular/package.json @@ -15,11 +15,11 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~10.1.0-rc.2", - "@abp/ng.identity": "~10.1.0-rc.2", - "@abp/ng.setting-management": "~10.1.0-rc.1", - "@abp/ng.tenant-management": "~10.1.0-rc.2", - "@abp/ng.theme.basic": "~10.1.0-rc.2", + "@abp/ng.account": "~10.1.0", + "@abp/ng.identity": "~10.1.0", + "@abp/ng.setting-management": "~10.1.0", + "@abp/ng.tenant-management": "~10.1.0", + "@abp/ng.theme.basic": "~10.1.0", "@angular/animations": "~10.0.0", "@angular/common": "~10.0.0", "@angular/compiler": "~10.0.0", diff --git a/modules/cms-kit/angular/projects/cms-kit/package.json b/modules/cms-kit/angular/projects/cms-kit/package.json index aa92688cca..b3c89721dd 100644 --- a/modules/cms-kit/angular/projects/cms-kit/package.json +++ b/modules/cms-kit/angular/projects/cms-kit/package.json @@ -4,8 +4,8 @@ "peerDependencies": { "@angular/common": "^9.1.11", "@angular/core": "^9.1.11", - "@abp/ng.core": ">=10.1.0-rc.2", - "@abp/ng.theme.shared": ">=10.1.0-rc.2" + "@abp/ng.core": ">=10.1.0", + "@abp/ng.theme.shared": ">=10.1.0" }, "dependencies": { "tslib": "^2.0.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json index 7588fb2989..0a69024f15 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index a2b6e13b29..1910c85cf1 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,185 +2,185 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0-rc.2.tgz#599f5c47a417d1230fc17c0446a0229f920f7246" - integrity sha512-8F4nEK+VtgRRf8n+66HMbtCEaOMCW/OdbSEWRl9ahMNoj860oPIJ8P8Qn/2+LjtkPMdDAfCdEzyDzCd3igaFaA== +"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0.tgz#94f68982ce8b67b6ac827f824aed3faad50e56e9" + integrity sha512-wqbEANW8CRZ+/7qGNprC828yNN17TsYtFxywL0B+EA2UfUtcTpzR/3ompZd/XcDm3N2NmS1n5Ao3WEn2NJlHgA== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0" -"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0-rc.2.tgz#e5056e4e159f5815e3cffecab5c46f3d7d4f79d7" - integrity sha512-bo56XzQZPYL/3ckWTTTSSUsSFSFJobvfE29cz13NIrZ/tBtWyQCAJn92wYHuY+6IezYUWb4ga3PkFeHRzR142A== +"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0.tgz#b89c5d38fdeceda9e421f9357842838be36dce49" + integrity sha512-9QyZ7lYr17thTKxq9WN/KVCxNyYurY5Ph9y3vFBkA3u+uOZcaxdw0T417vy0hJvAB7RGlkpLRTmZL7q5P9FzJA== dependencies: - "@abp/aspnetcore.mvc.ui" "~10.1.0-rc.2" - "@abp/bootstrap" "~10.1.0-rc.2" - "@abp/bootstrap-datepicker" "~10.1.0-rc.2" - "@abp/bootstrap-daterangepicker" "~10.1.0-rc.2" - "@abp/datatables.net-bs5" "~10.1.0-rc.2" - "@abp/font-awesome" "~10.1.0-rc.2" - "@abp/jquery-form" "~10.1.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~10.1.0-rc.2" - "@abp/lodash" "~10.1.0-rc.2" - "@abp/luxon" "~10.1.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~10.1.0-rc.2" - "@abp/moment" "~10.1.0-rc.2" - "@abp/select2" "~10.1.0-rc.2" - "@abp/sweetalert2" "~10.1.0-rc.2" - "@abp/timeago" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0-rc.2.tgz#e25d3575d40bfcb3f809bd2d355671181ee5ff40" - integrity sha512-MOF86bVbi7N/nIla+361nsBrN4tiSka8xzpWcgqlLcCAl9ILG4rugbtafBAjN81taPma2peZM7egaOR4SDkTMw== + "@abp/aspnetcore.mvc.ui" "~10.1.0" + "@abp/bootstrap" "~10.1.0" + "@abp/bootstrap-datepicker" "~10.1.0" + "@abp/bootstrap-daterangepicker" "~10.1.0" + "@abp/datatables.net-bs5" "~10.1.0" + "@abp/font-awesome" "~10.1.0" + "@abp/jquery-form" "~10.1.0" + "@abp/jquery-validation-unobtrusive" "~10.1.0" + "@abp/lodash" "~10.1.0" + "@abp/luxon" "~10.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.1.0" + "@abp/moment" "~10.1.0" + "@abp/select2" "~10.1.0" + "@abp/sweetalert2" "~10.1.0" + "@abp/timeago" "~10.1.0" + +"@abp/aspnetcore.mvc.ui@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0.tgz#79d76232aacb9c8e1762d903f75007d0418bf5a8" + integrity sha512-brVfaSUicZuSuwtizrEcMvtRjFsoAHr9i56HjJZb7bmElr+q5STiul3stRumly4IfoLkYqdy85hMk+B3G0bJDg== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0-rc.2.tgz#be80c6104ba53e18935fbf62ca2c1890f4b2fde4" - integrity sha512-BNcDYUSbZaLah4SfXm0efoqFTsOViVm6370k9L7vix/OGpIWwklJsr8y78lvdM5ANgNCfl0LPSq+seLJFc/OLA== +"@abp/bootstrap-datepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0.tgz#68270ed8cf8e0c23a77331ef2ba6ef2d1da3cefc" + integrity sha512-ahKKHlluo4U1Z238mBNzpL0YaErTPENLQDVLNZB1BnZcUTqz1j7WJHGZoy4j3CXZKt7mnFCRe1+vJMCcwP+DYA== dependencies: bootstrap-datepicker "^1.10.1" -"@abp/bootstrap-daterangepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0-rc.2.tgz#f189f7d070ebd97d9cfdcb99571cab2d6a198ab5" - integrity sha512-bV8J0MuiAFVLkr48JsB6aZU6aPoqw+Gyhq1szQ74bEwNQlRBPuF92WVA5FACaUBj8dMUzR9HDDAYQuxUzpKYKA== +"@abp/bootstrap-daterangepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0.tgz#69f7775eafe7c038c2684d3e990384c8f2966cff" + integrity sha512-mFMaH7GqPn7W5zzIMOOTl4f0at9Vx8da4ewvPU/IvngrTeezMRPC1tofHmiWDhHfZpzF5J9DDMCGul9Q4nOl5A== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0-rc.2.tgz#2300800a29ea09b91f5ed2e6177e5921fe7d2a0f" - integrity sha512-K+tDI9vz/Y9B/yu0i3AVpm4v3Odi44Q/yH5hAprL7f4pGxEOiqAFB/qzHAxG+7Oa7wjv5tPLv+Cz4DavBQjd8Q== +"@abp/bootstrap@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0.tgz#816436ab547fc46d4c00b1facbdd80e3f4f78af1" + integrity sha512-ioqQDOvjXIUWncmLJuTcLPTnlJ3xGxyKXC9veSTJWFd+5pZswK7/QIlAuTvIIujs/7Z13GLunUIMMjny7WFBMw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" bootstrap "^5.3.8" -"@abp/core@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0-rc.2.tgz#403687aff5a30788f7b7ca660abdfd85d89438aa" - integrity sha512-euuG2Hna/DT6/R1dGOjgp3vcehYtF+CcOkRj31oquYKaM5YWk4OaZ314DSpnjgs/xo8DuVc4eKFQwIxD9RK41w== +"@abp/core@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0.tgz#7cb21012deee5510a0774d982f85627d47b368f4" + integrity sha512-/N0K2NVdk5/OM+Q5JDnpC+0CD0mS4wpDhLO1SIQbMXSTFbplhfPw2SFm7+MvPA9pVx2L8TYAzXmS7CtAJxKvCg== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.1.0" -"@abp/datatables.net-bs5@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0-rc.2.tgz#a60650d1802b40751d30f8f6c56beb23fd66481b" - integrity sha512-IWwexNqbMpET54Fvm9LoPTJYf+4CoBbjFOvz3sL6CgO2feV5R5fKigjVU8zXKNh2W+RG8L6zEarfVxrr114TsA== +"@abp/datatables.net-bs5@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0.tgz#ea2a60c22bdcc80882662b9f55f198793f6ea556" + integrity sha512-dPe3bVW3Hfnm/X9Bw5k7TuEIsYYwFk1faC8kIxf2Spk+4Z9TdYFS2zGaHBYStE9iRtKmneNYMykG2O88mX3quA== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.1.0" datatables.net-bs5 "^2.3.4" -"@abp/datatables.net@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0-rc.2.tgz#9147f68bc6dbc4eb40a9ddf65c7859e788cdcac2" - integrity sha512-a9DJpwg14S4nVOiC4ipw0CQwEYWB602e2gCJiH7W1mxopbQb135RxwhtdTnW//eIONcxC9IrEuvcBEAUVt2B7Q== +"@abp/datatables.net@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0.tgz#7fe641883e6d1417c86a030481777a75c9a5a555" + integrity sha512-p9S/ZaJ4OXpihTOWIxsSQ0s3G4S+ScQLD+Q+w0NrWbUa7HTKg9tdqSh6VDhyW9KZ/iiLUO5jNzsAFXyUjjDQuw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" datatables.net "^2.3.4" -"@abp/font-awesome@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0-rc.2.tgz#364466cfe67e41e0c4d16b57d3923d10f66369f1" - integrity sha512-F1Jy8xoFV2aA+VN+NH1gtrG96/j9w7Picc+KLoCoIyNnJr/xJur11XkJyu5ln8KF4V7p/DY7QaQodWV/btOs8g== +"@abp/font-awesome@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0.tgz#79c5b7eb9a85467b0078b9f9bf201493fc3de358" + integrity sha512-dm4VRtZnvm5p8mYQys9KWLkQ+JdwPahQSan2DV1s5Rq4P96hk8p8VshZu7pI3iE0MS+rSZnXYvetZrqCdt1mOQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@fortawesome/fontawesome-free" "^7.0.1" -"@abp/jquery-form@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0-rc.2.tgz#3857717d07569c22d4bbbe459238abeb816d606a" - integrity sha512-2D5WHVnfK9bhRces1tgPwOEoc7KCYKYiKHBOcqct+LTA7zoRjJv/PM8/JhFVl+grVIw1aSwO4tU3YfZ22Vxipg== +"@abp/jquery-form@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0.tgz#7c19605eb103519fea332d0f153cac185b7f2ebb" + integrity sha512-ddlapZqFVwpXU3uDi/RnQ6uSpseMxPAKE+/LgLF+SVyPzazNFognxPT3ztzqTk84P/gFleNgNjAfUlKrfyIfGw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0-rc.2.tgz#efd7b69a078a20c0bf405408dbdf52a7bf770b3b" - integrity sha512-tZ0MWgzBqp+SNfMxM0z2cGB21NiTHuVJyyQaXKE/ptuD5pc0uRkcqw/J2kWfiqsoVgChz27IB6h8/jqDafS4qg== +"@abp/jquery-validation-unobtrusive@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0.tgz#13aa462c4347d3459541a9a9ea19a60458805328" + integrity sha512-94smwn/W3d+gkX2UKH+/OiB7poKDP1ZK0DqWiiH4BGGmpRk9j3B+eJxPbL86dwNG4XT8upuX3ZOrUb6Fy2SA3A== dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0-rc.2.tgz#d39537a7356c51f9db2e66f6740cf6df86bd0442" - integrity sha512-LOkS0NKk4pLtLjPU0CCbwROyUg6EtJN8Z/it7QuKK1CIRfYYcAStgNnNm5geZP7CqECIkoiFfgWjI+L5Z9/Tfg== +"@abp/jquery-validation@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0.tgz#5389785f5ff359ecd6291889420d6c2f84e633aa" + integrity sha512-/X5smp0xpNqCM+BuLI9eEyMPQ0uF42hmEfBvCIfWWBhfp7uFfq7sS706QcGfXYqFdpprRYoUJGKDfSaHxPaJUA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0-rc.2.tgz#101a55f70d510978c8c05f5857d0e9d4965263f7" - integrity sha512-bQV1uFWGtwRYjNOsqJ8FM2004idX2Jj7YVL19YF1/PjyPUSMX+s8/IvJizBjyY5hPAiWBBhmV9g+IFWzxlDQoQ== +"@abp/jquery@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0.tgz#d8812a7d410ad959a1ed27696beb9b7885142684" + integrity sha512-cVF2hOP6GGp0N3VMBOFjEHuHFgXbDH8x0d7Agw4DN2ydFU8wYuj3m9u0HCc0aoBG6Zls90tMpTfM0RqDNFgCKA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" jquery "~3.7.1" -"@abp/lodash@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0-rc.2.tgz#d08c03f8d3d0fbaa3e71e603cbe5fb7f176933ef" - integrity sha512-KCnD1p2y52ZI+2ifpiFIUAiDPsKehnOD8HV5qKeObO6UCP97okif8IP+sQDmNQb8O33y/NKTyx/HcpwBbe/NYQ== +"@abp/lodash@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0.tgz#fdebe764d1142abfd3ecdeef56aa33746e31815b" + integrity sha512-r4WwpqLFFQi721edd8XF5wueAdqEvx75dmRlEuhZoIBA6RQ0yYjTRMNWjTOlIEzFDGj7XrisV5CSUQ9BhhuS+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" lodash "^4.17.21" -"@abp/luxon@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0-rc.2.tgz#ef8d2b323bac054fc9610e241e1b1763d229e065" - integrity sha512-qYFl6XO3g9mZiu0dtIczI7LRuYWwc+RkpbDzSmruXcRks3KA+ZZco2vhHNnlwtXcINl/TXtbW7Wc0MX+8IB1Kw== +"@abp/luxon@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0.tgz#c80cdb1a85e9cc824946dc0009df0daba384a4ca" + integrity sha512-slwiGSrevvWZrBhuy9sw7UP6akk2Ln9eAY3nxxo8xzE7C7uezcNk12dbKN4psdSAVpbDwuqC3GGrkmcFL+6sBQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" luxon "^3.7.2" -"@abp/malihu-custom-scrollbar-plugin@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0-rc.2.tgz#dfaf666442c7c122f7da72c83b9adf194d5b6ec8" - integrity sha512-PudMHmNQgZ6JZeaVt1ZoXLqO0UZXJzUYiBah2LDkC4EMLjnMJFINHBoEVVa4ooXH0yjFv+zsbN0vWZYJ8TBJIA== +"@abp/malihu-custom-scrollbar-plugin@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0.tgz#d257e83b7cc1af89a708e365eef7af0136ccebcf" + integrity sha512-+h8hoYUkjcYBdm/M3b8c3CeE5WNU8K6kQ5MwQXNaaGLCvwEmZHy0A6+U8yxtKv2eRRhAkAqOkQyWYRWA5w1XzQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0-rc.2.tgz#610a1592d13984aea51abbd13df8c5995a089149" - integrity sha512-ep8PnAXARw0t/wtGOVp/oiNhF3B0Bh6y2vRzKrcSoyXAQREGGm4fJdZVYZLGTfI4lFLTjebEgf4O7T9feUwJAw== +"@abp/moment@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0.tgz#5755e4e10a7302e2832b1a1ce571f20b27600303" + integrity sha512-faHV7vmPEjFUJTRNTTlmnpx0VZuyvQt4O98WBLAjPdcqpLfWazdS9Ro405St5liIkgvmAXWsrwVmZb0VKTLcNA== dependencies: moment "^2.30.1" -"@abp/select2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0-rc.2.tgz#40c5418d007fc36817eecbe6388d767e4e7ca887" - integrity sha512-Pq0wlpL01sWRLUg5um3JtBXIqi3mmbwPwvgxP8hFbQngAt9JXAK8geNRiTMrIZgtW/ycXtM1v6I4zuWOLOeAGg== +"@abp/select2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0.tgz#8b15954e462e65329b8eb481226170df6d55d36a" + integrity sha512-7+1GirZe4i/2/LR4jZgWhiN6lFHhClLtUmrdCjh7FeeuBvy5GGA417DybDihna/GzlcOVI4GHnn2fjEwcFqJiw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0-rc.2.tgz#d35858c69e10c6726b02cdfcea88dfc32385963f" - integrity sha512-s9VPRToohN45uzHcKCF5Mcj8FVjsXcXUb0U3tuaT/Y+u4adHB3fBxYiXJFM0sVsCJ81dFktxwka40Wm8Taz/zA== +"@abp/sweetalert2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0.tgz#6997cb7909671f9deddaea53f17ed054aab27cd3" + integrity sha512-vlkH+DkuQBvOqnDPqTtyZ5mHb+GfIR/QJBXI7yrS62ML+ZNqkg0vXftCrm4aAR2kPmvgYsbUOJcKJAmgydcOEQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" sweetalert2 "^11.23.0" -"@abp/timeago@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0-rc.2.tgz#98d630cc3843eee64dbcc34fb8ca5afbab034718" - integrity sha512-vJmk+otyXXJE2s2J8iYpLVaFuNAYnIUSOitmi7umYnL+k/UE2KQhBXU7FR0/OBY9mAZYd+shaiGIU1LMSaJ+Xg== +"@abp/timeago@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0.tgz#45c1e8b1451e31910e330053981a871787fe02f1" + integrity sha512-3RVMlBbOepa4WBTLthRmf2VddkNwsjE+FNnaSUaMQ2ZQaXnghnZc4xZ3f3oKraGcWMgqpz1IfrWWV1POKRsEXw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" timeago "^1.6.7" -"@abp/utils@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0-rc.2.tgz#86a980c6536b3b5ce185d406723b28be421864ac" - integrity sha512-Oz863VNA8fraQ81vTvqM0IqwiaseLwfFU5QNn6iOGOfn5wQrEkPwtZ0jMI+DGNtJgPzoKiq+iKc3K+SiuVgldg== +"@abp/utils@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0.tgz#ef7f6bf16abb34b77fa57c156b264154827bc0af" + integrity sha512-UDgbvDMbcQklNu+SlQPhkIcIfZoWsQjCCzihanLBiHc474BCOlcTsO6K/EatV9LwqG3zY0mYd0ExAWjH44G0rQ== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json index 52a1fc6c21..e544c427a0 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock index a2b6e13b29..1910c85cf1 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock @@ -2,185 +2,185 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0-rc.2.tgz#599f5c47a417d1230fc17c0446a0229f920f7246" - integrity sha512-8F4nEK+VtgRRf8n+66HMbtCEaOMCW/OdbSEWRl9ahMNoj860oPIJ8P8Qn/2+LjtkPMdDAfCdEzyDzCd3igaFaA== +"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0.tgz#94f68982ce8b67b6ac827f824aed3faad50e56e9" + integrity sha512-wqbEANW8CRZ+/7qGNprC828yNN17TsYtFxywL0B+EA2UfUtcTpzR/3ompZd/XcDm3N2NmS1n5Ao3WEn2NJlHgA== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0" -"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0-rc.2.tgz#e5056e4e159f5815e3cffecab5c46f3d7d4f79d7" - integrity sha512-bo56XzQZPYL/3ckWTTTSSUsSFSFJobvfE29cz13NIrZ/tBtWyQCAJn92wYHuY+6IezYUWb4ga3PkFeHRzR142A== +"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0.tgz#b89c5d38fdeceda9e421f9357842838be36dce49" + integrity sha512-9QyZ7lYr17thTKxq9WN/KVCxNyYurY5Ph9y3vFBkA3u+uOZcaxdw0T417vy0hJvAB7RGlkpLRTmZL7q5P9FzJA== dependencies: - "@abp/aspnetcore.mvc.ui" "~10.1.0-rc.2" - "@abp/bootstrap" "~10.1.0-rc.2" - "@abp/bootstrap-datepicker" "~10.1.0-rc.2" - "@abp/bootstrap-daterangepicker" "~10.1.0-rc.2" - "@abp/datatables.net-bs5" "~10.1.0-rc.2" - "@abp/font-awesome" "~10.1.0-rc.2" - "@abp/jquery-form" "~10.1.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~10.1.0-rc.2" - "@abp/lodash" "~10.1.0-rc.2" - "@abp/luxon" "~10.1.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~10.1.0-rc.2" - "@abp/moment" "~10.1.0-rc.2" - "@abp/select2" "~10.1.0-rc.2" - "@abp/sweetalert2" "~10.1.0-rc.2" - "@abp/timeago" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0-rc.2.tgz#e25d3575d40bfcb3f809bd2d355671181ee5ff40" - integrity sha512-MOF86bVbi7N/nIla+361nsBrN4tiSka8xzpWcgqlLcCAl9ILG4rugbtafBAjN81taPma2peZM7egaOR4SDkTMw== + "@abp/aspnetcore.mvc.ui" "~10.1.0" + "@abp/bootstrap" "~10.1.0" + "@abp/bootstrap-datepicker" "~10.1.0" + "@abp/bootstrap-daterangepicker" "~10.1.0" + "@abp/datatables.net-bs5" "~10.1.0" + "@abp/font-awesome" "~10.1.0" + "@abp/jquery-form" "~10.1.0" + "@abp/jquery-validation-unobtrusive" "~10.1.0" + "@abp/lodash" "~10.1.0" + "@abp/luxon" "~10.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.1.0" + "@abp/moment" "~10.1.0" + "@abp/select2" "~10.1.0" + "@abp/sweetalert2" "~10.1.0" + "@abp/timeago" "~10.1.0" + +"@abp/aspnetcore.mvc.ui@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0.tgz#79d76232aacb9c8e1762d903f75007d0418bf5a8" + integrity sha512-brVfaSUicZuSuwtizrEcMvtRjFsoAHr9i56HjJZb7bmElr+q5STiul3stRumly4IfoLkYqdy85hMk+B3G0bJDg== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0-rc.2.tgz#be80c6104ba53e18935fbf62ca2c1890f4b2fde4" - integrity sha512-BNcDYUSbZaLah4SfXm0efoqFTsOViVm6370k9L7vix/OGpIWwklJsr8y78lvdM5ANgNCfl0LPSq+seLJFc/OLA== +"@abp/bootstrap-datepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0.tgz#68270ed8cf8e0c23a77331ef2ba6ef2d1da3cefc" + integrity sha512-ahKKHlluo4U1Z238mBNzpL0YaErTPENLQDVLNZB1BnZcUTqz1j7WJHGZoy4j3CXZKt7mnFCRe1+vJMCcwP+DYA== dependencies: bootstrap-datepicker "^1.10.1" -"@abp/bootstrap-daterangepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0-rc.2.tgz#f189f7d070ebd97d9cfdcb99571cab2d6a198ab5" - integrity sha512-bV8J0MuiAFVLkr48JsB6aZU6aPoqw+Gyhq1szQ74bEwNQlRBPuF92WVA5FACaUBj8dMUzR9HDDAYQuxUzpKYKA== +"@abp/bootstrap-daterangepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0.tgz#69f7775eafe7c038c2684d3e990384c8f2966cff" + integrity sha512-mFMaH7GqPn7W5zzIMOOTl4f0at9Vx8da4ewvPU/IvngrTeezMRPC1tofHmiWDhHfZpzF5J9DDMCGul9Q4nOl5A== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0-rc.2.tgz#2300800a29ea09b91f5ed2e6177e5921fe7d2a0f" - integrity sha512-K+tDI9vz/Y9B/yu0i3AVpm4v3Odi44Q/yH5hAprL7f4pGxEOiqAFB/qzHAxG+7Oa7wjv5tPLv+Cz4DavBQjd8Q== +"@abp/bootstrap@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0.tgz#816436ab547fc46d4c00b1facbdd80e3f4f78af1" + integrity sha512-ioqQDOvjXIUWncmLJuTcLPTnlJ3xGxyKXC9veSTJWFd+5pZswK7/QIlAuTvIIujs/7Z13GLunUIMMjny7WFBMw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" bootstrap "^5.3.8" -"@abp/core@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0-rc.2.tgz#403687aff5a30788f7b7ca660abdfd85d89438aa" - integrity sha512-euuG2Hna/DT6/R1dGOjgp3vcehYtF+CcOkRj31oquYKaM5YWk4OaZ314DSpnjgs/xo8DuVc4eKFQwIxD9RK41w== +"@abp/core@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0.tgz#7cb21012deee5510a0774d982f85627d47b368f4" + integrity sha512-/N0K2NVdk5/OM+Q5JDnpC+0CD0mS4wpDhLO1SIQbMXSTFbplhfPw2SFm7+MvPA9pVx2L8TYAzXmS7CtAJxKvCg== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.1.0" -"@abp/datatables.net-bs5@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0-rc.2.tgz#a60650d1802b40751d30f8f6c56beb23fd66481b" - integrity sha512-IWwexNqbMpET54Fvm9LoPTJYf+4CoBbjFOvz3sL6CgO2feV5R5fKigjVU8zXKNh2W+RG8L6zEarfVxrr114TsA== +"@abp/datatables.net-bs5@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0.tgz#ea2a60c22bdcc80882662b9f55f198793f6ea556" + integrity sha512-dPe3bVW3Hfnm/X9Bw5k7TuEIsYYwFk1faC8kIxf2Spk+4Z9TdYFS2zGaHBYStE9iRtKmneNYMykG2O88mX3quA== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.1.0" datatables.net-bs5 "^2.3.4" -"@abp/datatables.net@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0-rc.2.tgz#9147f68bc6dbc4eb40a9ddf65c7859e788cdcac2" - integrity sha512-a9DJpwg14S4nVOiC4ipw0CQwEYWB602e2gCJiH7W1mxopbQb135RxwhtdTnW//eIONcxC9IrEuvcBEAUVt2B7Q== +"@abp/datatables.net@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0.tgz#7fe641883e6d1417c86a030481777a75c9a5a555" + integrity sha512-p9S/ZaJ4OXpihTOWIxsSQ0s3G4S+ScQLD+Q+w0NrWbUa7HTKg9tdqSh6VDhyW9KZ/iiLUO5jNzsAFXyUjjDQuw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" datatables.net "^2.3.4" -"@abp/font-awesome@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0-rc.2.tgz#364466cfe67e41e0c4d16b57d3923d10f66369f1" - integrity sha512-F1Jy8xoFV2aA+VN+NH1gtrG96/j9w7Picc+KLoCoIyNnJr/xJur11XkJyu5ln8KF4V7p/DY7QaQodWV/btOs8g== +"@abp/font-awesome@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0.tgz#79c5b7eb9a85467b0078b9f9bf201493fc3de358" + integrity sha512-dm4VRtZnvm5p8mYQys9KWLkQ+JdwPahQSan2DV1s5Rq4P96hk8p8VshZu7pI3iE0MS+rSZnXYvetZrqCdt1mOQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@fortawesome/fontawesome-free" "^7.0.1" -"@abp/jquery-form@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0-rc.2.tgz#3857717d07569c22d4bbbe459238abeb816d606a" - integrity sha512-2D5WHVnfK9bhRces1tgPwOEoc7KCYKYiKHBOcqct+LTA7zoRjJv/PM8/JhFVl+grVIw1aSwO4tU3YfZ22Vxipg== +"@abp/jquery-form@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0.tgz#7c19605eb103519fea332d0f153cac185b7f2ebb" + integrity sha512-ddlapZqFVwpXU3uDi/RnQ6uSpseMxPAKE+/LgLF+SVyPzazNFognxPT3ztzqTk84P/gFleNgNjAfUlKrfyIfGw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0-rc.2.tgz#efd7b69a078a20c0bf405408dbdf52a7bf770b3b" - integrity sha512-tZ0MWgzBqp+SNfMxM0z2cGB21NiTHuVJyyQaXKE/ptuD5pc0uRkcqw/J2kWfiqsoVgChz27IB6h8/jqDafS4qg== +"@abp/jquery-validation-unobtrusive@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0.tgz#13aa462c4347d3459541a9a9ea19a60458805328" + integrity sha512-94smwn/W3d+gkX2UKH+/OiB7poKDP1ZK0DqWiiH4BGGmpRk9j3B+eJxPbL86dwNG4XT8upuX3ZOrUb6Fy2SA3A== dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0-rc.2.tgz#d39537a7356c51f9db2e66f6740cf6df86bd0442" - integrity sha512-LOkS0NKk4pLtLjPU0CCbwROyUg6EtJN8Z/it7QuKK1CIRfYYcAStgNnNm5geZP7CqECIkoiFfgWjI+L5Z9/Tfg== +"@abp/jquery-validation@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0.tgz#5389785f5ff359ecd6291889420d6c2f84e633aa" + integrity sha512-/X5smp0xpNqCM+BuLI9eEyMPQ0uF42hmEfBvCIfWWBhfp7uFfq7sS706QcGfXYqFdpprRYoUJGKDfSaHxPaJUA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0-rc.2.tgz#101a55f70d510978c8c05f5857d0e9d4965263f7" - integrity sha512-bQV1uFWGtwRYjNOsqJ8FM2004idX2Jj7YVL19YF1/PjyPUSMX+s8/IvJizBjyY5hPAiWBBhmV9g+IFWzxlDQoQ== +"@abp/jquery@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0.tgz#d8812a7d410ad959a1ed27696beb9b7885142684" + integrity sha512-cVF2hOP6GGp0N3VMBOFjEHuHFgXbDH8x0d7Agw4DN2ydFU8wYuj3m9u0HCc0aoBG6Zls90tMpTfM0RqDNFgCKA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" jquery "~3.7.1" -"@abp/lodash@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0-rc.2.tgz#d08c03f8d3d0fbaa3e71e603cbe5fb7f176933ef" - integrity sha512-KCnD1p2y52ZI+2ifpiFIUAiDPsKehnOD8HV5qKeObO6UCP97okif8IP+sQDmNQb8O33y/NKTyx/HcpwBbe/NYQ== +"@abp/lodash@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0.tgz#fdebe764d1142abfd3ecdeef56aa33746e31815b" + integrity sha512-r4WwpqLFFQi721edd8XF5wueAdqEvx75dmRlEuhZoIBA6RQ0yYjTRMNWjTOlIEzFDGj7XrisV5CSUQ9BhhuS+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" lodash "^4.17.21" -"@abp/luxon@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0-rc.2.tgz#ef8d2b323bac054fc9610e241e1b1763d229e065" - integrity sha512-qYFl6XO3g9mZiu0dtIczI7LRuYWwc+RkpbDzSmruXcRks3KA+ZZco2vhHNnlwtXcINl/TXtbW7Wc0MX+8IB1Kw== +"@abp/luxon@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0.tgz#c80cdb1a85e9cc824946dc0009df0daba384a4ca" + integrity sha512-slwiGSrevvWZrBhuy9sw7UP6akk2Ln9eAY3nxxo8xzE7C7uezcNk12dbKN4psdSAVpbDwuqC3GGrkmcFL+6sBQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" luxon "^3.7.2" -"@abp/malihu-custom-scrollbar-plugin@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0-rc.2.tgz#dfaf666442c7c122f7da72c83b9adf194d5b6ec8" - integrity sha512-PudMHmNQgZ6JZeaVt1ZoXLqO0UZXJzUYiBah2LDkC4EMLjnMJFINHBoEVVa4ooXH0yjFv+zsbN0vWZYJ8TBJIA== +"@abp/malihu-custom-scrollbar-plugin@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0.tgz#d257e83b7cc1af89a708e365eef7af0136ccebcf" + integrity sha512-+h8hoYUkjcYBdm/M3b8c3CeE5WNU8K6kQ5MwQXNaaGLCvwEmZHy0A6+U8yxtKv2eRRhAkAqOkQyWYRWA5w1XzQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0-rc.2.tgz#610a1592d13984aea51abbd13df8c5995a089149" - integrity sha512-ep8PnAXARw0t/wtGOVp/oiNhF3B0Bh6y2vRzKrcSoyXAQREGGm4fJdZVYZLGTfI4lFLTjebEgf4O7T9feUwJAw== +"@abp/moment@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0.tgz#5755e4e10a7302e2832b1a1ce571f20b27600303" + integrity sha512-faHV7vmPEjFUJTRNTTlmnpx0VZuyvQt4O98WBLAjPdcqpLfWazdS9Ro405St5liIkgvmAXWsrwVmZb0VKTLcNA== dependencies: moment "^2.30.1" -"@abp/select2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0-rc.2.tgz#40c5418d007fc36817eecbe6388d767e4e7ca887" - integrity sha512-Pq0wlpL01sWRLUg5um3JtBXIqi3mmbwPwvgxP8hFbQngAt9JXAK8geNRiTMrIZgtW/ycXtM1v6I4zuWOLOeAGg== +"@abp/select2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0.tgz#8b15954e462e65329b8eb481226170df6d55d36a" + integrity sha512-7+1GirZe4i/2/LR4jZgWhiN6lFHhClLtUmrdCjh7FeeuBvy5GGA417DybDihna/GzlcOVI4GHnn2fjEwcFqJiw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0-rc.2.tgz#d35858c69e10c6726b02cdfcea88dfc32385963f" - integrity sha512-s9VPRToohN45uzHcKCF5Mcj8FVjsXcXUb0U3tuaT/Y+u4adHB3fBxYiXJFM0sVsCJ81dFktxwka40Wm8Taz/zA== +"@abp/sweetalert2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0.tgz#6997cb7909671f9deddaea53f17ed054aab27cd3" + integrity sha512-vlkH+DkuQBvOqnDPqTtyZ5mHb+GfIR/QJBXI7yrS62ML+ZNqkg0vXftCrm4aAR2kPmvgYsbUOJcKJAmgydcOEQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" sweetalert2 "^11.23.0" -"@abp/timeago@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0-rc.2.tgz#98d630cc3843eee64dbcc34fb8ca5afbab034718" - integrity sha512-vJmk+otyXXJE2s2J8iYpLVaFuNAYnIUSOitmi7umYnL+k/UE2KQhBXU7FR0/OBY9mAZYd+shaiGIU1LMSaJ+Xg== +"@abp/timeago@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0.tgz#45c1e8b1451e31910e330053981a871787fe02f1" + integrity sha512-3RVMlBbOepa4WBTLthRmf2VddkNwsjE+FNnaSUaMQ2ZQaXnghnZc4xZ3f3oKraGcWMgqpz1IfrWWV1POKRsEXw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" timeago "^1.6.7" -"@abp/utils@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0-rc.2.tgz#86a980c6536b3b5ce185d406723b28be421864ac" - integrity sha512-Oz863VNA8fraQ81vTvqM0IqwiaseLwfFU5QNn6iOGOfn5wQrEkPwtZ0jMI+DGNtJgPzoKiq+iKc3K+SiuVgldg== +"@abp/utils@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0.tgz#ef7f6bf16abb34b77fa57c156b264154827bc0af" + integrity sha512-UDgbvDMbcQklNu+SlQPhkIcIfZoWsQjCCzihanLBiHc474BCOlcTsO6K/EatV9LwqG3zY0mYd0ExAWjH44G0rQ== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json index 882508c4e3..a73a3b9523 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0-rc.2", - "@abp/cms-kit": "10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0", + "@abp/cms-kit": "10.1.0" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock index 97b79e0912..e4a8c88818 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,293 +2,293 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0-rc.2.tgz#599f5c47a417d1230fc17c0446a0229f920f7246" - integrity sha512-8F4nEK+VtgRRf8n+66HMbtCEaOMCW/OdbSEWRl9ahMNoj860oPIJ8P8Qn/2+LjtkPMdDAfCdEzyDzCd3igaFaA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0-rc.2.tgz#e5056e4e159f5815e3cffecab5c46f3d7d4f79d7" - integrity sha512-bo56XzQZPYL/3ckWTTTSSUsSFSFJobvfE29cz13NIrZ/tBtWyQCAJn92wYHuY+6IezYUWb4ga3PkFeHRzR142A== - dependencies: - "@abp/aspnetcore.mvc.ui" "~10.1.0-rc.2" - "@abp/bootstrap" "~10.1.0-rc.2" - "@abp/bootstrap-datepicker" "~10.1.0-rc.2" - "@abp/bootstrap-daterangepicker" "~10.1.0-rc.2" - "@abp/datatables.net-bs5" "~10.1.0-rc.2" - "@abp/font-awesome" "~10.1.0-rc.2" - "@abp/jquery-form" "~10.1.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~10.1.0-rc.2" - "@abp/lodash" "~10.1.0-rc.2" - "@abp/luxon" "~10.1.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~10.1.0-rc.2" - "@abp/moment" "~10.1.0-rc.2" - "@abp/select2" "~10.1.0-rc.2" - "@abp/sweetalert2" "~10.1.0-rc.2" - "@abp/timeago" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0-rc.2.tgz#e25d3575d40bfcb3f809bd2d355671181ee5ff40" - integrity sha512-MOF86bVbi7N/nIla+361nsBrN4tiSka8xzpWcgqlLcCAl9ILG4rugbtafBAjN81taPma2peZM7egaOR4SDkTMw== +"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0.tgz#94f68982ce8b67b6ac827f824aed3faad50e56e9" + integrity sha512-wqbEANW8CRZ+/7qGNprC828yNN17TsYtFxywL0B+EA2UfUtcTpzR/3ompZd/XcDm3N2NmS1n5Ao3WEn2NJlHgA== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0.tgz#b89c5d38fdeceda9e421f9357842838be36dce49" + integrity sha512-9QyZ7lYr17thTKxq9WN/KVCxNyYurY5Ph9y3vFBkA3u+uOZcaxdw0T417vy0hJvAB7RGlkpLRTmZL7q5P9FzJA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.1.0" + "@abp/bootstrap" "~10.1.0" + "@abp/bootstrap-datepicker" "~10.1.0" + "@abp/bootstrap-daterangepicker" "~10.1.0" + "@abp/datatables.net-bs5" "~10.1.0" + "@abp/font-awesome" "~10.1.0" + "@abp/jquery-form" "~10.1.0" + "@abp/jquery-validation-unobtrusive" "~10.1.0" + "@abp/lodash" "~10.1.0" + "@abp/luxon" "~10.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.1.0" + "@abp/moment" "~10.1.0" + "@abp/select2" "~10.1.0" + "@abp/sweetalert2" "~10.1.0" + "@abp/timeago" "~10.1.0" + +"@abp/aspnetcore.mvc.ui@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0.tgz#79d76232aacb9c8e1762d903f75007d0418bf5a8" + integrity sha512-brVfaSUicZuSuwtizrEcMvtRjFsoAHr9i56HjJZb7bmElr+q5STiul3stRumly4IfoLkYqdy85hMk+B3G0bJDg== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0-rc.2.tgz#be80c6104ba53e18935fbf62ca2c1890f4b2fde4" - integrity sha512-BNcDYUSbZaLah4SfXm0efoqFTsOViVm6370k9L7vix/OGpIWwklJsr8y78lvdM5ANgNCfl0LPSq+seLJFc/OLA== +"@abp/bootstrap-datepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0.tgz#68270ed8cf8e0c23a77331ef2ba6ef2d1da3cefc" + integrity sha512-ahKKHlluo4U1Z238mBNzpL0YaErTPENLQDVLNZB1BnZcUTqz1j7WJHGZoy4j3CXZKt7mnFCRe1+vJMCcwP+DYA== dependencies: bootstrap-datepicker "^1.10.1" -"@abp/bootstrap-daterangepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0-rc.2.tgz#f189f7d070ebd97d9cfdcb99571cab2d6a198ab5" - integrity sha512-bV8J0MuiAFVLkr48JsB6aZU6aPoqw+Gyhq1szQ74bEwNQlRBPuF92WVA5FACaUBj8dMUzR9HDDAYQuxUzpKYKA== +"@abp/bootstrap-daterangepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0.tgz#69f7775eafe7c038c2684d3e990384c8f2966cff" + integrity sha512-mFMaH7GqPn7W5zzIMOOTl4f0at9Vx8da4ewvPU/IvngrTeezMRPC1tofHmiWDhHfZpzF5J9DDMCGul9Q4nOl5A== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0-rc.2.tgz#2300800a29ea09b91f5ed2e6177e5921fe7d2a0f" - integrity sha512-K+tDI9vz/Y9B/yu0i3AVpm4v3Odi44Q/yH5hAprL7f4pGxEOiqAFB/qzHAxG+7Oa7wjv5tPLv+Cz4DavBQjd8Q== +"@abp/bootstrap@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0.tgz#816436ab547fc46d4c00b1facbdd80e3f4f78af1" + integrity sha512-ioqQDOvjXIUWncmLJuTcLPTnlJ3xGxyKXC9veSTJWFd+5pZswK7/QIlAuTvIIujs/7Z13GLunUIMMjny7WFBMw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" bootstrap "^5.3.8" -"@abp/clipboard@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.1.0-rc.2.tgz#e99dbf190e3684e99c8e909bf38201c70e267502" - integrity sha512-kRS9pWc1jRgr4D4/EV9zdAy3rhhGBrcqk2as5+6Ih49npsEJY/cF5mYH7mj/ZYy8SHqtae/CR7bZsR+uCDKYrQ== +"@abp/clipboard@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.1.0.tgz#a59b14370b99fd7df447250b293fd7ac3f8c1a51" + integrity sha512-OulNwy9vhASO8TJ+m0ql6/iXNflE59oGUNAW+qzcaxaazre1mVPahPMBoLSVuOAGtAjLZAN4SWCOC5r3tLt9pA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" clipboard "^2.0.11" -"@abp/cms-kit.admin@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-10.1.0-rc.2.tgz#554d15856007e80cc2994d57612d08e3d6747e3e" - integrity sha512-mi9m4Nr51wyq/EN8DRMT/QlSqgIwD7WKDDSO80Tylr46r5A7wiGbgNIyy+hnHCR9IbORpTRv8VjMTtkjF7CRPA== +"@abp/cms-kit.admin@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-10.1.0.tgz#4dda82b946ad9b94ffdeb12f399ec3294dbf5dc2" + integrity sha512-edWNeHnwPb9ZlV+EIcASAOXk/gJxekDEC5X2R6Mx5m9zq2oq4yoJj5/ZBlvekxnm6CRgXhUn3RYX4+h9qExTzQ== dependencies: - "@abp/codemirror" "~10.1.0-rc.2" - "@abp/jstree" "~10.1.0-rc.2" - "@abp/markdown-it" "~10.1.0-rc.2" - "@abp/slugify" "~10.1.0-rc.2" - "@abp/tui-editor" "~10.1.0-rc.2" - "@abp/uppy" "~10.1.0-rc.2" + "@abp/codemirror" "~10.1.0" + "@abp/jstree" "~10.1.0" + "@abp/markdown-it" "~10.1.0" + "@abp/slugify" "~10.1.0" + "@abp/tui-editor" "~10.1.0" + "@abp/uppy" "~10.1.0" -"@abp/cms-kit.public@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-10.1.0-rc.2.tgz#1e25575fa7dde2661970942c868250f749ffcf7e" - integrity sha512-BbEL17D0k44+P1pBfmrRwhwukXqbggprl8DWBofBkPut1HUmo1iaD4NrMEG5NZC03L8LRDVNm3hx2zI1voF9Sg== +"@abp/cms-kit.public@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-10.1.0.tgz#ad84ccfe4508a64c62e628392f9c317e49a6bec4" + integrity sha512-6bLdv75EaRS1R08tHITXmO805u84EHG32IczgcWKzewaloUeYJear1Gucezt0SpVOzAHW9fkHzC9LAnQM+8nVQ== dependencies: - "@abp/highlight.js" "~10.1.0-rc.2" - "@abp/star-rating-svg" "~10.1.0-rc.2" + "@abp/highlight.js" "~10.1.0" + "@abp/star-rating-svg" "~10.1.0" -"@abp/cms-kit@10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-10.1.0-rc.2.tgz#18d0818a07a530fccb23fa082db24e439854e94a" - integrity sha512-cwraU613er9EybLoU9wXiqfFFBjSyk/DnbZkAviavOLg+QRTFdDoJEVTPpNn6WCXc1oS5/LPuu/744MrGixYyw== +"@abp/cms-kit@10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-10.1.0.tgz#3af788dd38de56bbdf10ca6a7bd6d0a15da098a8" + integrity sha512-qzJ5EJCR8/OnlyTRqkaDZjuxi7Vzm65zDIWQ6mvGp6c5a3UuIN40DOU9glT9QC4MyA5+/1vMBUJK+ad5G0eKHA== dependencies: - "@abp/cms-kit.admin" "~10.1.0-rc.2" - "@abp/cms-kit.public" "~10.1.0-rc.2" + "@abp/cms-kit.admin" "~10.1.0" + "@abp/cms-kit.public" "~10.1.0" -"@abp/codemirror@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-10.1.0-rc.2.tgz#8a55a66c8be83995045bc2724ca02c29771283a3" - integrity sha512-8jlMySyFTNnDJvQLqZgj7S0EZ0oGWoplDFDE6zEP7NBK8INzrw7D7lc93XZ8/G7lRh0xeM1OcziUHZEX/QhXNg== +"@abp/codemirror@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-10.1.0.tgz#3fdc99c1e19af844b4737b49ec8deda7db346148" + integrity sha512-zkFLXyqGV6aksiFbkVQQFceRt7YirLB/LtY6njn+eMMlXMLHsQxX8G3p5xVSUj+Mr+HWcZ4sHDwIebiV29dvLg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" codemirror "^5.65.1" -"@abp/core@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0-rc.2.tgz#403687aff5a30788f7b7ca660abdfd85d89438aa" - integrity sha512-euuG2Hna/DT6/R1dGOjgp3vcehYtF+CcOkRj31oquYKaM5YWk4OaZ314DSpnjgs/xo8DuVc4eKFQwIxD9RK41w== +"@abp/core@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0.tgz#7cb21012deee5510a0774d982f85627d47b368f4" + integrity sha512-/N0K2NVdk5/OM+Q5JDnpC+0CD0mS4wpDhLO1SIQbMXSTFbplhfPw2SFm7+MvPA9pVx2L8TYAzXmS7CtAJxKvCg== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.1.0" -"@abp/datatables.net-bs5@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0-rc.2.tgz#a60650d1802b40751d30f8f6c56beb23fd66481b" - integrity sha512-IWwexNqbMpET54Fvm9LoPTJYf+4CoBbjFOvz3sL6CgO2feV5R5fKigjVU8zXKNh2W+RG8L6zEarfVxrr114TsA== +"@abp/datatables.net-bs5@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0.tgz#ea2a60c22bdcc80882662b9f55f198793f6ea556" + integrity sha512-dPe3bVW3Hfnm/X9Bw5k7TuEIsYYwFk1faC8kIxf2Spk+4Z9TdYFS2zGaHBYStE9iRtKmneNYMykG2O88mX3quA== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.1.0" datatables.net-bs5 "^2.3.4" -"@abp/datatables.net@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0-rc.2.tgz#9147f68bc6dbc4eb40a9ddf65c7859e788cdcac2" - integrity sha512-a9DJpwg14S4nVOiC4ipw0CQwEYWB602e2gCJiH7W1mxopbQb135RxwhtdTnW//eIONcxC9IrEuvcBEAUVt2B7Q== +"@abp/datatables.net@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0.tgz#7fe641883e6d1417c86a030481777a75c9a5a555" + integrity sha512-p9S/ZaJ4OXpihTOWIxsSQ0s3G4S+ScQLD+Q+w0NrWbUa7HTKg9tdqSh6VDhyW9KZ/iiLUO5jNzsAFXyUjjDQuw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" datatables.net "^2.3.4" -"@abp/font-awesome@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0-rc.2.tgz#364466cfe67e41e0c4d16b57d3923d10f66369f1" - integrity sha512-F1Jy8xoFV2aA+VN+NH1gtrG96/j9w7Picc+KLoCoIyNnJr/xJur11XkJyu5ln8KF4V7p/DY7QaQodWV/btOs8g== +"@abp/font-awesome@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0.tgz#79c5b7eb9a85467b0078b9f9bf201493fc3de358" + integrity sha512-dm4VRtZnvm5p8mYQys9KWLkQ+JdwPahQSan2DV1s5Rq4P96hk8p8VshZu7pI3iE0MS+rSZnXYvetZrqCdt1mOQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@fortawesome/fontawesome-free" "^7.0.1" -"@abp/highlight.js@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-10.1.0-rc.2.tgz#6ad0e1ef9e49f0f90eba9d899fd72b6c30a4f9f0" - integrity sha512-jAX4p+i3secAaI3waXoMr7yoH6G1nWvcjR5UVin168H7I4UySxbF799T89v5tK8gtfWgaTjEydFZRypSQU/dHg== +"@abp/highlight.js@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-10.1.0.tgz#b0a798ccdd71b437710978d1ced794c178de6b7c" + integrity sha512-kyDjTkLwkDEBY0jqpPf5KmZWmzJQPsPto4TidX9GG7U8e+biFK4MF/gtPUjjFs9POTQ585AKfk0U/xDjhr42qg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@highlightjs/cdn-assets" "~11.11.1" -"@abp/jquery-form@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0-rc.2.tgz#3857717d07569c22d4bbbe459238abeb816d606a" - integrity sha512-2D5WHVnfK9bhRces1tgPwOEoc7KCYKYiKHBOcqct+LTA7zoRjJv/PM8/JhFVl+grVIw1aSwO4tU3YfZ22Vxipg== +"@abp/jquery-form@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0.tgz#7c19605eb103519fea332d0f153cac185b7f2ebb" + integrity sha512-ddlapZqFVwpXU3uDi/RnQ6uSpseMxPAKE+/LgLF+SVyPzazNFognxPT3ztzqTk84P/gFleNgNjAfUlKrfyIfGw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0-rc.2.tgz#efd7b69a078a20c0bf405408dbdf52a7bf770b3b" - integrity sha512-tZ0MWgzBqp+SNfMxM0z2cGB21NiTHuVJyyQaXKE/ptuD5pc0uRkcqw/J2kWfiqsoVgChz27IB6h8/jqDafS4qg== +"@abp/jquery-validation-unobtrusive@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0.tgz#13aa462c4347d3459541a9a9ea19a60458805328" + integrity sha512-94smwn/W3d+gkX2UKH+/OiB7poKDP1ZK0DqWiiH4BGGmpRk9j3B+eJxPbL86dwNG4XT8upuX3ZOrUb6Fy2SA3A== dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0-rc.2.tgz#d39537a7356c51f9db2e66f6740cf6df86bd0442" - integrity sha512-LOkS0NKk4pLtLjPU0CCbwROyUg6EtJN8Z/it7QuKK1CIRfYYcAStgNnNm5geZP7CqECIkoiFfgWjI+L5Z9/Tfg== +"@abp/jquery-validation@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0.tgz#5389785f5ff359ecd6291889420d6c2f84e633aa" + integrity sha512-/X5smp0xpNqCM+BuLI9eEyMPQ0uF42hmEfBvCIfWWBhfp7uFfq7sS706QcGfXYqFdpprRYoUJGKDfSaHxPaJUA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0-rc.2.tgz#101a55f70d510978c8c05f5857d0e9d4965263f7" - integrity sha512-bQV1uFWGtwRYjNOsqJ8FM2004idX2Jj7YVL19YF1/PjyPUSMX+s8/IvJizBjyY5hPAiWBBhmV9g+IFWzxlDQoQ== +"@abp/jquery@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0.tgz#d8812a7d410ad959a1ed27696beb9b7885142684" + integrity sha512-cVF2hOP6GGp0N3VMBOFjEHuHFgXbDH8x0d7Agw4DN2ydFU8wYuj3m9u0HCc0aoBG6Zls90tMpTfM0RqDNFgCKA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" jquery "~3.7.1" -"@abp/jstree@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-10.1.0-rc.2.tgz#0b145af388ca527b107464ff706c5f901344a094" - integrity sha512-RmKRKVuQBhemapF4wmNVOZfDxBSjqKoSRL/Y0Sbyqx86Qg/HYpFZD1zQgaH6NFwUOpwB4wVJRBHV5r7i4LxxyQ== +"@abp/jstree@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-10.1.0.tgz#479c59a97f5a1dda4f035207dde5023005b6f8b4" + integrity sha512-4gu433xPpxTysA/oe11dbRG1/3Oa76ABThlD4UPA40Ep7k/I6PzHbQGRhUrzm2ygvAboTiApFXW1gj4uk3oq/w== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jstree "^3.3.17" -"@abp/lodash@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0-rc.2.tgz#d08c03f8d3d0fbaa3e71e603cbe5fb7f176933ef" - integrity sha512-KCnD1p2y52ZI+2ifpiFIUAiDPsKehnOD8HV5qKeObO6UCP97okif8IP+sQDmNQb8O33y/NKTyx/HcpwBbe/NYQ== +"@abp/lodash@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0.tgz#fdebe764d1142abfd3ecdeef56aa33746e31815b" + integrity sha512-r4WwpqLFFQi721edd8XF5wueAdqEvx75dmRlEuhZoIBA6RQ0yYjTRMNWjTOlIEzFDGj7XrisV5CSUQ9BhhuS+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" lodash "^4.17.21" -"@abp/luxon@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0-rc.2.tgz#ef8d2b323bac054fc9610e241e1b1763d229e065" - integrity sha512-qYFl6XO3g9mZiu0dtIczI7LRuYWwc+RkpbDzSmruXcRks3KA+ZZco2vhHNnlwtXcINl/TXtbW7Wc0MX+8IB1Kw== +"@abp/luxon@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0.tgz#c80cdb1a85e9cc824946dc0009df0daba384a4ca" + integrity sha512-slwiGSrevvWZrBhuy9sw7UP6akk2Ln9eAY3nxxo8xzE7C7uezcNk12dbKN4psdSAVpbDwuqC3GGrkmcFL+6sBQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" luxon "^3.7.2" -"@abp/malihu-custom-scrollbar-plugin@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0-rc.2.tgz#dfaf666442c7c122f7da72c83b9adf194d5b6ec8" - integrity sha512-PudMHmNQgZ6JZeaVt1ZoXLqO0UZXJzUYiBah2LDkC4EMLjnMJFINHBoEVVa4ooXH0yjFv+zsbN0vWZYJ8TBJIA== +"@abp/malihu-custom-scrollbar-plugin@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0.tgz#d257e83b7cc1af89a708e365eef7af0136ccebcf" + integrity sha512-+h8hoYUkjcYBdm/M3b8c3CeE5WNU8K6kQ5MwQXNaaGLCvwEmZHy0A6+U8yxtKv2eRRhAkAqOkQyWYRWA5w1XzQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/markdown-it@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-10.1.0-rc.2.tgz#43865464fb44f470baf30296712a5f007ff9730d" - integrity sha512-R45uA/EfMEZSkWchdpE/epOPsjswuQDB+IyBdwil2kKe3Bfv3yIh8+GSU5hfhiArXmRbhcmNGdeTylXWhrInbw== +"@abp/markdown-it@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-10.1.0.tgz#a768c084091dda85d78a9269de31fdbb54431c62" + integrity sha512-vjcTEuC367p2prqJ8/jVni4zZN/Bb+UU5K1JHbgEub3Z9MGNmJvZli95vdiROTm/Pq2pw1BFOERquDb7qolybg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" markdown-it "^14.1.0" -"@abp/moment@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0-rc.2.tgz#610a1592d13984aea51abbd13df8c5995a089149" - integrity sha512-ep8PnAXARw0t/wtGOVp/oiNhF3B0Bh6y2vRzKrcSoyXAQREGGm4fJdZVYZLGTfI4lFLTjebEgf4O7T9feUwJAw== +"@abp/moment@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0.tgz#5755e4e10a7302e2832b1a1ce571f20b27600303" + integrity sha512-faHV7vmPEjFUJTRNTTlmnpx0VZuyvQt4O98WBLAjPdcqpLfWazdS9Ro405St5liIkgvmAXWsrwVmZb0VKTLcNA== dependencies: moment "^2.30.1" -"@abp/prismjs@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.1.0-rc.2.tgz#8565bab503a16fc349f4b0fa2609ad412ff838be" - integrity sha512-SmZWMyJ3cJW+qj4CWJ7y2kD6PMx2zfZMA5X5jPunsytG4Eht4AVyIR38Y4QSpO62zZgkHyZlSTFOozBfhrlv9A== +"@abp/prismjs@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.1.0.tgz#632e06b47a9ac11d0131d06a270b97292266df47" + integrity sha512-iqXB3bgrlXDyfuFr23R2JtfN0Ij3ai81KkWM3oc3QikKaCwAHtiU0ZvshRlL9y3YfwjlNpYYFLE4en2xx1xThQ== dependencies: - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/core" "~10.1.0-rc.2" + "@abp/clipboard" "~10.1.0" + "@abp/core" "~10.1.0" prismjs "^1.30.0" -"@abp/select2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0-rc.2.tgz#40c5418d007fc36817eecbe6388d767e4e7ca887" - integrity sha512-Pq0wlpL01sWRLUg5um3JtBXIqi3mmbwPwvgxP8hFbQngAt9JXAK8geNRiTMrIZgtW/ycXtM1v6I4zuWOLOeAGg== +"@abp/select2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0.tgz#8b15954e462e65329b8eb481226170df6d55d36a" + integrity sha512-7+1GirZe4i/2/LR4jZgWhiN6lFHhClLtUmrdCjh7FeeuBvy5GGA417DybDihna/GzlcOVI4GHnn2fjEwcFqJiw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" select2 "^4.0.13" -"@abp/slugify@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-10.1.0-rc.2.tgz#42389b8471f4aacd340bebe664994b778eb335ab" - integrity sha512-jhLEqxPpitTfwJgHW21urQnvP3NU+/hXZXzmnT6ZPBw7pVpbN2m1hDOm+JC+zKkLaa3WQ23rE9ewwrnJaoQ67w== +"@abp/slugify@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-10.1.0.tgz#779cacb32f389acb9563ae562aaf29d1049a02cf" + integrity sha512-W7F6jimH1iuWc1zzn9nZlylimFtW6lGMuj0KEzkmhxkthapqm1VDaY43HaV6wCvZGEQG7scAQbzY3VvJ8WA/tw== dependencies: slugify "^1.6.6" -"@abp/star-rating-svg@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-10.1.0-rc.2.tgz#d1754352cc3af1f42577de19e18350b289685e68" - integrity sha512-3Io7LMSnjQtc1b5CP1nZ8ucvXfq262PGMTHhwgM30xnvO9HJbtnppCmwVTbhZBQigKQFnySUKmccQbGjoqnN4A== +"@abp/star-rating-svg@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-10.1.0.tgz#f8a2cc268adf31979dbd8bb4900613be74f7abf7" + integrity sha512-AmHKEbVZNZALhRaFHaGweBcp/lyBLTr8Br5hemGRcFm9tyYtnkPrhY7a/By59gjttOYAFHjqa+scs5HP7unCfg== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0-rc.2.tgz#d35858c69e10c6726b02cdfcea88dfc32385963f" - integrity sha512-s9VPRToohN45uzHcKCF5Mcj8FVjsXcXUb0U3tuaT/Y+u4adHB3fBxYiXJFM0sVsCJ81dFktxwka40Wm8Taz/zA== +"@abp/sweetalert2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0.tgz#6997cb7909671f9deddaea53f17ed054aab27cd3" + integrity sha512-vlkH+DkuQBvOqnDPqTtyZ5mHb+GfIR/QJBXI7yrS62ML+ZNqkg0vXftCrm4aAR2kPmvgYsbUOJcKJAmgydcOEQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" sweetalert2 "^11.23.0" -"@abp/timeago@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0-rc.2.tgz#98d630cc3843eee64dbcc34fb8ca5afbab034718" - integrity sha512-vJmk+otyXXJE2s2J8iYpLVaFuNAYnIUSOitmi7umYnL+k/UE2KQhBXU7FR0/OBY9mAZYd+shaiGIU1LMSaJ+Xg== +"@abp/timeago@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0.tgz#45c1e8b1451e31910e330053981a871787fe02f1" + integrity sha512-3RVMlBbOepa4WBTLthRmf2VddkNwsjE+FNnaSUaMQ2ZQaXnghnZc4xZ3f3oKraGcWMgqpz1IfrWWV1POKRsEXw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" timeago "^1.6.7" -"@abp/tui-editor@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-10.1.0-rc.2.tgz#ebbd5bad1ee180a0c6e6a9cfd894499614a71e96" - integrity sha512-k5V+5ZE+HZebfyXLzddRQDGri3HP7wSjDXEbSMLTgxZTem7IzksyLWLAN/woKRzWX92BJXcsmR8T1rhuMhohhA== +"@abp/tui-editor@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-10.1.0.tgz#3f0556f918a239da9c048bf96f7c6703cff1f796" + integrity sha512-cIpNiIvxkUUzk9TnyhP3wBcsrCcgTFOlqhRWowyq9Kt7iVqoKb6vkCflxKt1oxkLZVBI7qOJGx2o5KmSYFcWiQ== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - "@abp/prismjs" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" + "@abp/prismjs" "~10.1.0" -"@abp/uppy@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-10.1.0-rc.2.tgz#1b9ca53eda178e8ea5d14573da15b9c141a89fc0" - integrity sha512-QHgTiVaZKZrnNigyE1F7OR3Tdtjdq6tjm164HWAPJSJOUbcv6v498Q7DWS2dIZMU2e/226HflS2NwwNV87s3XA== +"@abp/uppy@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-10.1.0.tgz#8a78ee9c95432be60aa076d84fc7d801df89ae3f" + integrity sha512-9ySUpG/TBMQDDA7G15tkQl25XRqTjI0diUzETmk7mgnv2MonEJHmBQ8GlGuSBVyvx2Ie7Oq5D8P2uHjrwsA76w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" uppy "^5.1.2" -"@abp/utils@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0-rc.2.tgz#86a980c6536b3b5ce185d406723b28be421864ac" - integrity sha512-Oz863VNA8fraQ81vTvqM0IqwiaseLwfFU5QNn6iOGOfn5wQrEkPwtZ0jMI+DGNtJgPzoKiq+iKc3K+SiuVgldg== +"@abp/utils@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0.tgz#ef7f6bf16abb34b77fa57c156b264154827bc0af" + integrity sha512-UDgbvDMbcQklNu+SlQPhkIcIfZoWsQjCCzihanLBiHc474BCOlcTsO6K/EatV9LwqG3zY0mYd0ExAWjH44G0rQ== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKitPageRouteValueTransformer.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKitPageRouteValueTransformer.cs index 996a449489..82750943c0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKitPageRouteValueTransformer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKitPageRouteValueTransformer.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; +using Volo.Abp.Auditing; using Volo.Abp.Caching; using Volo.Abp.Features; using Volo.Abp.MultiTenancy; @@ -16,18 +17,21 @@ public class CmsKitPageRouteValueTransformer : CmsKitDynamicRouteValueTransforme protected IFeatureChecker FeatureChecker { get; } protected IPagePublicAppService PagePublicAppService { get; } protected IDistributedCache PageCache { get; } + protected IAuditingHelper AuditingHelper { get; } public CmsKitPageRouteValueTransformer( ICurrentTenant currentTenant, ITenantConfigurationProvider tenantConfigurationProvider, IFeatureChecker featureChecker, IPagePublicAppService pagePublicAppService, - IDistributedCache pageCache) + IDistributedCache pageCache, + IAuditingHelper auditingHelper) : base(currentTenant, tenantConfigurationProvider) { FeatureChecker = featureChecker; PagePublicAppService = pagePublicAppService; PageCache = pageCache; + AuditingHelper = auditingHelper; } protected async override ValueTask DoTransformAsync(HttpContext httpContext, RouteValueDictionary values) @@ -44,7 +48,10 @@ public class CmsKitPageRouteValueTransformer : CmsKitDynamicRouteValueTransforme var exist = await PageCache.GetAsync(PageCacheItem.GetKey(slug)) != null; if (!exist) { - exist = await PagePublicAppService.DoesSlugExistAsync(slug); + using (AuditingHelper.DisableAuditing()) + { + exist = await PagePublicAppService.DoesSlugExistAsync(slug); + } } if (exist) diff --git a/modules/docs/app/VoloDocs.Web/Pages/Error.cshtml.cs b/modules/docs/app/VoloDocs.Web/Pages/Error.cshtml.cs index 5e5c4f639b..88ed671381 100644 --- a/modules/docs/app/VoloDocs.Web/Pages/Error.cshtml.cs +++ b/modules/docs/app/VoloDocs.Web/Pages/Error.cshtml.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Frozen; using System.Collections.Generic; using System.Net; using Microsoft.AspNetCore.Diagnostics; @@ -48,7 +49,7 @@ namespace VoloDocs.Web.Pages #region Error Messages /*For more ASCII arts http://patorjk.com/software/taag/#p=display&h=0&f=Big&t=400*/ - private readonly Dictionary _errorMessages = new Dictionary + private readonly FrozenDictionary _errorMessages = new Dictionary { { 400, @" @@ -131,7 +132,7 @@ Ooops! Our server is experiencing a mild case of the hiccups." Looks like we're having some server issues." } - }; + }.ToFrozenDictionary(); #endregion } } \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index 0a0a8f4726..d021405fe4 100644 --- a/modules/docs/app/VoloDocs.Web/package.json +++ b/modules/docs/app/VoloDocs.Web/package.json @@ -3,7 +3,7 @@ "name": "volo.docstestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0-rc.2", - "@abp/docs": "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0", + "@abp/docs": "~10.1.0" } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index e99b91ff81..888fc2dd90 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,229 +2,229 @@ # yarn lockfile v1 -"@abp/anchor-js@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-10.1.0-rc.2.tgz#5ed35c420ec53f9e305e9de943ebb005677d7617" - integrity sha512-D8rH9p8gGbNc6FpW24CFFW9JZD7tUiJkM3Lx31RsygwvmlolutN4jpzV5L9h9IvbrxJCT2jSqK1s686z8SHb3w== +"@abp/anchor-js@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-10.1.0.tgz#c0032fde0d2cd94824bba8042eb4fe3dbbd3ff0c" + integrity sha512-mVDGemNe2uiwgjGR5YgGQBy11zTNu9dm1W/PEGXbW1rQ3Ba5OAJknhdrcoCBnsfvYnSL4XLoJKKI+ZqqWDHSxw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" anchor-js "^5.0.0" -"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0-rc.2.tgz#599f5c47a417d1230fc17c0446a0229f920f7246" - integrity sha512-8F4nEK+VtgRRf8n+66HMbtCEaOMCW/OdbSEWRl9ahMNoj860oPIJ8P8Qn/2+LjtkPMdDAfCdEzyDzCd3igaFaA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0-rc.2.tgz#e5056e4e159f5815e3cffecab5c46f3d7d4f79d7" - integrity sha512-bo56XzQZPYL/3ckWTTTSSUsSFSFJobvfE29cz13NIrZ/tBtWyQCAJn92wYHuY+6IezYUWb4ga3PkFeHRzR142A== - dependencies: - "@abp/aspnetcore.mvc.ui" "~10.1.0-rc.2" - "@abp/bootstrap" "~10.1.0-rc.2" - "@abp/bootstrap-datepicker" "~10.1.0-rc.2" - "@abp/bootstrap-daterangepicker" "~10.1.0-rc.2" - "@abp/datatables.net-bs5" "~10.1.0-rc.2" - "@abp/font-awesome" "~10.1.0-rc.2" - "@abp/jquery-form" "~10.1.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~10.1.0-rc.2" - "@abp/lodash" "~10.1.0-rc.2" - "@abp/luxon" "~10.1.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~10.1.0-rc.2" - "@abp/moment" "~10.1.0-rc.2" - "@abp/select2" "~10.1.0-rc.2" - "@abp/sweetalert2" "~10.1.0-rc.2" - "@abp/timeago" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0-rc.2.tgz#e25d3575d40bfcb3f809bd2d355671181ee5ff40" - integrity sha512-MOF86bVbi7N/nIla+361nsBrN4tiSka8xzpWcgqlLcCAl9ILG4rugbtafBAjN81taPma2peZM7egaOR4SDkTMw== +"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0.tgz#94f68982ce8b67b6ac827f824aed3faad50e56e9" + integrity sha512-wqbEANW8CRZ+/7qGNprC828yNN17TsYtFxywL0B+EA2UfUtcTpzR/3ompZd/XcDm3N2NmS1n5Ao3WEn2NJlHgA== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0.tgz#b89c5d38fdeceda9e421f9357842838be36dce49" + integrity sha512-9QyZ7lYr17thTKxq9WN/KVCxNyYurY5Ph9y3vFBkA3u+uOZcaxdw0T417vy0hJvAB7RGlkpLRTmZL7q5P9FzJA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.1.0" + "@abp/bootstrap" "~10.1.0" + "@abp/bootstrap-datepicker" "~10.1.0" + "@abp/bootstrap-daterangepicker" "~10.1.0" + "@abp/datatables.net-bs5" "~10.1.0" + "@abp/font-awesome" "~10.1.0" + "@abp/jquery-form" "~10.1.0" + "@abp/jquery-validation-unobtrusive" "~10.1.0" + "@abp/lodash" "~10.1.0" + "@abp/luxon" "~10.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.1.0" + "@abp/moment" "~10.1.0" + "@abp/select2" "~10.1.0" + "@abp/sweetalert2" "~10.1.0" + "@abp/timeago" "~10.1.0" + +"@abp/aspnetcore.mvc.ui@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0.tgz#79d76232aacb9c8e1762d903f75007d0418bf5a8" + integrity sha512-brVfaSUicZuSuwtizrEcMvtRjFsoAHr9i56HjJZb7bmElr+q5STiul3stRumly4IfoLkYqdy85hMk+B3G0bJDg== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0-rc.2.tgz#be80c6104ba53e18935fbf62ca2c1890f4b2fde4" - integrity sha512-BNcDYUSbZaLah4SfXm0efoqFTsOViVm6370k9L7vix/OGpIWwklJsr8y78lvdM5ANgNCfl0LPSq+seLJFc/OLA== +"@abp/bootstrap-datepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0.tgz#68270ed8cf8e0c23a77331ef2ba6ef2d1da3cefc" + integrity sha512-ahKKHlluo4U1Z238mBNzpL0YaErTPENLQDVLNZB1BnZcUTqz1j7WJHGZoy4j3CXZKt7mnFCRe1+vJMCcwP+DYA== dependencies: bootstrap-datepicker "^1.10.1" -"@abp/bootstrap-daterangepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0-rc.2.tgz#f189f7d070ebd97d9cfdcb99571cab2d6a198ab5" - integrity sha512-bV8J0MuiAFVLkr48JsB6aZU6aPoqw+Gyhq1szQ74bEwNQlRBPuF92WVA5FACaUBj8dMUzR9HDDAYQuxUzpKYKA== +"@abp/bootstrap-daterangepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0.tgz#69f7775eafe7c038c2684d3e990384c8f2966cff" + integrity sha512-mFMaH7GqPn7W5zzIMOOTl4f0at9Vx8da4ewvPU/IvngrTeezMRPC1tofHmiWDhHfZpzF5J9DDMCGul9Q4nOl5A== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0-rc.2.tgz#2300800a29ea09b91f5ed2e6177e5921fe7d2a0f" - integrity sha512-K+tDI9vz/Y9B/yu0i3AVpm4v3Odi44Q/yH5hAprL7f4pGxEOiqAFB/qzHAxG+7Oa7wjv5tPLv+Cz4DavBQjd8Q== +"@abp/bootstrap@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0.tgz#816436ab547fc46d4c00b1facbdd80e3f4f78af1" + integrity sha512-ioqQDOvjXIUWncmLJuTcLPTnlJ3xGxyKXC9veSTJWFd+5pZswK7/QIlAuTvIIujs/7Z13GLunUIMMjny7WFBMw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" bootstrap "^5.3.8" -"@abp/clipboard@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.1.0-rc.2.tgz#e99dbf190e3684e99c8e909bf38201c70e267502" - integrity sha512-kRS9pWc1jRgr4D4/EV9zdAy3rhhGBrcqk2as5+6Ih49npsEJY/cF5mYH7mj/ZYy8SHqtae/CR7bZsR+uCDKYrQ== +"@abp/clipboard@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.1.0.tgz#a59b14370b99fd7df447250b293fd7ac3f8c1a51" + integrity sha512-OulNwy9vhASO8TJ+m0ql6/iXNflE59oGUNAW+qzcaxaazre1mVPahPMBoLSVuOAGtAjLZAN4SWCOC5r3tLt9pA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" clipboard "^2.0.11" -"@abp/core@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0-rc.2.tgz#403687aff5a30788f7b7ca660abdfd85d89438aa" - integrity sha512-euuG2Hna/DT6/R1dGOjgp3vcehYtF+CcOkRj31oquYKaM5YWk4OaZ314DSpnjgs/xo8DuVc4eKFQwIxD9RK41w== +"@abp/core@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0.tgz#7cb21012deee5510a0774d982f85627d47b368f4" + integrity sha512-/N0K2NVdk5/OM+Q5JDnpC+0CD0mS4wpDhLO1SIQbMXSTFbplhfPw2SFm7+MvPA9pVx2L8TYAzXmS7CtAJxKvCg== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.1.0" -"@abp/datatables.net-bs5@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0-rc.2.tgz#a60650d1802b40751d30f8f6c56beb23fd66481b" - integrity sha512-IWwexNqbMpET54Fvm9LoPTJYf+4CoBbjFOvz3sL6CgO2feV5R5fKigjVU8zXKNh2W+RG8L6zEarfVxrr114TsA== +"@abp/datatables.net-bs5@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0.tgz#ea2a60c22bdcc80882662b9f55f198793f6ea556" + integrity sha512-dPe3bVW3Hfnm/X9Bw5k7TuEIsYYwFk1faC8kIxf2Spk+4Z9TdYFS2zGaHBYStE9iRtKmneNYMykG2O88mX3quA== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.1.0" datatables.net-bs5 "^2.3.4" -"@abp/datatables.net@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0-rc.2.tgz#9147f68bc6dbc4eb40a9ddf65c7859e788cdcac2" - integrity sha512-a9DJpwg14S4nVOiC4ipw0CQwEYWB602e2gCJiH7W1mxopbQb135RxwhtdTnW//eIONcxC9IrEuvcBEAUVt2B7Q== +"@abp/datatables.net@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0.tgz#7fe641883e6d1417c86a030481777a75c9a5a555" + integrity sha512-p9S/ZaJ4OXpihTOWIxsSQ0s3G4S+ScQLD+Q+w0NrWbUa7HTKg9tdqSh6VDhyW9KZ/iiLUO5jNzsAFXyUjjDQuw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" datatables.net "^2.3.4" -"@abp/docs@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-10.1.0-rc.2.tgz#ac8c84cdc91c3ac6511ff39f9d8729f0673a1d30" - integrity sha512-oTJX12kZb8CIXQRdjsZx8VYSOgKTA6ei+5CPU4dPVZZiaYBzQ3MNsMlRrrRywwuWCTJedtThy9XOcUwB7LTqCg== +"@abp/docs@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-10.1.0.tgz#6235c4ae843871b4679067e9f8d72ac595aa6bab" + integrity sha512-kZxdYAVC8uMK54QHEm7tIK9akd1AMnWpj9p7l9/9QpfMzm2Hg/nXxAzC8FVS8C6MyfwVbX9M3eqhI7lY4bw/Jg== dependencies: - "@abp/anchor-js" "~10.1.0-rc.2" - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~10.1.0-rc.2" - "@abp/popper.js" "~10.1.0-rc.2" - "@abp/prismjs" "~10.1.0-rc.2" + "@abp/anchor-js" "~10.1.0" + "@abp/clipboard" "~10.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.1.0" + "@abp/popper.js" "~10.1.0" + "@abp/prismjs" "~10.1.0" -"@abp/font-awesome@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0-rc.2.tgz#364466cfe67e41e0c4d16b57d3923d10f66369f1" - integrity sha512-F1Jy8xoFV2aA+VN+NH1gtrG96/j9w7Picc+KLoCoIyNnJr/xJur11XkJyu5ln8KF4V7p/DY7QaQodWV/btOs8g== +"@abp/font-awesome@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0.tgz#79c5b7eb9a85467b0078b9f9bf201493fc3de358" + integrity sha512-dm4VRtZnvm5p8mYQys9KWLkQ+JdwPahQSan2DV1s5Rq4P96hk8p8VshZu7pI3iE0MS+rSZnXYvetZrqCdt1mOQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@fortawesome/fontawesome-free" "^7.0.1" -"@abp/jquery-form@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0-rc.2.tgz#3857717d07569c22d4bbbe459238abeb816d606a" - integrity sha512-2D5WHVnfK9bhRces1tgPwOEoc7KCYKYiKHBOcqct+LTA7zoRjJv/PM8/JhFVl+grVIw1aSwO4tU3YfZ22Vxipg== +"@abp/jquery-form@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0.tgz#7c19605eb103519fea332d0f153cac185b7f2ebb" + integrity sha512-ddlapZqFVwpXU3uDi/RnQ6uSpseMxPAKE+/LgLF+SVyPzazNFognxPT3ztzqTk84P/gFleNgNjAfUlKrfyIfGw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0-rc.2.tgz#efd7b69a078a20c0bf405408dbdf52a7bf770b3b" - integrity sha512-tZ0MWgzBqp+SNfMxM0z2cGB21NiTHuVJyyQaXKE/ptuD5pc0uRkcqw/J2kWfiqsoVgChz27IB6h8/jqDafS4qg== +"@abp/jquery-validation-unobtrusive@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0.tgz#13aa462c4347d3459541a9a9ea19a60458805328" + integrity sha512-94smwn/W3d+gkX2UKH+/OiB7poKDP1ZK0DqWiiH4BGGmpRk9j3B+eJxPbL86dwNG4XT8upuX3ZOrUb6Fy2SA3A== dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0-rc.2.tgz#d39537a7356c51f9db2e66f6740cf6df86bd0442" - integrity sha512-LOkS0NKk4pLtLjPU0CCbwROyUg6EtJN8Z/it7QuKK1CIRfYYcAStgNnNm5geZP7CqECIkoiFfgWjI+L5Z9/Tfg== +"@abp/jquery-validation@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0.tgz#5389785f5ff359ecd6291889420d6c2f84e633aa" + integrity sha512-/X5smp0xpNqCM+BuLI9eEyMPQ0uF42hmEfBvCIfWWBhfp7uFfq7sS706QcGfXYqFdpprRYoUJGKDfSaHxPaJUA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0-rc.2.tgz#101a55f70d510978c8c05f5857d0e9d4965263f7" - integrity sha512-bQV1uFWGtwRYjNOsqJ8FM2004idX2Jj7YVL19YF1/PjyPUSMX+s8/IvJizBjyY5hPAiWBBhmV9g+IFWzxlDQoQ== +"@abp/jquery@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0.tgz#d8812a7d410ad959a1ed27696beb9b7885142684" + integrity sha512-cVF2hOP6GGp0N3VMBOFjEHuHFgXbDH8x0d7Agw4DN2ydFU8wYuj3m9u0HCc0aoBG6Zls90tMpTfM0RqDNFgCKA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" jquery "~3.7.1" -"@abp/lodash@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0-rc.2.tgz#d08c03f8d3d0fbaa3e71e603cbe5fb7f176933ef" - integrity sha512-KCnD1p2y52ZI+2ifpiFIUAiDPsKehnOD8HV5qKeObO6UCP97okif8IP+sQDmNQb8O33y/NKTyx/HcpwBbe/NYQ== +"@abp/lodash@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0.tgz#fdebe764d1142abfd3ecdeef56aa33746e31815b" + integrity sha512-r4WwpqLFFQi721edd8XF5wueAdqEvx75dmRlEuhZoIBA6RQ0yYjTRMNWjTOlIEzFDGj7XrisV5CSUQ9BhhuS+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" lodash "^4.17.21" -"@abp/luxon@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0-rc.2.tgz#ef8d2b323bac054fc9610e241e1b1763d229e065" - integrity sha512-qYFl6XO3g9mZiu0dtIczI7LRuYWwc+RkpbDzSmruXcRks3KA+ZZco2vhHNnlwtXcINl/TXtbW7Wc0MX+8IB1Kw== +"@abp/luxon@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0.tgz#c80cdb1a85e9cc824946dc0009df0daba384a4ca" + integrity sha512-slwiGSrevvWZrBhuy9sw7UP6akk2Ln9eAY3nxxo8xzE7C7uezcNk12dbKN4psdSAVpbDwuqC3GGrkmcFL+6sBQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" luxon "^3.7.2" -"@abp/malihu-custom-scrollbar-plugin@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0-rc.2.tgz#dfaf666442c7c122f7da72c83b9adf194d5b6ec8" - integrity sha512-PudMHmNQgZ6JZeaVt1ZoXLqO0UZXJzUYiBah2LDkC4EMLjnMJFINHBoEVVa4ooXH0yjFv+zsbN0vWZYJ8TBJIA== +"@abp/malihu-custom-scrollbar-plugin@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0.tgz#d257e83b7cc1af89a708e365eef7af0136ccebcf" + integrity sha512-+h8hoYUkjcYBdm/M3b8c3CeE5WNU8K6kQ5MwQXNaaGLCvwEmZHy0A6+U8yxtKv2eRRhAkAqOkQyWYRWA5w1XzQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0-rc.2.tgz#610a1592d13984aea51abbd13df8c5995a089149" - integrity sha512-ep8PnAXARw0t/wtGOVp/oiNhF3B0Bh6y2vRzKrcSoyXAQREGGm4fJdZVYZLGTfI4lFLTjebEgf4O7T9feUwJAw== +"@abp/moment@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0.tgz#5755e4e10a7302e2832b1a1ce571f20b27600303" + integrity sha512-faHV7vmPEjFUJTRNTTlmnpx0VZuyvQt4O98WBLAjPdcqpLfWazdS9Ro405St5liIkgvmAXWsrwVmZb0VKTLcNA== dependencies: moment "^2.30.1" -"@abp/popper.js@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-10.1.0-rc.2.tgz#09a23add65422b2a34a70dc074bdd8e0ec57d2a2" - integrity sha512-z+YqO0KBr8Nf376sV031lti/bPr2SzuxWgDlNmxrebrF544hgsXC+BXsWhzXSDznEZucN1sIkeoNWEiuAjxctA== +"@abp/popper.js@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-10.1.0.tgz#dac1a4ef2860059681d5b317af923ff38bfbcb3a" + integrity sha512-/u6rcCQzR1OMmaRyCjJVw1YRBXTAzySL3X2SJ4/OMnW3IYUSTode1IwZyf1OIKQPJ9IGg99RS5MVG/3JVV/trA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@popperjs/core" "^2.11.8" -"@abp/prismjs@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.1.0-rc.2.tgz#8565bab503a16fc349f4b0fa2609ad412ff838be" - integrity sha512-SmZWMyJ3cJW+qj4CWJ7y2kD6PMx2zfZMA5X5jPunsytG4Eht4AVyIR38Y4QSpO62zZgkHyZlSTFOozBfhrlv9A== +"@abp/prismjs@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.1.0.tgz#632e06b47a9ac11d0131d06a270b97292266df47" + integrity sha512-iqXB3bgrlXDyfuFr23R2JtfN0Ij3ai81KkWM3oc3QikKaCwAHtiU0ZvshRlL9y3YfwjlNpYYFLE4en2xx1xThQ== dependencies: - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/core" "~10.1.0-rc.2" + "@abp/clipboard" "~10.1.0" + "@abp/core" "~10.1.0" prismjs "^1.30.0" -"@abp/select2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0-rc.2.tgz#40c5418d007fc36817eecbe6388d767e4e7ca887" - integrity sha512-Pq0wlpL01sWRLUg5um3JtBXIqi3mmbwPwvgxP8hFbQngAt9JXAK8geNRiTMrIZgtW/ycXtM1v6I4zuWOLOeAGg== +"@abp/select2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0.tgz#8b15954e462e65329b8eb481226170df6d55d36a" + integrity sha512-7+1GirZe4i/2/LR4jZgWhiN6lFHhClLtUmrdCjh7FeeuBvy5GGA417DybDihna/GzlcOVI4GHnn2fjEwcFqJiw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0-rc.2.tgz#d35858c69e10c6726b02cdfcea88dfc32385963f" - integrity sha512-s9VPRToohN45uzHcKCF5Mcj8FVjsXcXUb0U3tuaT/Y+u4adHB3fBxYiXJFM0sVsCJ81dFktxwka40Wm8Taz/zA== +"@abp/sweetalert2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0.tgz#6997cb7909671f9deddaea53f17ed054aab27cd3" + integrity sha512-vlkH+DkuQBvOqnDPqTtyZ5mHb+GfIR/QJBXI7yrS62ML+ZNqkg0vXftCrm4aAR2kPmvgYsbUOJcKJAmgydcOEQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" sweetalert2 "^11.23.0" -"@abp/timeago@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0-rc.2.tgz#98d630cc3843eee64dbcc34fb8ca5afbab034718" - integrity sha512-vJmk+otyXXJE2s2J8iYpLVaFuNAYnIUSOitmi7umYnL+k/UE2KQhBXU7FR0/OBY9mAZYd+shaiGIU1LMSaJ+Xg== +"@abp/timeago@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0.tgz#45c1e8b1451e31910e330053981a871787fe02f1" + integrity sha512-3RVMlBbOepa4WBTLthRmf2VddkNwsjE+FNnaSUaMQ2ZQaXnghnZc4xZ3f3oKraGcWMgqpz1IfrWWV1POKRsEXw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" timeago "^1.6.7" -"@abp/utils@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0-rc.2.tgz#86a980c6536b3b5ce185d406723b28be421864ac" - integrity sha512-Oz863VNA8fraQ81vTvqM0IqwiaseLwfFU5QNn6iOGOfn5wQrEkPwtZ0jMI+DGNtJgPzoKiq+iKc3K+SiuVgldg== +"@abp/utils@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0.tgz#ef7f6bf16abb34b77fa57c156b264154827bc0af" + integrity sha512-UDgbvDMbcQklNu+SlQPhkIcIfZoWsQjCCzihanLBiHc474BCOlcTsO6K/EatV9LwqG3zY0mYd0ExAWjH44G0rQ== dependencies: just-compare "^2.3.0" diff --git a/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs b/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs index 582d9ade42..f9b5a53a46 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs @@ -9,6 +9,8 @@ using Volo.Abp.Application.Dtos; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; using Volo.Abp.ObjectExtending; +using Volo.Abp.Roles; +using Volo.Abp.Users; namespace Volo.Abp.Identity; @@ -69,7 +71,18 @@ public class IdentityUserAppService : IdentityAppServiceBase, IIdentityUserAppSe [Authorize(IdentityPermissions.Users.Default)] public virtual async Task> GetAssignableRolesAsync() { - var list = (await RoleRepository.GetListAsync()).OrderBy(x => x.Name).ToList(); + List list; + + if (await HasAdminRoleAsync()) + { + list = (await RoleRepository.GetListAsync()).OrderBy(x => x.Name).ToList(); + } + else + { + var currentUserRoles = await UserManager.GetRolesAsync(await UserManager.GetByIdAsync(CurrentUser.GetId())); + list = (await RoleRepository.GetListAsync(currentUserRoles)).OrderBy(x => x.Name).ToList(); + } + return new ListResultDto(ObjectMapper.Map, List>(list)); } @@ -145,7 +158,9 @@ public class IdentityUserAppService : IdentityAppServiceBase, IIdentityUserAppSe { await IdentityOptions.SetAsync(); var user = await UserManager.GetByIdAsync(id); - (await UserManager.SetRolesAsync(user, input.RoleNames)).CheckErrors(); + + var effectiveRoles = await FilterRolesByCurrentUserAsync(user, input.RoleNames); + (await UserManager.SetRolesAsync(user, effectiveRoles)).CheckErrors(); await UserRepository.UpdateAsync(user); } @@ -189,7 +204,38 @@ public class IdentityUserAppService : IdentityAppServiceBase, IIdentityUserAppSe (await UserManager.UpdateAsync(user)).CheckErrors(); if (input.RoleNames != null && await PermissionChecker.IsGrantedAsync(IdentityPermissions.Users.ManageRoles)) { - (await UserManager.SetRolesAsync(user, input.RoleNames)).CheckErrors(); + var effectiveRoles = await FilterRolesByCurrentUserAsync(user, input.RoleNames); + (await UserManager.SetRolesAsync(user, effectiveRoles)).CheckErrors(); + } + } + + protected virtual async Task FilterRolesByCurrentUserAsync(IdentityUser user, string[] inputRoleNames) + { + if (await HasAdminRoleAsync()) + { + return (inputRoleNames ?? Array.Empty()) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToArray(); } + + var targetCurrentRoleSet = (await UserManager.GetRolesAsync(user)).ToHashSet(StringComparer.OrdinalIgnoreCase); + + var operatorUser = await UserManager.GetByIdAsync(CurrentUser.GetId()); + var operatorOwnRoleSet = (await UserManager.GetRolesAsync(operatorUser)).ToHashSet(StringComparer.OrdinalIgnoreCase); + + var inputRoleNameSet = new HashSet(inputRoleNames ?? Array.Empty(), StringComparer.OrdinalIgnoreCase); + var keepUnmanageableRoles = targetCurrentRoleSet.Except(operatorOwnRoleSet, StringComparer.OrdinalIgnoreCase); + + var desiredManageableRoles = inputRoleNameSet.Intersect(operatorOwnRoleSet, StringComparer.OrdinalIgnoreCase); + + return keepUnmanageableRoles + .Concat(desiredManageableRoles) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToArray(); + } + + protected virtual Task HasAdminRoleAsync() + { + return Task.FromResult(CurrentUser.IsInRole(AbpRoleConsts.AdminRoleName)); } } diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreModule.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreModule.cs index 67b5d0bfa7..e06797ae54 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreModule.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -47,6 +48,8 @@ public class AbpIdentityAspNetCoreModule : AbpModule public override void PostConfigureServices(ServiceConfigurationContext context) { + // Replace the default UserValidator with AbpIdentityUserValidator + context.Services.RemoveAll(x => x.ServiceType == typeof(IUserValidator) && x.ImplementationType == typeof(UserValidator)); context.Services.AddAbpOptions() .Configure((securityStampValidatorOptions, serviceProvider) => { diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs index 09f3e4bf24..ef375c8b6f 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs @@ -46,6 +46,7 @@ public class AbpSignInManager : SignInManager bool isPersistent, bool lockoutOnFailure) { + IdentityUser user; foreach (var externalLoginProviderInfo in AbpOptions.ExternalLoginProviders.Values) { var externalLoginProvider = (IExternalLoginProvider)Context.RequestServices @@ -53,7 +54,7 @@ public class AbpSignInManager : SignInManager if (await externalLoginProvider.TryAuthenticateAsync(userName, password)) { - var user = await UserManager.FindByNameAsync(userName); + user = await FindByNameAsync(userName); if (user == null) { if (externalLoginProvider is IExternalLoginProviderWithPassword externalLoginProviderWithPassword) @@ -81,7 +82,44 @@ public class AbpSignInManager : SignInManager } } - return await base.PasswordSignInAsync(userName, password, isPersistent, lockoutOnFailure); + user = await FindByNameAsync(userName); + if (user == null) + { + return SignInResult.Failed; + } + + return await PasswordSignInAsync(user, password, isPersistent, lockoutOnFailure); + } + + public override async Task ExternalLoginSignInAsync(string loginProvider, string providerKey, bool isPersistent, bool bypassTwoFactor) + { + var user = await FindByLoginAsync(loginProvider, providerKey); + if (user == null) + { + return SignInResult.Failed; + } + + var error = await PreSignInCheck(user); + if (error != null) + { + return error; + } + return await SignInOrTwoFactorAsync(user, isPersistent, loginProvider, bypassTwoFactor); + } + + public virtual async Task FindByEmaiAsync(string email) + { + return await _identityUserManager.FindSharedUserByEmailAsync(email); + } + + public virtual async Task FindByNameAsync(string userName) + { + return await _identityUserManager.FindSharedUserByNameAsync(userName); + } + + public virtual async Task FindByLoginAsync(string loginProvider, string providerKey) + { + return await _identityUserManager.FindSharedUserByLoginAsync(loginProvider, providerKey); } /// diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor index 456292fa5c..9c4c22a3a0 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor @@ -41,7 +41,7 @@ { -
+ @L["NewRole"] @@ -67,7 +67,7 @@ - +
@@ -78,7 +78,7 @@ { -
+ @L["Edit"] @@ -105,7 +105,7 @@ - +
diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor index c2c54814ff..f146ab644f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor @@ -48,7 +48,7 @@ { -
+ @L["NewUser"] @@ -142,13 +142,13 @@ @if (NewUserRoles != null) { - @foreach (var role in NewUserRoles) - { - - - @role.Name - - } + @foreach (var role in NewUserRoles) + { + + + @role.Name + + } } @@ -157,7 +157,7 @@ - +
@@ -169,7 +169,7 @@ { -
+ @L["Edit"] @@ -277,7 +277,7 @@ { - @role.Name + @role.Name } } @@ -289,7 +289,7 @@ - +
diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs index a52474b8b1..fc35245801 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs @@ -103,7 +103,8 @@ public partial class UserManagement NewUserRoles = Roles.Select(x => new AssignedRoleViewModel { Name = x.Name, - IsAssigned = x.IsDefault + IsAssigned = x.IsDefault, + IsAssignable = true }).ToArray(); ChangePasswordTextRole(TextRole.Password); @@ -130,12 +131,23 @@ public partial class UserManagement if (await PermissionChecker.IsGrantedAsync(IdentityPermissions.Users.ManageRoles)) { - var userRoleIds = (await AppService.GetRolesAsync(entity.Id)).Items.Select(r => r.Id).ToList(); + var assignableRoles = Roles ?? (await AppService.GetAssignableRolesAsync()).Items; + var currentRoles = (await AppService.GetRolesAsync(entity.Id)).Items; - EditUserRoles = Roles.Select(x => new AssignedRoleViewModel + var combinedRoles = assignableRoles + .Concat(currentRoles) + .GroupBy(role => role.Id) + .Select(group => group.First()) + .ToList(); + + var currentRoleIds = currentRoles.Select(r => r.Id).ToHashSet(); + var assignableRoleIds = assignableRoles.Select(r => r.Id).ToHashSet(); + + EditUserRoles = combinedRoles.Select(x => new AssignedRoleViewModel { Name = x.Name, - IsAssigned = userRoleIds.Contains(x.Id) + IsAssigned = currentRoleIds.Contains(x.Id), + IsAssignable = assignableRoleIds.Contains(x.Id) }).ToArray(); ChangePasswordTextRole(TextRole.Password); @@ -262,4 +274,6 @@ public class AssignedRoleViewModel public string Name { get; set; } public bool IsAssigned { get; set; } + + public bool IsAssignable { get; set; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserPasswordChangedEto.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserPasswordChangedEto.cs new file mode 100644 index 0000000000..13e4def1d3 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserPasswordChangedEto.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Identity; + +[Serializable] +public class IdentityUserPasswordChangedEto : IMultiTenant +{ + public Guid Id { get; set; } + + public Guid? TenantId { get; set; } + + public string Email { get; set; } +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityUserValidator.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityUserValidator.cs index 05c733c0c0..cfceb47b3f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityUserValidator.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityUserValidator.cs @@ -1,18 +1,35 @@ +using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; -using Microsoft.Extensions.Localization; -using Volo.Abp.Identity.Localization; +using Microsoft.Extensions.Options; +using Volo.Abp.Data; +using Volo.Abp.DistributedLocking; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity { public class AbpIdentityUserValidator : IUserValidator { - protected IStringLocalizer Localizer { get; } + protected IOptions MultiTenancyOptions { get; } + protected IAbpDistributedLock DistributedLock { get; } + protected ICurrentTenant CurrentTenant { get; } + protected IDataFilter TenantFilter { get; } + protected IIdentityUserRepository UserRepository { get; } - public AbpIdentityUserValidator(IStringLocalizer localizer) + public AbpIdentityUserValidator( + IOptions multiTenancyOptions, + IAbpDistributedLock distributedLock, + ICurrentTenant currentTenant, + IDataFilter tenantFilter, + IIdentityUserRepository userRepository) { - Localizer = localizer; + MultiTenancyOptions = multiTenancyOptions; + DistributedLock = distributedLock; + CurrentTenant = currentTenant; + TenantFilter = tenantFilter; + UserRepository = userRepository; } public virtual async Task ValidateAsync(UserManager manager, IdentityUser user) @@ -20,8 +37,22 @@ namespace Volo.Abp.Identity Check.NotNull(manager, nameof(manager)); Check.NotNull(user, nameof(user)); + var defaultUserValidator = new UserValidator(manager.ErrorDescriber); + return MultiTenancyOptions.Value.UserSharingStrategy == TenantUserSharingStrategy.Isolated + ? await ValidateIsolatedUserAsync(manager, user, defaultUserValidator) + : await ValidateSharedUserAsync(manager, user, defaultUserValidator); + } + + protected virtual async Task ValidateIsolatedUserAsync(UserManager manager, IdentityUser user, UserValidator defaultValidator) + { var errors = new List(); + var defaultValidationResult = await defaultValidator.ValidateAsync(manager, user); + if (!defaultValidationResult.Succeeded) + { + return defaultValidationResult; + } + var userName = await manager.GetUserNameAsync(user); if (userName == null) { @@ -52,5 +83,84 @@ namespace Volo.Abp.Identity return errors.Count > 0 ? IdentityResult.Failed(errors.ToArray()) : IdentityResult.Success; } + + protected virtual async Task ValidateSharedUserAsync(UserManager manager, IdentityUser user, UserValidator defaultValidator) + { + var errors = new List(); + + using (CurrentTenant.Change(user.TenantId)) + { + var defaultValidationResult = await defaultValidator.ValidateAsync(manager, user); + if (!defaultValidationResult.Succeeded) + { + return defaultValidationResult; + } + } + + await using var handle = await DistributedLock.TryAcquireAsync(nameof(AbpIdentityUserValidator), TimeSpan.FromMinutes(1)); + if (handle == null) + { + throw new AbpException("Could not acquire distributed lock for validating user uniqueness for shared user sharing strategy!"); + } + + using (CurrentTenant.Change(null)) + { + using (TenantFilter.Disable()) + { + IdentityUser owner; + using (CurrentTenant.Change(user.TenantId)) + { + owner = await manager.FindByIdAsync(user.Id.ToString()); + } + + var normalizedUserName = manager.NormalizeName(user.UserName); + var normalizedEmail = manager.NormalizeEmail(user.Email); + + var users = (await UserRepository.GetUsersByNormalizedUserNamesAsync([normalizedUserName!, normalizedEmail!], true)).Where(x => x.Id != user.Id).ToList(); + var usersByUserName = users.Where(x => x.NormalizedUserName == normalizedUserName).ToList(); + if (owner != null) + { + usersByUserName.RemoveAll(x => x.NormalizedUserName == user.NormalizedUserName); + } + if (usersByUserName.Any()) + { + errors.Add(manager.ErrorDescriber.DuplicateUserName(user.UserName!)); + } + + var usersByEmail = users.Where(x => x.NormalizedUserName == normalizedEmail).ToList(); + if (owner != null) + { + usersByEmail.RemoveAll(x => x.NormalizedEmail == user.NormalizedEmail); + } + if (usersByEmail.Any()) + { + errors.Add(manager.ErrorDescriber.InvalidEmail(user.Email!)); + } + + users = await UserRepository.GetUsersByNormalizedEmailsAsync([normalizedEmail!, normalizedUserName!], true); + usersByEmail = users.Where(x => x.NormalizedEmail == normalizedEmail).ToList(); + if (owner != null) + { + usersByEmail.RemoveAll(x => x.NormalizedEmail == user.NormalizedEmail); + } + if (usersByEmail.Any()) + { + errors.Add(manager.ErrorDescriber.DuplicateEmail(user.Email!)); + } + + usersByUserName = users.Where(x => x.NormalizedEmail == normalizedUserName).ToList(); + if (owner != null) + { + usersByUserName.RemoveAll(x => x.NormalizedUserName == user.NormalizedUserName); + } + if (usersByUserName.Any()) + { + errors.Add(manager.ErrorDescriber.InvalidUserName(user.UserName!)); + } + } + } + + return errors.Count > 0 ? IdentityResult.Failed(errors.ToArray()) : IdentityResult.Success; + } } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs index 33ec2eab95..cc88d3d792 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs @@ -165,4 +165,55 @@ public interface IIdentityUserRepository : IBasicRepository byte[] credentialId, bool includeDetails = true, CancellationToken cancellationToken = default); + + Task> GetUsersByNormalizedUserNameAsync( + [NotNull] string normalizedUserName, + bool includeDetails = false, + CancellationToken cancellationToken = default + ); + + Task> GetUsersByNormalizedUserNamesAsync( + [NotNull] string[] normalizedUserNames, + bool includeDetails = false, + CancellationToken cancellationToken = default + ); + + Task> GetUsersByNormalizedEmailAsync( + [NotNull] string normalizedEmail, + bool includeDetails = false, + CancellationToken cancellationToken = default + ); + + Task> GetUsersByNormalizedEmailsAsync( + [NotNull] string[] normalizedEmails, + bool includeDetails = false, + CancellationToken cancellationToken = default + ); + + Task> GetUsersByLoginAsync( + [NotNull] string loginProvider, + [NotNull] string providerKey, + bool includeDetails = false, + CancellationToken cancellationToken = default + ); + + Task> GetUsersByPasskeyIdAsync( + [NotNull] byte[] credentialId, + bool includeDetails = false, + CancellationToken cancellationToken = default + ); + + Task FindByNormalizedUserNameAsync( + Guid? tenantId, + [NotNull] string normalizedUserName, + bool includeDetails = true, + CancellationToken cancellationToken = default + ); + + Task FindByNormalizedEmailAsync( + Guid? tenantId, + [NotNull] string normalizedEmail, + bool includeDetails = true, + CancellationToken cancellationToken = default + ); } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs index 1c153effd1..6cfa5a329d 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; +using Volo.Abp.Roles; using Volo.Abp.Uow; namespace Volo.Abp.Identity; @@ -83,7 +84,7 @@ public class IdentityDataSeeder : ITransientDependency, IIdentityDataSeeder result.CreatedAdminUser = true; //"admin" role - const string adminRoleName = "admin"; + const string adminRoleName = AbpRoleConsts.AdminRoleName; var adminRole = await RoleRepository.FindByNormalizedNameAsync(LookupNormalizer.NormalizeName(adminRoleName)); if (adminRole == null) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUser.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUser.cs index 3f4a91117c..214bce39fc 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUser.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUser.cs @@ -132,6 +132,11 @@ public class IdentityUser : FullAuditedAggregateRoot, IUser, IHasEntityVer ///
public virtual DateTimeOffset? LastSignInTime { get; protected set; } + /// + /// Gets or sets a flag indicating whether this user is leaved from tenant. + /// + public virtual bool Leaved { get; protected set; } + //TODO: Can we make collections readonly collection, which will provide encapsulation. But... can work for all ORMs? /// @@ -435,6 +440,43 @@ public class IdentityUser : FullAuditedAggregateRoot, IUser, IHasEntityVer Passkeys.RemoveAll(x => x.CredentialId.SequenceEqual(credentialId)); } + /// + /// This method set the UserName and normalizedUserName without any validation. + /// Do not use it directly. Use UserManager to change the user name. + /// + public virtual void SetUserNameWithoutValidation(string userName, string normalizedUserName) + { + UserName = userName; + NormalizedUserName = normalizedUserName; + } + + /// + /// This method set the Email and NormalizedEmail without any validation. + /// Do not use it directly. Use UserManager to change the email. + /// + /// + /// + public virtual void SetEmailWithoutValidation(string email, string normalizedEmail) + { + Email = email; + NormalizedEmail = normalizedEmail; + } + + /// + /// This method set the PasswordHash without any validation. + /// Do not use it directly. Use UserManager to change the password. + /// + /// + public virtual void SetPasswordHashWithoutValidation(string passwordHash) + { + PasswordHash = passwordHash; + } + + public virtual void SetLeaved(bool leaved) + { + Leaved = leaved; + } + public override string ToString() { return $"{base.ToString()}, UserName = {UserName}"; diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index 41da1e5c22..c2f72366fb 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -8,11 +8,13 @@ using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Volo.Abp.Caching; +using Volo.Abp.Data; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Identity.Settings; +using Volo.Abp.MultiTenancy; using Volo.Abp.Security.Claims; using Volo.Abp.Settings; using Volo.Abp.Threading; @@ -31,6 +33,9 @@ public class IdentityUserManager : UserManager, IDomainService protected IIdentityLinkUserRepository IdentityLinkUserRepository { get; } protected IDistributedCache DynamicClaimCache { get; } protected override CancellationToken CancellationToken => CancellationTokenProvider.Token; + protected IOptions MultiTenancyOptions { get; } + protected ICurrentTenant CurrentTenant { get; } + protected IDataFilter DataFilter { get; } public IdentityUserManager( IdentityUserStore store, @@ -49,7 +54,10 @@ public class IdentityUserManager : UserManager, IDomainService ISettingProvider settingProvider, IDistributedEventBus distributedEventBus, IIdentityLinkUserRepository identityLinkUserRepository, - IDistributedCache dynamicClaimCache) + IDistributedCache dynamicClaimCache, + IOptions multiTenancyOptions, + ICurrentTenant currentTenant, + IDataFilter dataFilter) : base( store, optionsAccessor, @@ -68,6 +76,9 @@ public class IdentityUserManager : UserManager, IDomainService UserRepository = userRepository; IdentityLinkUserRepository = identityLinkUserRepository; DynamicClaimCache = dynamicClaimCache; + MultiTenancyOptions = multiTenancyOptions; + CurrentTenant = currentTenant; + DataFilter = dataFilter; CancellationTokenProvider = cancellationTokenProvider; } @@ -116,7 +127,7 @@ public class IdentityUserManager : UserManager, IDomainService /// A representing whether validation was successful. public virtual async Task CallValidateUserAsync(IdentityUser user) { - return await base.ValidateUserAsync(user); + return await ValidateUserAsync(user); } /// @@ -129,7 +140,20 @@ public class IdentityUserManager : UserManager, IDomainService /// A representing whether validation was successful. public virtual async Task CallValidatePasswordAsync(IdentityUser user, string password) { - return await base.ValidatePasswordAsync(user, password); + return await ValidatePasswordAsync(user, password); + } + + /// + /// This is to call the protection method UpdatePasswordHash + /// Updates a user's password hash. + /// + /// The user. + /// The new password. + /// Whether to validate the password. + /// Whether the password has was successfully updated. + public virtual async Task CallUpdatePasswordHash(IdentityUser user, string newPassword, bool validatePassword) + { + return await UpdatePasswordHash(user, newPassword, validatePassword); } public virtual async Task GetByIdAsync(Guid id) @@ -396,6 +420,22 @@ public class IdentityUserManager : UserManager, IDomainService return result; } + public override async Task ChangePasswordAsync(IdentityUser user, string currentPassword, string newPassword) + { + var result = await base.ChangePasswordAsync(user, currentPassword, newPassword); + + result.CheckErrors(); + + await DistributedEventBus.PublishAsync(new IdentityUserPasswordChangedEto + { + Id = user.Id, + TenantId = user.TenantId, + Email = user.Email, + }); + + return result; + } + public virtual async Task UpdateRoleAsync(Guid sourceRoleId, Guid? targetRoleId) { var sourceRole = await RoleRepository.GetAsync(sourceRoleId, cancellationToken: CancellationToken); @@ -555,4 +595,127 @@ public class IdentityUserManager : UserManager, IDomainService Logger.LogError($"Could not get a valid user name for the given email address: {email}, allowed characters: {Options.User.AllowedUserNameCharacters}, tried {maxTryCount} times."); throw new AbpIdentityResultException(IdentityResult.Failed(ErrorDescriber.InvalidUserName(userName))); } + + public virtual async Task FindSharedUserByEmailAsync(string email) + { + if (MultiTenancyOptions.Value.UserSharingStrategy == TenantUserSharingStrategy.Isolated) + { + return await base.FindByEmailAsync(email); + } + + using (CurrentTenant.Change(null)) + { + using (DataFilter.Disable()) + { + var normalizedEmail = NormalizeEmail(email); + var hostusers = await UserRepository.GetUsersByNormalizedEmailAsync(normalizedEmail, cancellationToken: CancellationToken); + //host user first + var hostUser = hostusers.FirstOrDefault(x => x.TenantId == null) ?? hostusers.FirstOrDefault(x => x.TenantId != Guid.Empty) ?? hostusers.FirstOrDefault(); + if (hostUser == null) + { + return null; + } + + using (DataFilter.Enable()) + { + using (CurrentTenant.Change(hostUser.TenantId)) + { + return await base.FindByEmailAsync(email); + } + } + } + } + } + + public virtual async Task FindSharedUserByNameAsync(string userName) + { + if (MultiTenancyOptions.Value.UserSharingStrategy == TenantUserSharingStrategy.Isolated) + { + return await base.FindByNameAsync(userName); + } + + using (CurrentTenant.Change(null)) + { + using (DataFilter.Disable()) + { + var normalizeduserName = NormalizeName(userName); + var hostusers = await UserRepository.GetUsersByNormalizedUserNameAsync(normalizeduserName, cancellationToken: CancellationToken); + //host user first + var hostUser = hostusers.FirstOrDefault(x => x.TenantId == null) ?? hostusers.FirstOrDefault(x => x.TenantId != Guid.Empty) ?? hostusers.FirstOrDefault(); + if (hostUser == null) + { + return null; + } + + using (DataFilter.Enable()) + { + using (CurrentTenant.Change(hostUser.TenantId)) + { + return await base.FindByNameAsync(userName); + } + } + } + } + } + + public virtual async Task FindSharedUserByLoginAsync(string loginProvider, string providerKey) + { + if (MultiTenancyOptions.Value.UserSharingStrategy == TenantUserSharingStrategy.Isolated) + { + return await base.FindByLoginAsync(loginProvider, providerKey); + } + + using (CurrentTenant.Change(null)) + { + using (DataFilter.Disable()) + { + var hostusers = await UserRepository.GetUsersByLoginAsync(loginProvider, providerKey, cancellationToken: CancellationToken); + //host user first + var hostUser = hostusers.FirstOrDefault(x => x.TenantId == null) ?? hostusers.FirstOrDefault(x => x.TenantId != Guid.Empty) ?? hostusers.FirstOrDefault(); + if (hostUser == null) + { + return null; + } + + using (DataFilter.Enable()) + { + using (CurrentTenant.Change(hostUser.TenantId)) + { + return await base.FindByLoginAsync(loginProvider, providerKey); + } + } + } + } + } + + public virtual async Task FindSharedUserByPasskeyIdAsync(byte[] credentialId) + { + if (MultiTenancyOptions.Value.UserSharingStrategy == TenantUserSharingStrategy.Isolated) + { + return await base.FindByPasskeyIdAsync(credentialId); + } + + using (CurrentTenant.Change(null)) + { + using (DataFilter.Disable()) + { + var hostusers = await UserRepository.GetUsersByPasskeyIdAsync(credentialId, cancellationToken: CancellationToken); + //host user first + var hostUser = hostusers.FirstOrDefault(x => x.TenantId == null) ?? hostusers.FirstOrDefault(x => x.TenantId != Guid.Empty) ?? hostusers.FirstOrDefault(); + if (hostUser == null) + { + return null; + } + + using (DataFilter.Enable()) + { + using (CurrentTenant.Change(hostUser.TenantId)) + { + return await base.FindByPasskeyIdAsync(credentialId); + } + } + } + } + } + } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs index c4a8733787..160e37c900 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs @@ -148,7 +148,7 @@ public class OrganizationUnitManager : DomainService } } - public async Task> FindChildrenAsync(Guid? parentId, bool recursive = false) + public virtual async Task> FindChildrenAsync(Guid? parentId, bool recursive = false) { if (!recursive) { diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/UserRoleFinder.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/UserRoleFinder.cs index 48d8b01a73..633bbd1ed9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/UserRoleFinder.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/UserRoleFinder.cs @@ -35,10 +35,10 @@ public class UserRoleFinder : IUserRoleFinder, ITransientDependency { page = page < 1 ? 1 : page; var users = await IdentityUserRepository.GetListAsync(filter: filter, skipCount: (page - 1) * 10, maxResultCount: 10); - return users.Select(user => new UserFinderResult + return users.Select(x => new UserFinderResult { - Id = user.Id, - UserName = user.UserName + Id = x.Id, + UserName = x.UserName }).ToList(); } } @@ -49,10 +49,10 @@ public class UserRoleFinder : IUserRoleFinder, ITransientDependency { page = page < 1 ? 1 : page; var roles = await IdentityRoleRepository.GetListAsync(filter: filter, skipCount: (page - 1) * 10, maxResultCount: 10); - return roles.Select(user => new RoleFinderResult + return roles.Select(x => new RoleFinderResult { - Id = user.Id, - RoleName = user.Name + Id = x.Id, + RoleName = x.Name }).ToList(); } } @@ -62,10 +62,10 @@ public class UserRoleFinder : IUserRoleFinder, ITransientDependency using (IdentityUserRepository.DisableTracking()) { var users = await IdentityUserRepository.GetListByIdsAsync(ids); - return users.Select(user => new UserFinderResult + return users.Select(x => new UserFinderResult { - Id = user.Id, - UserName = user.UserName + Id = x.Id, + UserName = x.UserName }).ToList(); } } @@ -75,10 +75,10 @@ public class UserRoleFinder : IUserRoleFinder, ITransientDependency using (IdentityUserRepository.DisableTracking()) { var roles = await IdentityRoleRepository.GetListAsync(names); - return roles.Select(user => new RoleFinderResult + return roles.Select(x => new RoleFinderResult { - Id = user.Id, - RoleName = user.Name + Id = x.Id, + RoleName = x.Name }).ToList(); } } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index 68c05738db..cd6fa072a1 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -455,6 +455,84 @@ public class EfCoreIdentityUserRepository : EfCoreRepository> GetUsersByNormalizedUserNameAsync(string normalizedUserName, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .IncludeDetails(includeDetails) + .OrderBy(x => x.Id) + .Where(u => u.NormalizedUserName == normalizedUserName) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetUsersByNormalizedUserNamesAsync(string[] normalizedUserNames, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .IncludeDetails(includeDetails) + .OrderBy(x => x.Id) + .Where(u => normalizedUserNames.Contains(u.NormalizedUserName)) + .Distinct() + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetUsersByNormalizedEmailAsync(string normalizedEmail, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .IncludeDetails(includeDetails) + .OrderBy(x => x.Id) + .Where(u => u.NormalizedEmail == normalizedEmail) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetUsersByNormalizedEmailsAsync(string[] normalizedEmails, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .IncludeDetails(includeDetails) + .OrderBy(x => x.Id) + .Where(u => normalizedEmails.Contains(u.NormalizedEmail)) + .Distinct() + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetUsersByLoginAsync(string loginProvider, string providerKey, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .IncludeDetails(includeDetails) + .OrderBy(x => x.Id) + .Where(u => u.Logins.Any(login => login.LoginProvider == loginProvider && login.ProviderKey == providerKey)) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetUsersByPasskeyIdAsync(byte[] credentialId, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .IncludeDetails(includeDetails) + .Where(u => u.Passkeys.Any(x => x.CredentialId.SequenceEqual(credentialId))) + .OrderBy(x => x.Id) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task FindByNormalizedUserNameAsync(Guid? tenantId, string normalizedUserName, bool includeDetails = true, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .IncludeDetails(includeDetails) + .OrderBy(x => x.Id) + .FirstOrDefaultAsync( + u => u.TenantId == tenantId && u.NormalizedUserName == normalizedUserName, + GetCancellationToken(cancellationToken) + ); + } + + public virtual async Task FindByNormalizedEmailAsync(Guid? tenantId, string normalizedEmail, bool includeDetails = true, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .IncludeDetails(includeDetails) + .OrderBy(x => x.Id) + .FirstOrDefaultAsync( + u => u.TenantId == tenantId && u.NormalizedEmail == normalizedEmail, + GetCancellationToken(cancellationToken) + ); + } + protected virtual async Task> GetFilteredQueryableAsync( string filter = null, Guid? roleId = null, diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs index 2b302e4cf8..429863c5ae 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs @@ -33,7 +33,8 @@ public static class IdentityDbContextModelBuilderExtensions .HasColumnName(nameof(IdentityUser.TwoFactorEnabled)); b.Property(u => u.LockoutEnabled).HasDefaultValue(false) .HasColumnName(nameof(IdentityUser.LockoutEnabled)); - + b.Property(u => u.Leaved).HasDefaultValue(false) + .HasColumnName(nameof(IdentityUser.Leaved)); b.Property(u => u.IsExternal).IsRequired().HasDefaultValue(false) .HasColumnName(nameof(IdentityUser.IsExternal)); diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index 2a8654cd3b..9209946d7f 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -451,6 +451,75 @@ public class MongoIdentityUserRepository : MongoDbRepository> GetUsersByNormalizedUserNameAsync(string normalizedUserName, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetQueryableAsync(cancellationToken)) + .OrderBy(x => x.Id) + .Where(u => u.NormalizedUserName == normalizedUserName) + .ToListAsync(cancellationToken: cancellationToken); + } + + public virtual async Task> GetUsersByNormalizedUserNamesAsync(string[] normalizedUserNames, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetQueryableAsync(cancellationToken)) + .OrderBy(x => x.Id) + .Where(u => normalizedUserNames.Contains(u.NormalizedUserName)) + .Distinct() + .ToListAsync(cancellationToken: cancellationToken); + } + + public virtual async Task> GetUsersByNormalizedEmailAsync(string normalizedEmail, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetQueryableAsync(cancellationToken)) + .OrderBy(x => x.Id) + .Where(u => u.NormalizedEmail == normalizedEmail) + .ToListAsync(cancellationToken: cancellationToken); + } + + public virtual async Task> GetUsersByNormalizedEmailsAsync(string[] normalizedEmails, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetQueryableAsync(cancellationToken)) + .OrderBy(x => x.Id) + .Where(u => normalizedEmails.Contains(u.NormalizedEmail)) + .Distinct() + .ToListAsync(cancellationToken: cancellationToken); + } + + public virtual async Task> GetUsersByLoginAsync(string loginProvider, string providerKey, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetQueryableAsync(cancellationToken)) + .OrderBy(x => x.Id) + .Where(u => u.Logins.Any(login => login.LoginProvider == loginProvider && login.ProviderKey == providerKey)) + .ToListAsync(cancellationToken: cancellationToken); + } + + public virtual async Task> GetUsersByPasskeyIdAsync(byte[] credentialId, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await (await GetQueryableAsync(cancellationToken)) + .OrderBy(x => x.Id) + .Where(u => u.Passkeys.Any(x => x.CredentialId == credentialId)) + .ToListAsync(cancellationToken: cancellationToken); + } + + public virtual async Task FindByNormalizedUserNameAsync(Guid? tenantId, string normalizedUserName, bool includeDetails = true, CancellationToken cancellationToken = default) + { + return await (await GetQueryableAsync(cancellationToken)) + .OrderBy(x => x.Id) + .FirstOrDefaultAsync( + u => u.TenantId == tenantId && u.NormalizedUserName == normalizedUserName, + GetCancellationToken(cancellationToken) + ); + } + + public virtual async Task FindByNormalizedEmailAsync(Guid? tenantId, string normalizedEmail, bool includeDetails = true, CancellationToken cancellationToken = default) + { + return await (await GetQueryableAsync(cancellationToken)) + .OrderBy(x => x.Id).FirstOrDefaultAsync( + u => u.TenantId == tenantId && u.NormalizedEmail == normalizedEmail, + GetCancellationToken(cancellationToken) + ); + } + protected virtual async Task> GetFilteredQueryableAsync( string filter = null, Guid? roleId = null, diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml index 0c85be8f18..b60978f32e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml @@ -83,7 +83,14 @@ @for (var i = 0; i < Model.Roles.Length; i++) { var role = Model.Roles[i]; - + @if (role.IsAssignable) + { + + } + else + { + + } } diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs index 074f3f8481..08ea27081b 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs @@ -41,18 +41,32 @@ public class EditModalModel : IdentityPageModel UserInfo = ObjectMapper.Map(user); if (await PermissionChecker.IsGrantedAsync(IdentityPermissions.Users.ManageRoles)) { - Roles = ObjectMapper.Map, AssignedRoleViewModel[]>((await IdentityUserAppService.GetAssignableRolesAsync()).Items); - } - IsEditCurrentUser = CurrentUser.Id == id; - - var userRoleIds = (await IdentityUserAppService.GetRolesAsync(UserInfo.Id)).Items.Select(r => r.Id).ToList(); - foreach (var role in Roles) - { - if (userRoleIds.Contains(role.Id)) + var assignableRoles = (await IdentityUserAppService.GetAssignableRolesAsync()).Items; + var currentRoles = (await IdentityUserAppService.GetRolesAsync(id)).Items; + + // Combine assignable and current roles to show all roles user has + var combinedRoles = assignableRoles + .Concat(currentRoles) + .GroupBy(role => role.Id) + .Select(group => group.First()) + .ToList(); + + Roles = ObjectMapper.Map, AssignedRoleViewModel[]>(combinedRoles); + + var currentRoleIds = currentRoles.Select(r => r.Id).ToHashSet(); + var assignableRoleIds = assignableRoles.Select(r => r.Id).ToHashSet(); + foreach (var role in Roles) { - role.IsAssigned = true; + role.IsAssigned = currentRoleIds.Contains(role.Id); + role.IsAssignable = assignableRoleIds.Contains(role.Id); } } + else + { + Roles = Array.Empty(); + } + + IsEditCurrentUser = CurrentUser.Id == id; Detail = ObjectMapper.Map(user); @@ -129,6 +143,8 @@ public class EditModalModel : IdentityPageModel public string Name { get; set; } public bool IsAssigned { get; set; } + + public bool IsAssignable { get; set; } } public class DetailViewModel diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleResourcePermissionProviderKeyLookupService.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleResourcePermissionProviderKeyLookupService.cs index fa9fc31f79..ab1824e13d 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleResourcePermissionProviderKeyLookupService.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleResourcePermissionProviderKeyLookupService.cs @@ -30,9 +30,9 @@ public class RoleResourcePermissionProviderKeyLookupService : IResourcePermissio return roles.Select(r => new ResourcePermissionProviderKeyInfo(r.RoleName, r.RoleName)).ToList(); } - public virtual async Task> SearchAsync(string[] keys, CancellationToken cancellationToken = default) + public virtual Task> SearchAsync(string[] keys, CancellationToken cancellationToken = default) { - var roles = await UserRoleFinder.SearchRoleByNamesAsync(keys.Distinct().ToArray()); - return roles.Select(r => new ResourcePermissionProviderKeyInfo(r.RoleName, r.RoleName)).ToList(); + // Keys are role names + return Task.FromResult(keys.Select(x => new ResourcePermissionProviderKeyInfo(x, x)).ToList()); } } diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/FakeCurrentPrincipalAccessor.cs b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/FakeCurrentPrincipalAccessor.cs new file mode 100644 index 0000000000..dabd95dbc3 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/FakeCurrentPrincipalAccessor.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Security.Claims; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Security.Claims; + +namespace Volo.Abp.Identity; + +[Dependency(ReplaceServices = true)] +public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor +{ + private readonly IdentityTestData _testData; + private readonly Lazy _principal; + + public FakeCurrentPrincipalAccessor(IdentityTestData testData) + { + _testData = testData; + _principal = new Lazy(() => new ClaimsPrincipal( + new ClaimsIdentity( + new List + { + new Claim(AbpClaimTypes.UserId, _testData.UserAdminId.ToString()), + new Claim(AbpClaimTypes.UserName, "administrator"), + new Claim(AbpClaimTypes.Email, "administrator@abp.io") + } + ) + )); + } + + protected override ClaimsPrincipal GetClaimsPrincipal() + { + return GetPrincipal(); + } + + private ClaimsPrincipal GetPrincipal() + { + return _principal.Value; + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs index acd50b7947..0c1a8d6ffc 100644 --- a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs @@ -1,10 +1,13 @@ using System; +using System.Linq; +using System.Security.Claims; using System.Threading.Tasks; using Shouldly; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; using Volo.Abp.PermissionManagement; using Volo.Abp.PermissionManagement.Identity; +using Volo.Abp.Security.Claims; using Xunit; namespace Volo.Abp.Identity; @@ -16,6 +19,7 @@ public class IdentityUserAppService_Tests : AbpIdentityApplicationTestBase private readonly IPermissionManager _permissionManager; private readonly UserPermissionManagementProvider _userPermissionManagementProvider; private readonly IdentityTestData _testData; + private readonly ICurrentPrincipalAccessor _currentPrincipalAccessor; public IdentityUserAppService_Tests() { @@ -24,6 +28,7 @@ public class IdentityUserAppService_Tests : AbpIdentityApplicationTestBase _permissionManager = GetRequiredService(); _userPermissionManagementProvider = GetRequiredService(); _testData = GetRequiredService(); + _currentPrincipalAccessor = GetRequiredService(); } [Fact] @@ -239,6 +244,137 @@ public class IdentityUserAppService_Tests : AbpIdentityApplicationTestBase roleNames.ShouldContain("manager"); } + [Fact] + public async Task UpdateRolesAsync_Should_Not_Assign_Roles_Operator_Does_Not_Have() + { + // neo only has "supporter" role + using (_currentPrincipalAccessor.Change(new Claim(AbpClaimTypes.UserId, _testData.UserNeoId.ToString()))) + { + // Try to assign "admin" and "supporter" to david (who has no roles) + await _userAppService.UpdateRolesAsync( + _testData.UserDavidId, + new IdentityUserUpdateRolesDto + { + RoleNames = new[] { "admin", "supporter" } + } + ); + } + + // Only "supporter" should be assigned (admin filtered out since neo doesn't have it) + var roleNames = await _userRepository.GetRoleNamesAsync(_testData.UserDavidId); + roleNames.ShouldContain("supporter"); + roleNames.ShouldNotContain("admin"); + } + + [Fact] + public async Task UpdateRolesAsync_Should_Preserve_Unmanageable_Roles() + { + // john.nash has direct roles: moderator, supporter + // neo only has "supporter" role, so "moderator" is unmanageable for neo + using (_currentPrincipalAccessor.Change(new Claim(AbpClaimTypes.UserId, _testData.UserNeoId.ToString()))) + { + await _userAppService.UpdateRolesAsync( + _testData.UserJohnId, + new IdentityUserUpdateRolesDto + { + RoleNames = new[] { "supporter" } + } + ); + } + + // "moderator" should be preserved (unmanageable), "supporter" kept (in input) + var roleNames = await _userRepository.GetRoleNamesAsync(_testData.UserJohnId); + roleNames.ShouldContain("moderator"); + roleNames.ShouldContain("supporter"); + } + + [Fact] + public async Task UpdateRolesAsync_Should_Only_Remove_Manageable_Roles() + { + // john.nash has direct roles: moderator, supporter + // neo only has "supporter" role + using (_currentPrincipalAccessor.Change(new Claim(AbpClaimTypes.UserId, _testData.UserNeoId.ToString()))) + { + // Input is empty - try to remove all roles + await _userAppService.UpdateRolesAsync( + _testData.UserJohnId, + new IdentityUserUpdateRolesDto + { + RoleNames = Array.Empty() + } + ); + } + + // "moderator" should be preserved (neo can't manage it), "supporter" removed (neo has it and it's not in input) + var roleNames = await _userRepository.GetRoleNamesAsync(_testData.UserJohnId); + roleNames.ShouldContain("moderator"); + roleNames.ShouldNotContain("supporter"); + } + + [Fact] + public async Task UpdateRolesAsync_Admin_Can_Assign_Any_Role() + { + // admin user can assign roles they do not have (e.g. "sale") + using (_currentPrincipalAccessor.Change(new[] + { + new Claim(AbpClaimTypes.UserId, _testData.UserAdminId.ToString()), + new Claim(AbpClaimTypes.Role, "admin") + })) + { + await _userAppService.UpdateRolesAsync( + _testData.UserDavidId, + new IdentityUserUpdateRolesDto + { + RoleNames = new[] { "sale" } + } + ); + } + + var roleNames = await _userRepository.GetRoleNamesAsync(_testData.UserDavidId); + roleNames.ShouldContain("sale"); + } + + [Fact] + public async Task UpdateRolesAsync_Self_Cannot_Add_New_Roles() + { + // neo only has "supporter", tries to add "admin" to self + using (_currentPrincipalAccessor.Change(new Claim(AbpClaimTypes.UserId, _testData.UserNeoId.ToString()))) + { + await _userAppService.UpdateRolesAsync( + _testData.UserNeoId, + new IdentityUserUpdateRolesDto + { + RoleNames = new[] { "supporter", "admin" } + } + ); + } + + // "admin" should not be added (neo doesn't have it), "supporter" kept + var roleNames = await _userRepository.GetRoleNamesAsync(_testData.UserNeoId); + roleNames.ShouldContain("supporter"); + roleNames.ShouldNotContain("admin"); + } + + [Fact] + public async Task UpdateRolesAsync_Self_Can_Remove_Own_Roles() + { + // admin user has: admin, moderator, supporter, manager + // Remove supporter and manager from self + await _userAppService.UpdateRolesAsync( + _testData.UserAdminId, + new IdentityUserUpdateRolesDto + { + RoleNames = new[] { "admin", "moderator" } + } + ); + + var roleNames = await _userRepository.GetRoleNamesAsync(_testData.UserAdminId); + roleNames.ShouldContain("admin"); + roleNames.ShouldContain("moderator"); + roleNames.ShouldNotContain("supporter"); + roleNames.ShouldNotContain("manager"); + } + private static string CreateRandomEmail() { return Guid.NewGuid().ToString("N").Left(16) + "@abp.io"; diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityUserValidator_Tests.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityUserValidator_Tests.cs index 6b656fbec4..752bc3496a 100644 --- a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityUserValidator_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityUserValidator_Tests.cs @@ -1,9 +1,12 @@ using System; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Localization; using Shouldly; using Volo.Abp.Identity.Localization; +using Volo.Abp.MultiTenancy; using Xunit; namespace Volo.Abp.Identity.AspNetCore; @@ -60,3 +63,131 @@ public class AbpIdentityUserValidator_Tests : AbpIdentityAspNetCoreTestBase identityResult.Errors.First().Description.ShouldBe(Localizer["Volo.Abp.Identity:InvalidEmail", "user1@volosoft.com"]); } } + +public class AbpIdentityUserValidator_SharedUser_Compatible_Tests : AbpIdentityUserValidator_Tests +{ + protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) + { + services.Configure(options => + { + options.IsEnabled = true; + options.UserSharingStrategy = TenantUserSharingStrategy.Shared; + }); + } +} + +public class AbpIdentityUserValidator_SharedUser_Tests : AbpIdentityAspNetCoreTestBase +{ + private readonly IdentityUserManager _identityUserManager; + private readonly ICurrentTenant _currentTenant; + + public AbpIdentityUserValidator_SharedUser_Tests() + { + _identityUserManager = GetRequiredService(); + _currentTenant = GetRequiredService(); + } + + protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) + { + services.Configure(options => + { + options.IsEnabled = true; + options.UserSharingStrategy = TenantUserSharingStrategy.Shared; + }); + } + + [Fact] + public async Task Should_Reject_Duplicate_UserName_Across_Tenants() + { + var tenant1Id = Guid.NewGuid(); + var tenant2Id = Guid.NewGuid(); + + using (_currentTenant.Change(tenant1Id)) + { + var user1 = new IdentityUser(Guid.NewGuid(), "shared-user", "shared-user-1@volosoft.com"); + (await _identityUserManager.CreateAsync(user1)).Succeeded.ShouldBeTrue(); + } + + using (_currentTenant.Change(tenant2Id)) + { + var user2 = new IdentityUser(Guid.NewGuid(), "shared-user", "shared-user-2@volosoft.com"); + var result = await _identityUserManager.CreateAsync(user2); + + result.Succeeded.ShouldBeFalse(); + result.Errors.Count().ShouldBe(1); + result.Errors.First().Code.ShouldBe("DuplicateUserName"); + } + } + + [Fact] + public async Task Should_Reject_Duplicate_Email_Across_Tenants() + { + var tenant1Id = Guid.NewGuid(); + var tenant2Id = Guid.NewGuid(); + const string sharedEmail = "shared-email@volosoft.com"; + + using (_currentTenant.Change(tenant1Id)) + { + var user1 = new IdentityUser(Guid.NewGuid(), "shared-email-user-1", sharedEmail); + (await _identityUserManager.CreateAsync(user1)).Succeeded.ShouldBeTrue(); + } + + using (_currentTenant.Change(tenant2Id)) + { + var user2 = new IdentityUser(Guid.NewGuid(), "shared-email-user-2", sharedEmail); + var result = await _identityUserManager.CreateAsync(user2); + + result.Succeeded.ShouldBeFalse(); + result.Errors.Count().ShouldBe(1); + result.Errors.First().Code.ShouldBe("DuplicateEmail"); + } + } + + [Fact] + public async Task Should_Reject_UserName_That_Matches_Another_Users_Email_Across_Tenants() + { + var tenant1Id = Guid.NewGuid(); + var tenant2Id = Guid.NewGuid(); + const string sharedValue = "conflict@volosoft.com"; + + using (_currentTenant.Change(tenant1Id)) + { + var user1 = new IdentityUser(Guid.NewGuid(), "unique-user", sharedValue); + (await _identityUserManager.CreateAsync(user1)).Succeeded.ShouldBeTrue(); + } + + using (_currentTenant.Change(tenant2Id)) + { + var user2 = new IdentityUser(Guid.NewGuid(), sharedValue, "another@volosoft.com"); + var result = await _identityUserManager.CreateAsync(user2); + + result.Succeeded.ShouldBeFalse(); + result.Errors.Count().ShouldBe(1); + result.Errors.First().Code.ShouldBe("InvalidUserName"); + } + } + + [Fact] + public async Task Should_Reject_Email_That_Matches_Another_Users_UserName_Across_Tenants() + { + var tenant1Id = Guid.NewGuid(); + var tenant2Id = Guid.NewGuid(); + const string sharedValue = "conflict-user"; + + using (_currentTenant.Change(tenant1Id)) + { + var user1 = new IdentityUser(Guid.NewGuid(), sharedValue, "conflict-user-1@volosoft.com"); + (await _identityUserManager.CreateAsync(user1)).Succeeded.ShouldBeTrue(); + } + + using (_currentTenant.Change(tenant2Id)) + { + var user2 = new IdentityUser(Guid.NewGuid(), "another-user", sharedValue); + var result = await _identityUserManager.CreateAsync(user2); + + result.Succeeded.ShouldBeFalse(); + result.Errors.Count().ShouldBe(1); + result.Errors.First().Code.ShouldBe("InvalidEmail"); + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityErrorDescriber_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityErrorDescriber_Tests.cs index a7f68ec0b2..18da5ae9ce 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityErrorDescriber_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityErrorDescriber_Tests.cs @@ -200,9 +200,12 @@ public class AbpIdentityErrorDescriber_Tests : AbpIdentityDomainTestBase var mismatchUser = new IdentityUser(Guid.NewGuid(), "mismatch_user_en", "mismatch_user_en@abp.io"); (await userManager.CreateAsync(mismatchUser, "Abp123!")).Succeeded.ShouldBeTrue(); - var mismatchResult = await userManager.ChangePasswordAsync(mismatchUser, "WrongOld123!", "NewAbp123!"); - mismatchResult.Succeeded.ShouldBeFalse(); - mismatchResult.Errors.ShouldContain(e => e.Description == "Incorrect password."); + var identityException = await Assert.ThrowsAsync(async () => + { + await userManager.ChangePasswordAsync(mismatchUser, "WrongOld123!", "NewAbp123!"); + }); + identityException.IdentityResult.Succeeded.ShouldBeFalse(); + identityException.IdentityResult.Errors.ShouldContain(e => e.Description == "Incorrect password."); var recoveryUser = new IdentityUser(Guid.NewGuid(), "recovery_user_en", "recovery_user_en@abp.io"); ObjectHelper.TrySetProperty(recoveryUser, x => x.TwoFactorEnabled, () => true); @@ -321,9 +324,12 @@ public class AbpIdentityErrorDescriber_Tests : AbpIdentityDomainTestBase var mismatchUser = new IdentityUser(Guid.NewGuid(), "mismatch_user_tr", "mismatch_user_tr@abp.io"); (await userManager.CreateAsync(mismatchUser, "Abp123!")).Succeeded.ShouldBeTrue(); - var mismatchResult = await userManager.ChangePasswordAsync(mismatchUser, "WrongOld123!", "NewAbp123!"); - mismatchResult.Succeeded.ShouldBeFalse(); - mismatchResult.Errors.ShouldContain(e => e.Description == "Hatalı şifre."); + var identityException = await Assert.ThrowsAsync(async () => + { + await userManager.ChangePasswordAsync(mismatchUser, "WrongOld123!", "NewAbp123!"); + }); + identityException.IdentityResult.Succeeded.ShouldBeFalse(); + identityException.IdentityResult.Errors.ShouldContain(e => e.Description == "Hatalı şifre."); var recoveryUser = new IdentityUser(Guid.NewGuid(), "recovery_user_tr", "recovery_user_tr@abp.io"); ObjectHelper.TrySetProperty(recoveryUser, x => x.TwoFactorEnabled, () => true); @@ -441,9 +447,12 @@ public class AbpIdentityErrorDescriber_Tests : AbpIdentityDomainTestBase var mismatchUser = new IdentityUser(Guid.NewGuid(), "mismatch_user_zh", "mismatch_user_zh@abp.io"); (await userManager.CreateAsync(mismatchUser, "Abp123!")).Succeeded.ShouldBeTrue(); - var mismatchResult = await userManager.ChangePasswordAsync(mismatchUser, "WrongOld123!", "NewAbp123!"); - mismatchResult.Succeeded.ShouldBeFalse(); - mismatchResult.Errors.ShouldContain(e => e.Description == "密码错误。"); + var identityException = await Assert.ThrowsAsync(async () => + { + await userManager.ChangePasswordAsync(mismatchUser, "WrongOld123!", "NewAbp123!"); + }); + identityException.IdentityResult.Succeeded.ShouldBeFalse(); + identityException.IdentityResult.Errors.ShouldContain(e => e.Description == "密码错误。"); var recoveryUser = new IdentityUser(Guid.NewGuid(), "recovery_user_zh", "recovery_user_zh@abp.io"); ObjectHelper.TrySetProperty(recoveryUser, x => x.TwoFactorEnabled, () => true); diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs index da26de3e3d..48da394a05 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs @@ -490,3 +490,148 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase TestSettingValueProvider.AddSetting(IdentitySettingNames.Password.ForceUsersToPeriodicallyChangePassword, true.ToString()); } } + +public class SharedTenantUserSharingStrategy_IdentityUserManager_Tests : AbpIdentityDomainTestBase +{ + private readonly IdentityUserManager _identityUserManager; + private readonly IIdentityUserRepository _identityUserRepository; + private readonly ICurrentTenant _currentTenant; + private readonly IUnitOfWorkManager _unitOfWorkManager; + + public SharedTenantUserSharingStrategy_IdentityUserManager_Tests() + { + _identityUserManager = GetRequiredService(); + _identityUserRepository = GetRequiredService(); + _currentTenant = GetRequiredService(); + _unitOfWorkManager = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + services.Configure(options => + { + options.IsEnabled = true; + options.UserSharingStrategy = TenantUserSharingStrategy.Shared; + }); + } + + [Fact] + public async Task FindSharedUserByEmailAsync_Should_Return_Host_User() + { + var tenantId = Guid.NewGuid(); + var email = "shared-email@abp.io"; + + using (var uow = _unitOfWorkManager.Begin()) + { + await CreateUserAsync(null, "shared-host-email", email); + await CreateUserAsync(tenantId, "shared-tenant-email", email); + await uow.CompleteAsync(); + } + + using (_currentTenant.Change(tenantId)) + { + var user = await _identityUserManager.FindSharedUserByEmailAsync(email); + + user.ShouldNotBeNull(); + user.TenantId.ShouldBeNull(); + user.UserName.ShouldBe("shared-host-email"); + } + } + + [Fact] + public async Task FindSharedUserByNameAsync_Should_Return_Host_User() + { + var tenantId = Guid.NewGuid(); + var userName = "shared-user-name"; + + using (var uow = _unitOfWorkManager.Begin()) + { + await CreateUserAsync(null, userName, "shared-host-name@abp.io"); + await CreateUserAsync(tenantId, userName, "shared-tenant-name@abp.io"); + await uow.CompleteAsync(); + } + + using (_currentTenant.Change(tenantId)) + { + var user = await _identityUserManager.FindSharedUserByNameAsync(userName); + + user.ShouldNotBeNull(); + user.TenantId.ShouldBeNull(); + user.UserName.ShouldBe(userName); + } + } + + [Fact] + public async Task FindSharedUserByLoginAsync_Should_Return_Host_User() + { + var tenantId = Guid.NewGuid(); + const string loginProvider = "github"; + const string providerKey = "shared-login"; + + using (var uow = _unitOfWorkManager.Begin()) + { + await CreateUserAsync(null, "shared-host-login", "shared-host-login@abp.io", user => + { + user.AddLogin(new UserLoginInfo(loginProvider, providerKey, "Shared Login")); + }); + + await CreateUserAsync(tenantId, "shared-tenant-login", "shared-tenant-login@abp.io", user => + { + user.AddLogin(new UserLoginInfo(loginProvider, providerKey, "Shared Login")); + }); + + await uow.CompleteAsync(); + } + + using (_currentTenant.Change(tenantId)) + { + var user = await _identityUserManager.FindSharedUserByLoginAsync(loginProvider, providerKey); + + user.ShouldNotBeNull(); + user.TenantId.ShouldBeNull(); + user.UserName.ShouldBe("shared-host-login"); + } + } + + [Fact] + public async Task FindSharedUserByPasskeyIdAsync_Should_Return_Host_User() + { + var tenantId = Guid.NewGuid(); + var credentialId = new byte[] { 10, 20, 30, 40, 50, 60 }; + + using (var uow = _unitOfWorkManager.Begin()) + { + await CreateUserAsync(null, "shared-host-passkey", "shared-host-passkey@abp.io", user => + { + user.AddPasskey(credentialId, new IdentityPasskeyData()); + }); + await uow.CompleteAsync(); + } + + using (_currentTenant.Change(tenantId)) + { + var user = await _identityUserManager.FindSharedUserByPasskeyIdAsync(credentialId); + + user.ShouldNotBeNull(); + user.TenantId.ShouldBeNull(); + user.UserName.ShouldBe("shared-host-passkey"); + } + } + + private async Task CreateUserAsync( + Guid? tenantId, + string userName, + string email, + Action? configureUser = null) + { + var user = new IdentityUser(Guid.NewGuid(), userName, email, tenantId); + configureUser?.Invoke(user); + + using (_currentTenant.Change(tenantId)) + { + await _identityUserRepository.InsertAsync(user); + } + + return user; + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs index 15ef80b4c4..7132dd9662 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs @@ -124,8 +124,11 @@ public class AbpIdentityTestDataBuilder : ITransientDependency private async Task AddUsers() { - var adminUser = new IdentityUser(_guidGenerator.Create(), "administrator", "admin@abp.io"); + var adminUser = new IdentityUser(_testData.UserAdminId, "administrator", "administrator@abp.io"); adminUser.AddRole(_adminRole.Id); + adminUser.AddRole(_moderatorRole.Id); + adminUser.AddRole(_supporterRole.Id); + adminUser.AddRole(_managerRole.Id); adminUser.AddClaim(_guidGenerator, new Claim("TestClaimType", "42")); await _userRepository.InsertAsync(adminUser); diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityRoleRepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityRoleRepository_Tests.cs index ffeb1220b1..a677fb4841 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityRoleRepository_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityRoleRepository_Tests.cs @@ -81,9 +81,9 @@ public abstract class IdentityRoleRepository_Tests : AbpIdentity roles.Count.ShouldBe(5); roles.ShouldContain(r => r.Role.Name == "admin" && r.UserCount == 2); - roles.ShouldContain(r => r.Role.Name == "moderator" && r.UserCount == 1); - roles.ShouldContain(r => r.Role.Name == "supporter" && r.UserCount == 2); - roles.ShouldContain(r => r.Role.Name == "manager" && r.UserCount == 1); + roles.ShouldContain(r => r.Role.Name == "moderator" && r.UserCount == 2); + roles.ShouldContain(r => r.Role.Name == "supporter" && r.UserCount == 3); + roles.ShouldContain(r => r.Role.Name == "manager" && r.UserCount == 2); using (var uow = UnitOfWorkManager.Begin()) @@ -96,7 +96,7 @@ public abstract class IdentityRoleRepository_Tests : AbpIdentity roles = await RoleRepository.GetListWithUserCountAsync(); roles.Count.ShouldBe(5); - roles.ShouldContain(r => r.Role.Name == "manager" && r.UserCount == 0); + roles.ShouldContain(r => r.Role.Name == "manager" && r.UserCount == 1); roles.ShouldContain(r => r.Role.Name == "sale" && r.UserCount == 0); } } diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityTestData.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityTestData.cs index b6cb14de5c..0b8cc2ce42 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityTestData.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityTestData.cs @@ -5,6 +5,7 @@ namespace Volo.Abp.Identity; public class IdentityTestData : ISingletonDependency { + public Guid UserAdminId { get; } = Guid.NewGuid(); public Guid RoleModeratorId { get; } = Guid.NewGuid(); public Guid RoleSupporterId { get; } = Guid.NewGuid(); public Guid RoleManagerId { get; } = Guid.NewGuid(); diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs index 58dc072359..ebcc594515 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; using Xunit; namespace Volo.Abp.Identity; @@ -19,6 +20,7 @@ public abstract class IdentityUserRepository_Tests : AbpIdentity protected IOrganizationUnitRepository OrganizationUnitRepository { get; } protected OrganizationUnitManager OrganizationUnitManager { get; } protected IdentityTestData TestData { get; } + protected ICurrentTenant CurrentTenant { get; } protected IdentityUserRepository_Tests() { @@ -28,6 +30,7 @@ public abstract class IdentityUserRepository_Tests : AbpIdentity OrganizationUnitRepository = GetRequiredService(); OrganizationUnitManager = GetRequiredService();; TestData = ServiceProvider.GetRequiredService(); + CurrentTenant = GetRequiredService(); } [Fact] @@ -119,7 +122,8 @@ public abstract class IdentityUserRepository_Tests : AbpIdentity public async Task GetListByNormalizedRoleNameAsync() { var users = await UserRepository.GetListByNormalizedRoleNameAsync(LookupNormalizer.NormalizeName("supporter")); - users.Count.ShouldBe(2); + users.Count.ShouldBe(3); + users.ShouldContain(u => u.UserName == "administrator"); users.ShouldContain(u => u.UserName == "john.nash"); users.ShouldContain(u => u.UserName == "neo"); } @@ -127,14 +131,17 @@ public abstract class IdentityUserRepository_Tests : AbpIdentity [Fact] public async Task GetUserIdListByRoleIdAsync() { + var admin = await UserRepository.FindByNormalizedUserNameAsync(LookupNormalizer.NormalizeName("administrator")); var john = await UserRepository.FindByNormalizedUserNameAsync(LookupNormalizer.NormalizeName("john.nash")); var neo = await UserRepository.FindByNormalizedUserNameAsync(LookupNormalizer.NormalizeName("neo")); + admin.ShouldNotBeNull(); john.ShouldNotBeNull(); neo.ShouldNotBeNull(); var roleId = (await RoleRepository.FindByNormalizedNameAsync(LookupNormalizer.NormalizeName("supporter"))).Id; var users = await UserRepository.GetUserIdListByRoleIdAsync(roleId); - users.Count.ShouldBe(2); + users.Count.ShouldBe(3); + users.ShouldContain(id => id == admin.Id); users.ShouldContain(id => id == john.Id); users.ShouldContain(id => id == neo.Id); } @@ -313,4 +320,140 @@ public abstract class IdentityUserRepository_Tests : AbpIdentity (await UserRepository.FindByPasskeyIdAsync((byte[])[1, 2, 3])).ShouldBeNull(); } + + [Fact] + public async Task GetUsersByNormalizedUserNameAsync() + { + var users = await UserRepository.GetUsersByNormalizedUserNameAsync( + LookupNormalizer.NormalizeName("john.nash") + ); + + users.ShouldContain(u => u.Id == TestData.UserJohnId); + + users = await UserRepository.GetUsersByNormalizedUserNameAsync( + LookupNormalizer.NormalizeName("undefined-user") + ); + users.Count.ShouldBe(0); + } + + [Fact] + public async Task GetUsersByNormalizedUserNamesAsync() + { + var users = await UserRepository.GetUsersByNormalizedUserNamesAsync(new[] + { + LookupNormalizer.NormalizeName("john.nash"), + LookupNormalizer.NormalizeName("neo"), + LookupNormalizer.NormalizeName("undefined-user") + }); + + users.Count.ShouldBe(2); + users.ShouldContain(u => u.Id == TestData.UserJohnId); + users.ShouldContain(u => u.Id == TestData.UserNeoId); + } + + [Fact] + public async Task GetUsersByNormalizedEmailAsync() + { + var users = await UserRepository.GetUsersByNormalizedEmailAsync( + LookupNormalizer.NormalizeEmail("john.nash@abp.io") + ); + + users.ShouldContain(u => u.Id == TestData.UserJohnId); + + users = await UserRepository.GetUsersByNormalizedEmailAsync( + LookupNormalizer.NormalizeEmail("undefined-user@abp.io") + ); + users.Count.ShouldBe(0); + } + + [Fact] + public async Task GetUsersByNormalizedEmailsAsync() + { + var users = await UserRepository.GetUsersByNormalizedEmailsAsync(new[] + { + LookupNormalizer.NormalizeEmail("john.nash@abp.io"), + LookupNormalizer.NormalizeEmail("neo@abp.io"), + LookupNormalizer.NormalizeEmail("undefined-user@abp.io") + }); + + users.Count.ShouldBe(2); + users.ShouldContain(u => u.Id == TestData.UserJohnId); + users.ShouldContain(u => u.Id == TestData.UserNeoId); + } + + [Fact] + public async Task GetUsersByLoginAsync() + { + var users = await UserRepository.GetUsersByLoginAsync("github", "john"); + users.Count.ShouldBe(1); + users.ShouldContain(u => u.Id == TestData.UserJohnId); + + users = await UserRepository.GetUsersByLoginAsync("github", "undefined-user"); + users.Count.ShouldBe(0); + } + + [Fact] + public async Task GetUsersByPasskeyIdAsync() + { + var users = await UserRepository.GetUsersByPasskeyIdAsync(TestData.PasskeyCredentialId1); + users.Count.ShouldBe(1); + users.ShouldContain(u => u.Id == TestData.UserJohnId); + + users = await UserRepository.GetUsersByPasskeyIdAsync(TestData.PasskeyCredentialId3); + users.Count.ShouldBe(1); + users.ShouldContain(u => u.Id == TestData.UserNeoId); + + users = await UserRepository.GetUsersByPasskeyIdAsync((byte[])[1, 2, 3]); + users.Count.ShouldBe(0); + } + + [Fact] + public async Task FindByNormalizedUserNameAsync_With_TenantId() + { + var tenantId = Guid.NewGuid(); + var tenantUser = new IdentityUser(Guid.NewGuid(), "tenant.user", "tenant.user@abp.io", tenantId); + + await UserRepository.InsertAsync(tenantUser, autoSave: true); + + using (CurrentTenant.Change(tenantId)) + { + var user = await UserRepository.FindByNormalizedUserNameAsync( + tenantId, + LookupNormalizer.NormalizeName("tenant.user") + ); + + user.ShouldNotBeNull(); + user.Id.ShouldBe(tenantUser.Id); + } + + (await UserRepository.FindByNormalizedUserNameAsync( + tenantId, + LookupNormalizer.NormalizeName("tenant.user") + )).ShouldBeNull(); + } + + [Fact] + public async Task FindByNormalizedEmailAsync_With_TenantId() + { + var tenantId = Guid.NewGuid(); + var tenantUser = new IdentityUser(Guid.NewGuid(), "tenant.email", "tenant.email@abp.io", tenantId); + + await UserRepository.InsertAsync(tenantUser, autoSave: true); + + using (CurrentTenant.Change(tenantId)) + { + var user = await UserRepository.FindByNormalizedEmailAsync( + tenantId, + LookupNormalizer.NormalizeEmail("tenant.email@abp.io") + ); + + user.ShouldNotBeNull(); + user.Id.ShouldBe(tenantUser.Id); + } + + (await UserRepository.FindByNormalizedEmailAsync( + tenantId, + LookupNormalizer.NormalizeEmail("tenant.email@abp.io") + )).ShouldBeNull(); + } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientFinderResult.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientFinderResult.cs new file mode 100644 index 0000000000..d0c42968c7 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientFinderResult.cs @@ -0,0 +1,10 @@ +using System; + +namespace Volo.Abp.IdentityServer.Clients; + +public class ClientFinderResult +{ + public Guid Id { get; set; } + + public string ClientId { get; set; } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/IClientFinder.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/IClientFinder.cs new file mode 100644 index 0000000000..be96379902 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/IClientFinder.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Volo.Abp.IdentityServer.Clients; + +public interface IClientFinder +{ + Task> SearchAsync(string filter, int page = 1); +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/FR.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/FR.json index 1d62307724..27edc5d80a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/FR.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/FR.json @@ -11,6 +11,7 @@ "InvalidUsername": "Nom d'utilisateur ou mot de passe invalide!", "InvalidAuthenticatorCode": "Code d'authentification invalide !", "InvalidRecoveryCode": "Code de récupération invalide !", - "TheTargetUserIsNotLinkedToYou": "L'utilisateur cible n'est pas lié à vous!" + "TheTargetUserIsNotLinkedToYou": "L'utilisateur cible n'est pas lié à vous!", + "ClientResourcePermissionProviderKeyLookupService": "Client" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ar.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ar.json index 3329275161..ee9fd11913 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ar.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ar.json @@ -11,6 +11,7 @@ "InvalidUsername": "اسم المستخدم أو كلمة المرور غير صالحة!", "InvalidAuthenticatorCode": "كود المصدق غير صالح!", "InvalidRecoveryCode": "رمز الاسترداد غير صالح!", - "TheTargetUserIsNotLinkedToYou": "المستخدم المستهدف غير مرتبط بك!" + "TheTargetUserIsNotLinkedToYou": "المستخدم المستهدف غير مرتبط بك!", + "ClientResourcePermissionProviderKeyLookupService": "العميل" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/cs.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/cs.json index 1c5cb2bbf6..f77e12665b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/cs.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/cs.json @@ -11,6 +11,7 @@ "InvalidUsername": "Neplatné uživatelské jméno či heslo!", "InvalidAuthenticatorCode": "Neplatný ověřovací kód!", "InvalidRecoveryCode": "Neplatný kód pro obnovení!", - "TheTargetUserIsNotLinkedToYou": "Cílový uživatel s vámi není spojen!" + "TheTargetUserIsNotLinkedToYou": "Cílový uživatel s vámi není spojen!", + "ClientResourcePermissionProviderKeyLookupService": "Klient" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/de.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/de.json index b0fc6bd640..3738380e70 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/de.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/de.json @@ -11,6 +11,7 @@ "InvalidUsername": "Ungültiger Benutzername oder Passwort!", "InvalidAuthenticatorCode": "Ungültiger Authentifizierungscode!", "InvalidRecoveryCode": "Ungültiger Wiederherstellungscode!", - "TheTargetUserIsNotLinkedToYou": "Der Zielbenutzer ist nicht mit Ihnen verknüpft!" + "TheTargetUserIsNotLinkedToYou": "Der Zielbenutzer ist nicht mit Ihnen verknüpft!", + "ClientResourcePermissionProviderKeyLookupService": "Client" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/el.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/el.json index 246db314c7..9528ee45de 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/el.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/el.json @@ -10,6 +10,7 @@ "LoginIsNotAllowed": "Δεν επιτρέπεται να συνδεθείτε! Ο λογαριασμός σας είναι ανενεργός ή χρειάζεται να επιβεβαιώσετε το email/τον αριθμό τηλεφώνου σας.", "InvalidUsername": "Μη έγκυρο όνομα ή κωδικός!", "InvalidAuthenticatorCode": "Μη έγκυρος κωδικός ελέγχου ταυτότητας!", - "TheTargetUserIsNotLinkedToYou": "Ο χρήστης-στόχος δεν είναι συνδεδεμένος με εσάς!" + "TheTargetUserIsNotLinkedToYou": "Ο χρήστης-στόχος δεν είναι συνδεδεμένος με εσάς!", + "ClientResourcePermissionProviderKeyLookupService": "Πελάτης" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en-GB.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en-GB.json index 173379249c..aaf48fefee 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en-GB.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en-GB.json @@ -9,6 +9,7 @@ "InvalidUserNameOrPassword": "Invalid username or password!", "LoginIsNotAllowed": "You are not allowed to login! Your account is inactive or needs to confirm your email/phone number.", "InvalidUsername": "Invalid username or password!", - "TheTargetUserIsNotLinkedToYou": "The target user is not linked to you!" + "TheTargetUserIsNotLinkedToYou": "The target user is not linked to you!", + "ClientResourcePermissionProviderKeyLookupService": "Client" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json index 82d4be83b0..71ee543544 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json @@ -11,6 +11,7 @@ "InvalidUsername": "Invalid username or password!", "InvalidAuthenticatorCode": "Invalid authenticator code!", "InvalidRecoveryCode": "Invalid recovery code!", - "TheTargetUserIsNotLinkedToYou": "The target user is not linked to you!" + "TheTargetUserIsNotLinkedToYou": "The target user is not linked to you!", + "ClientResourcePermissionProviderKeyLookupService": "Client" } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/es.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/es.json index 4c2ecd92ee..9cd39dea54 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/es.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/es.json @@ -11,6 +11,7 @@ "InvalidUsername": "Nombre de usuario icorrecto", "InvalidAuthenticatorCode": "¡Código de autenticador no válido!", "InvalidRecoveryCode": "¡Código de recuperación no válido!", - "TheTargetUserIsNotLinkedToYou": "El usuario de destino no está asociado a usted." + "TheTargetUserIsNotLinkedToYou": "El usuario de destino no está asociado a usted.", + "ClientResourcePermissionProviderKeyLookupService": "Cliente" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/fa.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/fa.json index 8713511f43..ec7f8d355b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/fa.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/fa.json @@ -11,6 +11,7 @@ "InvalidUsername": "نام کاربری یا رمز عبور نامعتبر!", "InvalidAuthenticatorCode": "کد احراز هویت نامعتبر!", "InvalidRecoveryCode": "کد بازیابی نامعتبر!", - "TheTargetUserIsNotLinkedToYou": "کاربر هدف به شما پیوند داده نشده است!" + "TheTargetUserIsNotLinkedToYou": "کاربر هدف به شما پیوند داده نشده است!", + "ClientResourcePermissionProviderKeyLookupService": "کلاینت" } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/fi.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/fi.json index 94779f34b3..fe3f0747a9 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/fi.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/fi.json @@ -11,6 +11,7 @@ "InvalidUsername": "Väärä käyttäjänimi tai salasana!", "InvalidAuthenticatorCode": "Virheellinen todennuskoodi!", "InvalidRecoveryCode": "Virheellinen palautuskoodi!", - "TheTargetUserIsNotLinkedToYou": "Kohdekäyttäjä ei ole linkitetty sinuun!" + "TheTargetUserIsNotLinkedToYou": "Kohdekäyttäjä ei ole linkitetty sinuun!", + "ClientResourcePermissionProviderKeyLookupService": "Asiakas" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hi.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hi.json index 2df86f55bc..c1e2dbe4b5 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hi.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hi.json @@ -11,6 +11,7 @@ "InvalidUsername": "अमान्य उपयोगकर्ता नाम या पासवर्ड!", "InvalidAuthenticatorCode": "अमान्य प्रमाणक कोड!", "InvalidRecoveryCode": "अमान्य पुनर्प्राप्ति कोड!", - "TheTargetUserIsNotLinkedToYou": "लक्ष्य उपयोगकर्ता आपसे जुड़ा नहीं है!" + "TheTargetUserIsNotLinkedToYou": "लक्ष्य उपयोगकर्ता आपसे जुड़ा नहीं है!", + "ClientResourcePermissionProviderKeyLookupService": "क्लाइंट" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hr.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hr.json index da79db308c..693bd3513e 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hr.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hr.json @@ -11,6 +11,7 @@ "InvalidUsername": "Neispravno korisničko ime ili lozinka!", "InvalidAuthenticatorCode": "Nevažeći kod autentifikatora!", "InvalidRecoveryCode": "Nevažeći kod za oporavak!", - "TheTargetUserIsNotLinkedToYou": "Ciljani korisnik nije povezan s vama!" + "TheTargetUserIsNotLinkedToYou": "Ciljani korisnik nije povezan s vama!", + "ClientResourcePermissionProviderKeyLookupService": "Klijent" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hu.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hu.json index e41b61c736..505e034724 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hu.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hu.json @@ -11,6 +11,7 @@ "InvalidUsername": "Érvénytelen felhasználónév vagy jelszó!", "InvalidAuthenticatorCode": "Érvénytelen hitelesítő kód!", "InvalidRecoveryCode": "Érvénytelen helyreállítási kód!", - "TheTargetUserIsNotLinkedToYou": "A célfelhasználó nincs hozzád kapcsolódva!" + "TheTargetUserIsNotLinkedToYou": "A célfelhasználó nincs hozzád kapcsolódva!", + "ClientResourcePermissionProviderKeyLookupService": "Kliens" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/is.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/is.json index 8f97265691..fc4b11af18 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/is.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/is.json @@ -11,6 +11,7 @@ "InvalidUsername": "Ógilt notendanafn eða lykilorð!", "InvalidAuthenticatorCode": "Ógildur auðkenningarkóði!", "InvalidRecoveryCode": "Ógildur endurheimtarkóði!", - "TheTargetUserIsNotLinkedToYou": "Marknotandinn er ekki tengdur þér!" + "TheTargetUserIsNotLinkedToYou": "Marknotandinn er ekki tengdur þér!", + "ClientResourcePermissionProviderKeyLookupService": "Biðlari" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/it.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/it.json index 1795289fa3..eb0e87c346 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/it.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/it.json @@ -11,6 +11,7 @@ "InvalidUsername": "Username o password non validi!", "InvalidAuthenticatorCode": "Codice autenticatore non valido!", "InvalidRecoveryCode": "Codice di ripristino non valido!", - "TheTargetUserIsNotLinkedToYou": "L'utente indicato non è collegato a te!" + "TheTargetUserIsNotLinkedToYou": "L'utente indicato non è collegato a te!", + "ClientResourcePermissionProviderKeyLookupService": "Client" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/nl.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/nl.json index e8a7a5c0b1..baaca72b61 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/nl.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/nl.json @@ -11,6 +11,7 @@ "InvalidUsername": "Ongeldige gebruikersnaam of wachtwoord!", "InvalidAuthenticatorCode": "Ongeldige authenticatiecode!", "InvalidRecoveryCode": "Ongeldige herstelcode!", - "TheTargetUserIsNotLinkedToYou": "De beoogde gebruiker is niet aan jou gekoppeld!" + "TheTargetUserIsNotLinkedToYou": "De beoogde gebruiker is niet aan jou gekoppeld!", + "ClientResourcePermissionProviderKeyLookupService": "Client" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pl-PL.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pl-PL.json index a231a6ec3f..59a831a878 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pl-PL.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pl-PL.json @@ -11,6 +11,7 @@ "InvalidUsername": "Nieprawidłowa nazwa użytkownika lub hasło!", "InvalidAuthenticatorCode": "Nieprawidłowy kod uwierzytelniający!", "InvalidRecoveryCode": "Nieprawidłowy kod odzyskiwania!", - "TheTargetUserIsNotLinkedToYou": "Docelowy użytkownik nie jest z Tobą powiązany!" + "TheTargetUserIsNotLinkedToYou": "Docelowy użytkownik nie jest z Tobą powiązany!", + "ClientResourcePermissionProviderKeyLookupService": "Klient" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pt-BR.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pt-BR.json index db5d2fb00e..35ab5aa711 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pt-BR.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pt-BR.json @@ -11,6 +11,7 @@ "InvalidUsername": "Nome de usuário ou senha inválidos!", "InvalidAuthenticatorCode": "Código de autenticador inválido!", "InvalidRecoveryCode": "Código de recuperação inválido!", - "TheTargetUserIsNotLinkedToYou": "O usuário-alvo não está vinculado a você!" + "TheTargetUserIsNotLinkedToYou": "O usuário-alvo não está vinculado a você!", + "ClientResourcePermissionProviderKeyLookupService": "Cliente" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ro-RO.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ro-RO.json index a1af796373..9ab41e64bc 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ro-RO.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ro-RO.json @@ -11,6 +11,7 @@ "InvalidUsername": "Nume de utilizator sau parolă invalidă!", "InvalidAuthenticatorCode": "Cod de autentificare invalid!", "InvalidRecoveryCode": "Cod de recuperare nevalid!", - "TheTargetUserIsNotLinkedToYou": "Utilizatorul ţintă nu este conectat la dumneavoastră!" + "TheTargetUserIsNotLinkedToYou": "Utilizatorul ţintă nu este conectat la dumneavoastră!", + "ClientResourcePermissionProviderKeyLookupService": "Client" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ru.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ru.json index 0c8a0f9fe5..90db053cd6 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ru.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/ru.json @@ -11,6 +11,7 @@ "InvalidUsername": "Неверное имя пользователя или пароль!", "InvalidAuthenticatorCode": "Неверный код аутентификатора!", "InvalidRecoveryCode": "Неверный код восстановления!", - "TheTargetUserIsNotLinkedToYou": "Целевой пользователь не связан с вами!" + "TheTargetUserIsNotLinkedToYou": "Целевой пользователь не связан с вами!", + "ClientResourcePermissionProviderKeyLookupService": "Клиент" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sk.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sk.json index e0e31056fd..181ae21fa2 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sk.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sk.json @@ -11,6 +11,7 @@ "InvalidUsername": "Nesprávne používateľské meno alebo heslo!", "InvalidAuthenticatorCode": "Neplatný overovací kód!", "InvalidRecoveryCode": "Neplatný kód na obnovenie!", - "TheTargetUserIsNotLinkedToYou": "Cieľový používateľ nie je s vami prepojený!" + "TheTargetUserIsNotLinkedToYou": "Cieľový používateľ nie je s vami prepojený!", + "ClientResourcePermissionProviderKeyLookupService": "Klient" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sl.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sl.json index 527b11b35f..b6d653d406 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sl.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sl.json @@ -11,6 +11,7 @@ "InvalidUsername": "Napačno uporabniško ime ali geslo!", "InvalidAuthenticatorCode": "Neveljavna koda za preverjanje pristnosti!", "InvalidRecoveryCode": "Neveljavna obnovitvena koda!", - "TheTargetUserIsNotLinkedToYou": "Ciljni uporabnik ni povezan z vami!" + "TheTargetUserIsNotLinkedToYou": "Ciljni uporabnik ni povezan z vami!", + "ClientResourcePermissionProviderKeyLookupService": "Odjemalec" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sv.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sv.json index cdbf5d0dff..f0a1921bdf 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sv.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sv.json @@ -11,6 +11,7 @@ "InvalidUsername": "Ogiltigt användarnamn eller lösenord!", "InvalidAuthenticatorCode": "Ogiltig autentiseringskod!", "InvalidRecoveryCode": "Ogiltig återställningskod!", - "TheTargetUserIsNotLinkedToYou": "Målanvändaren är inte kopplad till dig!" + "TheTargetUserIsNotLinkedToYou": "Målanvändaren är inte kopplad till dig!", + "ClientResourcePermissionProviderKeyLookupService": "Klient" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/tr.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/tr.json index ef893f60ef..1d1e9e7c36 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/tr.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/tr.json @@ -11,6 +11,7 @@ "InvalidUsername": "Kullanıcı adı ya da şifre geçersiz!", "InvalidAuthenticatorCode": "Geçersiz kimlik doğrulama kodu!", "InvalidRecoveryCode": "Geçersiz kurtarma kodu!", - "TheTargetUserIsNotLinkedToYou": "Hedef kullanıcı sizinle bağlantılı değil!" + "TheTargetUserIsNotLinkedToYou": "Hedef kullanıcı sizinle bağlantılı değil!", + "ClientResourcePermissionProviderKeyLookupService": "İstemci" } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/vi.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/vi.json index 4d62d91611..6eeb3b68cf 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/vi.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/vi.json @@ -11,6 +11,7 @@ "InvalidUsername": "Sai username hoặc password!", "InvalidAuthenticatorCode": "Mã xác thực không hợp lệ!", "InvalidRecoveryCode": "Mã khôi phục không hợp lệ!", - "TheTargetUserIsNotLinkedToYou": "Người dùng mục tiêu không được liên kết với bạn!" + "TheTargetUserIsNotLinkedToYou": "Người dùng mục tiêu không được liên kết với bạn!", + "ClientResourcePermissionProviderKeyLookupService": "Máy khách" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hans.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hans.json index afb5824356..bbe4d7773d 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hans.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hans.json @@ -11,6 +11,7 @@ "InvalidUsername": "用户名或密码错误!", "InvalidAuthenticatorCode": "验证码无效!", "InvalidRecoveryCode": "恢复代码无效!", - "TheTargetUserIsNotLinkedToYou": "目标用户与您没有关联!" + "TheTargetUserIsNotLinkedToYou": "目标用户与您没有关联!", + "ClientResourcePermissionProviderKeyLookupService": "客户端" } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hant.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hant.json index 3678d6b572..5e592e1409 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hant.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hant.json @@ -11,6 +11,7 @@ "InvalidUsername": "用戶名或密碼錯誤!", "InvalidAuthenticatorCode": "驗證碼無效!", "InvalidRecoveryCode": "恢復碼無效!", - "TheTargetUserIsNotLinkedToYou": "目標用戶與您無關!" + "TheTargetUserIsNotLinkedToYou": "目標用戶與您無關!", + "ClientResourcePermissionProviderKeyLookupService": "用戶端" } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientFinder.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientFinder.cs new file mode 100644 index 0000000000..d64215a047 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientFinder.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.IdentityServer.Clients; + +public class ClientFinder : IClientFinder, ITransientDependency +{ + protected IClientRepository ClientRepository { get; } + + public ClientFinder(IClientRepository clientRepository) + { + ClientRepository = clientRepository; + } + + public virtual async Task> SearchAsync(string filter, int page = 1) + { + using (ClientRepository.DisableTracking()) + { + page = page < 1 ? 1 : page; + var clients = await ClientRepository.GetListAsync(nameof(Client.ClientName), filter: filter, skipCount: (page - 1) * 10, maxResultCount: 10); + return clients.Select(x => new ClientFinderResult + { + Id = x.Id, + ClientId = x.ClientId + }).ToList(); + } + } +} diff --git a/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/ClientResourcePermissionManagerExtensions.cs b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/ClientResourcePermissionManagerExtensions.cs new file mode 100644 index 0000000000..16e686a2aa --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/ClientResourcePermissionManagerExtensions.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.Authorization.Permissions; + +namespace Volo.Abp.PermissionManagement; + +public static class ClientResourcePermissionManagerExtensions +{ + public static Task GetForClientAsync([NotNull] this IResourcePermissionManager resourcePermissionManager, string resourceName, string resourceKey, string clientId, string permissionName) + { + Check.NotNull(resourcePermissionManager, nameof(resourcePermissionManager)); + + return resourcePermissionManager.GetAsync(permissionName, resourceName, resourceKey, ClientPermissionValueProvider.ProviderName, clientId); + } + + public static Task> GetAllForClientAsync([NotNull] this IResourcePermissionManager resourcePermissionManager, string resourceName, string resourceKey, string clientId) + { + Check.NotNull(resourcePermissionManager, nameof(resourcePermissionManager)); + + return resourcePermissionManager.GetAllAsync(resourceName, resourceKey, ClientPermissionValueProvider.ProviderName, clientId); + } + + public static Task SetForClientAsync([NotNull] this IResourcePermissionManager resourcePermissionManager, string resourceName, string resourceKey, string clientId, [NotNull] string permissionName, bool isGranted) + { + Check.NotNull(resourcePermissionManager, nameof(resourcePermissionManager)); + + return resourcePermissionManager.SetAsync(permissionName, resourceName, resourceKey, ClientPermissionValueProvider.ProviderName, clientId, isGranted); + } +} diff --git a/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/AbpPermissionManagementDomainIdentityServerModule.cs b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/AbpPermissionManagementDomainIdentityServerModule.cs index 3d2d42c28f..2525ffb3d3 100644 --- a/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/AbpPermissionManagementDomainIdentityServerModule.cs +++ b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/AbpPermissionManagementDomainIdentityServerModule.cs @@ -1,5 +1,8 @@ -using Volo.Abp.Authorization.Permissions; +using System; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.IdentityServer; +using Volo.Abp.IdentityServer.Clients; using Volo.Abp.Modularity; namespace Volo.Abp.PermissionManagement.IdentityServer; @@ -18,5 +21,17 @@ public class AbpPermissionManagementDomainIdentityServerModule : AbpModule options.ProviderPolicies[ClientPermissionValueProvider.ProviderName] = "IdentityServer.Client.ManagePermissions"; }); + + context.Services.AddAbpOptions().PostConfigure((options, serviceProvider) => + { + // The IClientFinder implementation in identity Server Pro module for tiered application. + if (serviceProvider.GetService() == null) + { + return; + } + + options.ResourceManagementProviders.Add(); + options.ResourcePermissionProviderKeyLookupServices.Add(); + }); } } diff --git a/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientDeletedEventHandler.cs b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientDeletedEventHandler.cs new file mode 100644 index 0000000000..2a5ebbfb71 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientDeletedEventHandler.cs @@ -0,0 +1,31 @@ +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Authorization.Permissions.Resources; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.IdentityServer.Clients; +using Volo.Abp.Uow; + +namespace Volo.Abp.PermissionManagement.IdentityServer; + +public class ClientDeletedEventHandler : + IDistributedEventHandler>, + ITransientDependency +{ + protected IPermissionManager PermissionManager { get; } + protected IResourcePermissionManager ResourcePermissionManager { get; } + + public ClientDeletedEventHandler(IPermissionManager permissionManager, IResourcePermissionManager resourcePermissionManager) + { + PermissionManager = permissionManager; + ResourcePermissionManager = resourcePermissionManager; + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(EntityDeletedEto eventData) + { + await PermissionManager.DeleteAsync(ClientPermissionValueProvider.ProviderName, eventData.Entity.ClientId); + await ResourcePermissionManager.DeleteAsync(ClientResourcePermissionValueProvider.ProviderName, eventData.Entity.ClientId); + } +} diff --git a/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientPermissionManagementProvider.cs b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientPermissionManagementProvider.cs index dd25c6d5c0..618588bdf4 100644 --- a/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientPermissionManagementProvider.cs +++ b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientPermissionManagementProvider.cs @@ -18,7 +18,6 @@ public class ClientPermissionManagementProvider : PermissionManagementProvider guidGenerator, currentTenant) { - } public override Task CheckAsync(string name, string providerName, string providerKey) @@ -29,6 +28,14 @@ public class ClientPermissionManagementProvider : PermissionManagementProvider } } + public override Task CheckAsync(string[] names, string providerName, string providerKey) + { + using (CurrentTenant.Change(null)) + { + return base.CheckAsync(names, providerName, providerKey); + } + } + protected override Task GrantAsync(string name, string providerKey) { using (CurrentTenant.Change(null)) diff --git a/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientResourcePermissionManagementProvider.cs b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientResourcePermissionManagementProvider.cs new file mode 100644 index 0000000000..9285742131 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientResourcePermissionManagementProvider.cs @@ -0,0 +1,62 @@ +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions.Resources; +using Volo.Abp.Guids; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.PermissionManagement.IdentityServer; + +public class ClientResourcePermissionManagementProvider : ResourcePermissionManagementProvider +{ + public override string Name => ClientResourcePermissionValueProvider.ProviderName; + + public ClientResourcePermissionManagementProvider( + IResourcePermissionGrantRepository permissionGrantRepository, + IGuidGenerator guidGenerator, + ICurrentTenant currentTenant) + : base( + permissionGrantRepository, + guidGenerator, + currentTenant) + { + } + + public override Task CheckAsync(string name, string resourceName, string resourceKey, string providerName, string providerKey) + { + using (CurrentTenant.Change(null)) + { + return base.CheckAsync(name, resourceName, resourceKey, providerName, providerKey); + } + } + + public override Task CheckAsync(string[] names, string resourceName, string resourceKey, string providerName, string providerKey) + { + using (CurrentTenant.Change(null)) + { + return base.CheckAsync(names, resourceName, resourceKey, providerName, providerKey); + } + } + + public override Task SetAsync(string name, string resourceName, string resourceKey, string providerKey, bool isGranted) + { + using (CurrentTenant.Change(null)) + { + return base.SetAsync(name, resourceName, resourceKey, providerKey, isGranted); + } + } + + protected override async Task GrantAsync(string name, string resourceName, string resourceKey, string providerKey) + { + using (CurrentTenant.Change(null)) + { + await base.GrantAsync(name, resourceName, resourceKey, providerKey); + } + } + + protected override Task RevokeAsync(string name, string resourceName, string resourceKey, string providerKey) + { + using (CurrentTenant.Change(null)) + { + return base.RevokeAsync(name, resourceName, resourceKey, providerKey); + } + } +} diff --git a/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientResourcePermissionProviderKeyLookupService.cs b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientResourcePermissionProviderKeyLookupService.cs new file mode 100644 index 0000000000..7fc813dabb --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/ClientResourcePermissionProviderKeyLookupService.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions.Resources; +using Volo.Abp.DependencyInjection; +using Volo.Abp.IdentityServer.Clients; +using Volo.Abp.IdentityServer.Localization; +using Volo.Abp.Localization; + +namespace Volo.Abp.PermissionManagement.IdentityServer; + +public class ClientResourcePermissionProviderKeyLookupService : IResourcePermissionProviderKeyLookupService, ITransientDependency +{ + public string Name => ClientResourcePermissionValueProvider.ProviderName; + + public ILocalizableString DisplayName { get; } + + protected IClientFinder ClientFinder { get; } + + public ClientResourcePermissionProviderKeyLookupService(IClientFinder clientFinder) + { + ClientFinder = clientFinder; + DisplayName = LocalizableString.Create(nameof(ClientResourcePermissionProviderKeyLookupService)); + } + + public virtual async Task> SearchAsync(string filter = null, int page = 1, CancellationToken cancellationToken = default) + { + var clients = await ClientFinder.SearchAsync(filter, page); + return clients.Select(x => new ResourcePermissionProviderKeyInfo(x.ClientId, x.ClientId)).ToList(); + } + + public virtual Task> SearchAsync(string[] keys, CancellationToken cancellationToken = default) + { + // Keys are ClientIds + return Task.FromResult(keys.Select(x => new ResourcePermissionProviderKeyInfo(x, x)).ToList()); + } +} diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/package.json b/modules/openiddict/app/OpenIddict.Demo.Server/package.json index 52a1fc6c21..e544c427a0 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/package.json +++ b/modules/openiddict/app/OpenIddict.Demo.Server/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0" } } diff --git a/modules/openiddict/app/angular/package.json b/modules/openiddict/app/angular/package.json index 0eccde558f..b36953bf65 100644 --- a/modules/openiddict/app/angular/package.json +++ b/modules/openiddict/app/angular/package.json @@ -12,15 +12,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~10.1.0-rc.2", - "@abp/ng.components": "~10.1.0-rc.2", - "@abp/ng.core": "~10.1.0-rc.2", - "@abp/ng.oauth": "~10.1.0-rc.2", - "@abp/ng.identity": "~10.1.0-rc.2", - "@abp/ng.setting-management": "~10.1.0-rc.2", - "@abp/ng.tenant-management": "~10.1.0-rc.2", - "@abp/ng.theme.shared": "~10.1.0-rc.2", - "@abp/ng.theme.lepton-x": "~5.1.0-rc.2", + "@abp/ng.account": "~10.1.0", + "@abp/ng.components": "~10.1.0", + "@abp/ng.core": "~10.1.0", + "@abp/ng.oauth": "~10.1.0", + "@abp/ng.identity": "~10.1.0", + "@abp/ng.setting-management": "~10.1.0", + "@abp/ng.tenant-management": "~10.1.0", + "@abp/ng.theme.shared": "~10.1.0", + "@abp/ng.theme.lepton-x": "~5.1.0", "@angular/animations": "^15.0.1", "@angular/common": "^15.0.1", "@angular/compiler": "^15.0.1", @@ -36,7 +36,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~10.1.0-rc.2", + "@abp/ng.schematics": "~10.1.0", "@angular-devkit/build-angular": "^15.0.1", "@angular-eslint/builder": "~15.1.0", "@angular-eslint/eslint-plugin": "~15.1.0", diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/ApplicationFinderResult.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/ApplicationFinderResult.cs new file mode 100644 index 0000000000..5ff4d5041b --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/ApplicationFinderResult.cs @@ -0,0 +1,10 @@ +using System; + +namespace Volo.Abp.OpenIddict.Applications; + +public class ApplicationFinderResult +{ + public Guid Id { get; set; } + + public string ClientId { get; set; } +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/IApplicationFinder.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/IApplicationFinder.cs new file mode 100644 index 0000000000..0585df8815 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/IApplicationFinder.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Volo.Abp.OpenIddict.Applications; + +public interface IApplicationFinder +{ + Task> SearchAsync(string filter, int page = 1); +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/OpenIddictApplicationClientIdChangedEto.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/OpenIddictApplicationClientIdChangedEto.cs new file mode 100644 index 0000000000..d80e5f35d6 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/OpenIddictApplicationClientIdChangedEto.cs @@ -0,0 +1,13 @@ +using System; + +namespace Volo.Abp.OpenIddict.Applications; + +[Serializable] +public class OpenIddictApplicationClientIdChangedEto +{ + public Guid Id { get; set; } + + public string ClientId { get; set; } + + public string OldClientId { get; set; } +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/OpenIddictApplicationEto.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/OpenIddictApplicationEto.cs new file mode 100644 index 0000000000..ff853d2c4a --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/OpenIddictApplicationEto.cs @@ -0,0 +1,43 @@ +using System; + +namespace Volo.Abp.OpenIddict.Applications; + +[Serializable] +public class OpenIddictApplicationEto +{ + public Guid Id { get; set; } + + public string ApplicationType { get; set; } + + public string ClientId { get; set; } + + public string ClientSecret { get; set; } + + public string ClientType { get; set; } + + public string ConsentType { get; set; } + + public string DisplayName { get; set; } + + public string DisplayNames { get; set; } + + public string JsonWebKeySet { get; set; } + + public string Permissions { get; set; } + + public string PostLogoutRedirectUris { get; set; } + + public string Properties { get; set; } + + public string RedirectUris { get; set; } + + public string Requirements { get; set; } + + public string Settings { get; set; } + + public string FrontChannelLogoutUri { get; set; } + + public string ClientUri { get; set; } + + public string LogoUri { get; set; } +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ar.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ar.json index 61c52f63c5..c22bdea508 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ar.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ar.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "هل تريد منح {0} حق الوصول إلى بياناتك؟", "ScopesRequested": "النطاقات المطلوبة", "Accept": "قبول", - "Deny": "رفض" + "Deny": "رفض", + "ApplicationResourcePermissionProviderKeyLookupService": "العميل" } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/cs.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/cs.json index c219b5dc8f..fda735746b 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/cs.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/cs.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Chcete uživateli {0} udělit přístup ke svým datům?", "ScopesRequested": "Požadované rozsahy", "Accept": "Akceptovat", - "Deny": "Odmítnout" + "Deny": "Odmítnout", + "ApplicationResourcePermissionProviderKeyLookupService": "Klient" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/de.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/de.json index 4c6438de37..affff9da29 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/de.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/de.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Möchten Sie {0} Zugriff auf Ihre Daten gewähren?", "ScopesRequested": "Umfänge angefordert", "Accept": "Akzeptieren", - "Deny": "Leugnen" + "Deny": "Leugnen", + "ApplicationResourcePermissionProviderKeyLookupService": "Client" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/el.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/el.json index c10f34fb1d..493c73b2a7 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/el.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/el.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Θέλετε να παραχωρήσετε στον χρήστη {0} πρόσβαση στα δεδομένα σας;", "ScopesRequested": "Ζητούνται πεδία εφαρμογής", "Accept": "Αποδοχή", - "Deny": "Άρνηση" + "Deny": "Άρνηση", + "ApplicationResourcePermissionProviderKeyLookupService": "Πελάτης" } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/en.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/en.json index b6bd02bc15..d742176bd5 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/en.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/en.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Do you want to grant {0} access to your data?", "ScopesRequested": "Scopes requested", "Accept": "Accept", - "Deny": "Deny" + "Deny": "Deny", + "ApplicationResourcePermissionProviderKeyLookupService": "Client" } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/es.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/es.json index 3bec447a24..ad5a974972 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/es.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/es.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "¿Quieres otorgarle a {0} acceso a tus datos?", "ScopesRequested": "Alcances solicitados", "Accept": "Aceptar", - "Deny": "Denegar" + "Deny": "Denegar", + "ApplicationResourcePermissionProviderKeyLookupService": "Cliente" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fa.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fa.json index f1649533a9..c0c2d82340 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fa.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fa.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "آیا می خواهید به {0} اجازه دسترسی به داده های خود را بدهید؟", "ScopesRequested": "محدوده های درخواستی", "Accept": "پذیرش", - "Deny": "رد" + "Deny": "رد", + "ApplicationResourcePermissionProviderKeyLookupService": "کلاینت" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fi.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fi.json index 43dbfb17ac..ce0bb20bfe 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fi.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fi.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Haluatko myöntää käyttäjälle {0} pääsyn tietoihisi?", "ScopesRequested": "Laajuudet pyydetty", "Accept": "Hyväksy", - "Deny": "Kiellä" + "Deny": "Kiellä", + "ApplicationResourcePermissionProviderKeyLookupService": "Asiakas" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fr.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fr.json index 188116b53c..c11964d21d 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fr.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/fr.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Voulez-vous accorder à {0} l'accès à vos données ?", "ScopesRequested": "Périmètres demandés", "Accept": "Accepter", - "Deny": "Refuser" + "Deny": "Refuser", + "ApplicationResourcePermissionProviderKeyLookupService": "Client" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hi.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hi.json index 39b3370ca7..7f2678d7a0 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hi.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hi.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "क्या आप {0} को अपने डेटा तक पहुंच प्रदान करना चाहते हैं?", "ScopesRequested": "दायरे का अनुरोध किया गया", "Accept": "स्वीकार करना", - "Deny": "अस्वीकार करना" + "Deny": "अस्वीकार करना", + "ApplicationResourcePermissionProviderKeyLookupService": "क्लाइंट" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hr.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hr.json index 2dfc3b3a9d..ee16d2b1e0 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hr.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hr.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Želite li {0} odobriti pristup vašim podacima?", "ScopesRequested": "Traženi dometi", "Accept": "Prihvatiti", - "Deny": "poreći" + "Deny": "poreći", + "ApplicationResourcePermissionProviderKeyLookupService": "Klijent" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hu.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hu.json index f55ea2ac74..7a5e7b1956 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hu.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/hu.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Hozzáférést szeretne adni a(z) {0} számára az adataihoz?", "ScopesRequested": "Kért hatókörök", "Accept": "Elfogad", - "Deny": "Tiltás" + "Deny": "Tiltás", + "ApplicationResourcePermissionProviderKeyLookupService": "Kliens" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/is.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/is.json index b9fc6a43ce..b6c5bafca6 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/is.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/is.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Viltu veita {0} aðgang að gögnunum þínum?", "ScopesRequested": "Umfang óskað", "Accept": "Samþykkja", - "Deny": "Neita" + "Deny": "Neita", + "ApplicationResourcePermissionProviderKeyLookupService": "Biðlari" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/it.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/it.json index 22eb3bbafe..e5b67df57a 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/it.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/it.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Vuoi concedere a {0} l'accesso ai tuoi dati?", "ScopesRequested": "Ambiti richiesti", "Accept": "Accettare", - "Deny": "Negare" + "Deny": "Negare", + "ApplicationResourcePermissionProviderKeyLookupService": "Cliente" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/nl.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/nl.json index b3b35c6acb..7eb593fd2d 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/nl.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/nl.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Wilt u {0} toegang verlenen tot uw gegevens?", "ScopesRequested": "Scopes gevraagd", "Accept": "Aanvaarden", - "Deny": "Ontkennen" + "Deny": "Ontkennen", + "ApplicationResourcePermissionProviderKeyLookupService": "Client" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pl-PL.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pl-PL.json index 2e5e19eae7..bff402519d 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pl-PL.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pl-PL.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Czy chcesz przyznać firmie {0} dostęp do swoich danych?", "ScopesRequested": "Poproszono o zakresy", "Accept": "Zaakceptować", - "Deny": "Zaprzeczyć" + "Deny": "Zaprzeczyć", + "ApplicationResourcePermissionProviderKeyLookupService": "Klient" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pt-BR.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pt-BR.json index 60c50e9e3e..97f52a7f01 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pt-BR.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pt-BR.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Deseja permitir {0} acessar seus dados?", "ScopesRequested": "Escopo solicitado", "Accept": "Aceitar", - "Deny": "Negar" + "Deny": "Negar", + "ApplicationResourcePermissionProviderKeyLookupService": "Cliente" } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ro-RO.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ro-RO.json index a9d9eee22e..579df65787 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ro-RO.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ro-RO.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Doriți să acordați acces {0} la datele dvs.?", "ScopesRequested": "Domenii de aplicare solicitate", "Accept": "Accept", - "Deny": "Negați" + "Deny": "Negați", + "ApplicationResourcePermissionProviderKeyLookupService": "Client" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ru.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ru.json index 4f5b1d0e21..2f22d22da5 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ru.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/ru.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Вы хотите предоставить пользователю {0} доступ к вашим данным?", "ScopesRequested": "Запрошенные объемы", "Accept": "Принимать", - "Deny": "Отрицать" + "Deny": "Отрицать", + "ApplicationResourcePermissionProviderKeyLookupService": "Клиент" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sk.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sk.json index 13e0853b2d..cb017569cc 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sk.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sk.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Chcete používateľovi {0} udeliť prístup k svojim údajom?", "ScopesRequested": "Požadované rozsahy", "Accept": "súhlasiť", - "Deny": "Odmietnuť" + "Deny": "Odmietnuť", + "ApplicationResourcePermissionProviderKeyLookupService": "Klient" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sl.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sl.json index c8157ac509..49d1bd148b 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sl.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sl.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Ali želite aplikaciji {0} omogočiti dostop do vaših podatkov?", "ScopesRequested": "Zahtevani obsegi", "Accept": "Sprejmi", - "Deny": "Zanikati" + "Deny": "Zanikati", + "ApplicationResourcePermissionProviderKeyLookupService": "Odjemalec" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sv.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sv.json index 3e2a58578e..063727a745 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sv.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sv.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Vill du ge {0} tillgång till dina data?", "ScopesRequested": "Begärda omfattningar", "Accept": "Acceptera", - "Deny": "Förneka" + "Deny": "Förneka", + "ApplicationResourcePermissionProviderKeyLookupService": "Klient" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/tr.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/tr.json index 907612a6c4..847eb5f482 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/tr.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/tr.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Do you want to grant {0} access to your data?", "ScopesRequested": "İstenen kapsamlar", "Accept": "Kabul etmek", - "Deny": "Reddetmek" + "Deny": "Reddetmek", + "ApplicationResourcePermissionProviderKeyLookupService": "İstemci" } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/vi.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/vi.json index c89d882a39..4435c32298 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/vi.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/vi.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "Bạn có muốn cấp cho {0} quyền truy cập vào dữ liệu của mình không?", "ScopesRequested": "Phạm vi được yêu cầu", "Accept": "Chấp nhận", - "Deny": "Từ chối" + "Deny": "Từ chối", + "ApplicationResourcePermissionProviderKeyLookupService": "Máy khách" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/zh-Hans.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/zh-Hans.json index f00a7c9e37..ee7b4a7b0f 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/zh-Hans.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/zh-Hans.json @@ -10,6 +10,7 @@ "DoYouWantToGrantAccessToYourData": "是否要授予 {0} 访问你的数据的权限?", "ScopesRequested": "要求的Scope", "Accept": "接受", - "Deny": "拒绝" + "Deny": "拒绝", + "ApplicationResourcePermissionProviderKeyLookupService": "客户端" } } \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/zh-Hant.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/zh-Hant.json index 83aa0c35d1..ca1ceaed22 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/zh-Hant.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/zh-Hant.json @@ -11,6 +11,7 @@ "DoYouWantToGrantAccessToYourData": "是否要授予 {0} 訪問你的數據的權限?", "ScopesRequested": "要求的Scope", "Accept": "接受", - "Deny": "拒絕" + "Deny": "拒絕", + "ApplicationResourcePermissionProviderKeyLookupService": "客戶端" } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainMappers.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainMappers.cs new file mode 100644 index 0000000000..ef750fc3a6 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainMappers.cs @@ -0,0 +1,13 @@ +using Riok.Mapperly.Abstractions; +using Volo.Abp.Mapperly; +using Volo.Abp.OpenIddict.Applications; + +namespace Volo.Abp.OpenIddict; + +[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] +public partial class OpenIddictApplicationToOpenIddictApplicationEtoMapper : MapperBase +{ + public override partial OpenIddictApplicationEto Map(OpenIddictApplication source); + + public override partial void Map(OpenIddictApplication source, OpenIddictApplicationEto destination); +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainModule.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainModule.cs index fd20f71012..e235e16893 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainModule.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainModule.cs @@ -8,6 +8,7 @@ using Volo.Abp.BackgroundWorkers; using Volo.Abp.Caching; using Volo.Abp.DistributedLocking; using Volo.Abp.Domain; +using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Guids; using Volo.Abp.Identity; using Volo.Abp.Modularity; @@ -18,6 +19,7 @@ using Volo.Abp.OpenIddict.Authorizations; using Volo.Abp.OpenIddict.Scopes; using Volo.Abp.OpenIddict.Tokens; using Volo.Abp.Threading; +using Volo.Abp.Users; namespace Volo.Abp.OpenIddict; @@ -36,6 +38,15 @@ public class AbpOpenIddictDomainModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { AddOpenIddictCore(context.Services); + + context.Services.AddMapperlyObjectMapper(); + + Configure(options => + { + options.EtoMappings.Add(typeof(AbpOpenIddictDomainModule)); + + options.AutoEventSelectors.Add(); + }); } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationFinder.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationFinder.cs new file mode 100644 index 0000000000..56c6f9af99 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationFinder.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.OpenIddict.Applications; + +public class AbpApplicationFinder : IApplicationFinder, ITransientDependency +{ + protected IOpenIddictApplicationRepository ApplicationRepository { get; } + + public AbpApplicationFinder(IOpenIddictApplicationRepository applicationRepository) + { + ApplicationRepository = applicationRepository; + } + + public virtual async Task> SearchAsync(string filter, int page = 1) + { + using (ApplicationRepository.DisableTracking()) + { + page = page < 1 ? 1 : page; + var applications = await ApplicationRepository.GetListAsync(nameof(OpenIddictApplication.CreationTime), filter: filter, skipCount: (page - 1) * 10, maxResultCount: 10); + return applications.Select(x => new ApplicationFinderResult + { + Id = x.Id, + ClientId = x.ClientId + }).ToList(); + } + } +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationManager.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationManager.cs index ea2283ea25..478ccb68f1 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationManager.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationManager.cs @@ -6,29 +6,35 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using OpenIddict.Abstractions; using OpenIddict.Core; +using Volo.Abp.EventBus.Distributed; namespace Volo.Abp.OpenIddict.Applications; public class AbpApplicationManager : OpenIddictApplicationManager, IAbpApplicationManager { protected AbpOpenIddictIdentifierConverter IdentifierConverter { get; } + protected IDistributedEventBus DistributedEventBus { get; } public AbpApplicationManager( [NotNull] IOpenIddictApplicationCache cache, [NotNull] ILogger logger, [NotNull] IOptionsMonitor options, [NotNull] IOpenIddictApplicationStore resolver, - AbpOpenIddictIdentifierConverter identifierConverter) + AbpOpenIddictIdentifierConverter identifierConverter, + IDistributedEventBus distributedEventBus) : base(cache, logger, options, resolver) { IdentifierConverter = identifierConverter; + DistributedEventBus = distributedEventBus; } - public async override ValueTask UpdateAsync(OpenIddictApplicationModel application, CancellationToken cancellationToken = default) + public override async ValueTask UpdateAsync(OpenIddictApplicationModel application, CancellationToken cancellationToken = default) { + var entity = await Store.FindByIdAsync(IdentifierConverter.ToString(application.Id), cancellationToken); + var oldClientId = entity?.ClientId; + if (!Options.CurrentValue.DisableEntityCaching) { - var entity = await Store.FindByIdAsync(IdentifierConverter.ToString(application.Id), cancellationToken); if (entity != null) { await Cache.RemoveAsync(entity, cancellationToken); @@ -36,9 +42,21 @@ public class AbpApplicationManager : OpenIddictApplicationManager> GetListAsync(string sorting, int skipCount, int maxResultCount, string filter = null, CancellationToken cancellationToken = default); Task GetCountAsync(string filter = null, CancellationToken cancellationToken = default); - + Task FindByClientIdAsync(string clientId, CancellationToken cancellationToken = default); Task> FindByPostLogoutRedirectUriAsync(string address, CancellationToken cancellationToken = default); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Applications/MongoOpenIddictApplicationRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Applications/MongoOpenIddictApplicationRepository.cs index 867bbe71c5..7b3b0ba826 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Applications/MongoOpenIddictApplicationRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Applications/MongoOpenIddictApplicationRepository.cs @@ -17,7 +17,7 @@ public class MongoOpenIddictApplicationRepository : MongoDbRepository dbContextProvider) : base(dbContextProvider) { } - + public virtual async Task> GetListAsync(string sorting, int skipCount, int maxResultCount, string filter = null, CancellationToken cancellationToken = default) { diff --git a/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/ClientResourcePermissionManagerExtensions.cs b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/ClientResourcePermissionManagerExtensions.cs new file mode 100644 index 0000000000..16e686a2aa --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/ClientResourcePermissionManagerExtensions.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.Authorization.Permissions; + +namespace Volo.Abp.PermissionManagement; + +public static class ClientResourcePermissionManagerExtensions +{ + public static Task GetForClientAsync([NotNull] this IResourcePermissionManager resourcePermissionManager, string resourceName, string resourceKey, string clientId, string permissionName) + { + Check.NotNull(resourcePermissionManager, nameof(resourcePermissionManager)); + + return resourcePermissionManager.GetAsync(permissionName, resourceName, resourceKey, ClientPermissionValueProvider.ProviderName, clientId); + } + + public static Task> GetAllForClientAsync([NotNull] this IResourcePermissionManager resourcePermissionManager, string resourceName, string resourceKey, string clientId) + { + Check.NotNull(resourcePermissionManager, nameof(resourcePermissionManager)); + + return resourcePermissionManager.GetAllAsync(resourceName, resourceKey, ClientPermissionValueProvider.ProviderName, clientId); + } + + public static Task SetForClientAsync([NotNull] this IResourcePermissionManager resourcePermissionManager, string resourceName, string resourceKey, string clientId, [NotNull] string permissionName, bool isGranted) + { + Check.NotNull(resourcePermissionManager, nameof(resourcePermissionManager)); + + return resourcePermissionManager.SetAsync(permissionName, resourceName, resourceKey, ClientPermissionValueProvider.ProviderName, clientId, isGranted); + } +} diff --git a/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/AbpPermissionManagementDomainOpenIddictModule.cs b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/AbpPermissionManagementDomainOpenIddictModule.cs index 1bf2bf140d..2cad25a283 100644 --- a/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/AbpPermissionManagementDomainOpenIddictModule.cs +++ b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/AbpPermissionManagementDomainOpenIddictModule.cs @@ -1,6 +1,9 @@ -using Volo.Abp.Authorization.Permissions; +using System; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.Modularity; using Volo.Abp.OpenIddict; +using Volo.Abp.OpenIddict.Applications; namespace Volo.Abp.PermissionManagement.OpenIddict; @@ -17,5 +20,17 @@ public class AbpPermissionManagementDomainOpenIddictModule : AbpModule options.ManagementProviders.Add(); options.ProviderPolicies[ClientPermissionValueProvider.ProviderName] = "OpenIddictPro.Application.ManagePermissions"; }); + + context.Services.AddAbpOptions().PostConfigure((options, serviceProvider) => + { + // The IApplicationFinder implementation in OpenIddict Pro module for tiered application. + if (serviceProvider.GetService() == null) + { + return; + } + + options.ResourceManagementProviders.Add(); + options.ResourcePermissionProviderKeyLookupServices.Add(); + }); } } diff --git a/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationPermissionManagementProvider.cs b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationPermissionManagementProvider.cs index 4c4d6fe398..6d07a728e4 100644 --- a/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationPermissionManagementProvider.cs +++ b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationPermissionManagementProvider.cs @@ -18,7 +18,6 @@ public class ApplicationPermissionManagementProvider : PermissionManagementProvi guidGenerator, currentTenant) { - } public override Task CheckAsync(string name, string providerName, string providerKey) @@ -29,6 +28,14 @@ public class ApplicationPermissionManagementProvider : PermissionManagementProvi } } + public override Task CheckAsync(string[] names, string providerName, string providerKey) + { + using (CurrentTenant.Change(null)) + { + return base.CheckAsync(names, providerName, providerKey); + } + } + protected override Task GrantAsync(string name, string providerKey) { using (CurrentTenant.Change(null)) diff --git a/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionManagementProvider.cs b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionManagementProvider.cs new file mode 100644 index 0000000000..e12fa63d03 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionManagementProvider.cs @@ -0,0 +1,59 @@ +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions.Resources; +using Volo.Abp.Guids; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.PermissionManagement.OpenIddict; + +public class ApplicationResourcePermissionManagementProvider : ResourcePermissionManagementProvider +{ + public override string Name => ClientResourcePermissionValueProvider.ProviderName; + + public ApplicationResourcePermissionManagementProvider( + IResourcePermissionGrantRepository resourcePermissionGrantRepository, + IGuidGenerator guidGenerator, + ICurrentTenant currentTenant) + : base(resourcePermissionGrantRepository, guidGenerator, currentTenant) + { + } + + public override Task CheckAsync(string name, string resourceName, string resourceKey, string providerName, string providerKey) + { + using (CurrentTenant.Change(null)) + { + return base.CheckAsync(name, resourceName, resourceKey, providerName, providerKey); + } + } + + public override Task CheckAsync(string[] names, string resourceName, string resourceKey, string providerName, string providerKey) + { + using (CurrentTenant.Change(null)) + { + return base.CheckAsync(names, resourceName, resourceKey, providerName, providerKey); + } + } + + public override Task SetAsync(string name, string resourceName, string resourceKey, string providerKey, bool isGranted) + { + using (CurrentTenant.Change(null)) + { + return base.SetAsync(name, resourceName, resourceKey, providerKey, isGranted); + } + } + + protected override async Task GrantAsync(string name, string resourceName, string resourceKey, string providerKey) + { + using (CurrentTenant.Change(null)) + { + await base.GrantAsync(name, resourceName, resourceKey, providerKey); + } + } + + protected override Task RevokeAsync(string name, string resourceName, string resourceKey, string providerKey) + { + using (CurrentTenant.Change(null)) + { + return base.RevokeAsync(name, resourceName, resourceKey, providerKey); + } + } +} diff --git a/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionProviderKeyLookupService.cs b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionProviderKeyLookupService.cs new file mode 100644 index 0000000000..1423ca9768 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionProviderKeyLookupService.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions.Resources; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Localization; +using Volo.Abp.OpenIddict.Applications; +using Volo.Abp.OpenIddict.Localization; + +namespace Volo.Abp.PermissionManagement.OpenIddict; + +public class ApplicationResourcePermissionProviderKeyLookupService : IResourcePermissionProviderKeyLookupService, ITransientDependency +{ + public string Name => ClientResourcePermissionValueProvider.ProviderName; + + public ILocalizableString DisplayName { get; } + + protected IApplicationFinder ApplicationFinder { get; } + + public ApplicationResourcePermissionProviderKeyLookupService(IApplicationFinder applicationFinder) + { + ApplicationFinder = applicationFinder; + DisplayName = LocalizableString.Create(nameof(ApplicationResourcePermissionProviderKeyLookupService)); + } + + public virtual async Task> SearchAsync(string filter = null, int page = 1, CancellationToken cancellationToken = default) + { + var applications = await ApplicationFinder.SearchAsync(filter, page); + return applications.Select(x => new ResourcePermissionProviderKeyInfo(x.ClientId, x.ClientId)).ToList(); + } + + public virtual Task> SearchAsync(string[] keys, CancellationToken cancellationToken = default) + { + // Keys are ClientIds + return Task.FromResult(keys.Select(x => new ResourcePermissionProviderKeyInfo(x, x)).ToList()); + } +} diff --git a/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/OpenIddictApplicationClientIdChangedHandler.cs b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/OpenIddictApplicationClientIdChangedHandler.cs new file mode 100644 index 0000000000..8a22d1b46d --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/OpenIddictApplicationClientIdChangedHandler.cs @@ -0,0 +1,45 @@ +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Authorization.Permissions.Resources; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.OpenIddict.Applications; + +namespace Volo.Abp.PermissionManagement.OpenIddict; + +public class OpenIddictApplicationClientIdChangedHandler : + IDistributedEventHandler, + ITransientDependency +{ + protected IPermissionManager PermissionManager { get; } + protected IPermissionGrantRepository PermissionGrantRepository { get; } + protected IResourcePermissionManager ResourcePermissionManager { get; } + protected IResourcePermissionGrantRepository ResourcePermissionGrantRepository { get; } + + public OpenIddictApplicationClientIdChangedHandler( + IPermissionManager permissionManager, + IPermissionGrantRepository permissionGrantRepository, + IResourcePermissionManager resourcePermissionManager, + IResourcePermissionGrantRepository resourcePermissionGrantRepository) + { + PermissionManager = permissionManager; + PermissionGrantRepository = permissionGrantRepository; + ResourcePermissionManager = resourcePermissionManager; + ResourcePermissionGrantRepository = resourcePermissionGrantRepository; + } + + public async Task HandleEventAsync(OpenIddictApplicationClientIdChangedEto eventData) + { + var permissionGrantsInRole = await PermissionGrantRepository.GetListAsync(ClientPermissionValueProvider.ProviderName, eventData.OldClientId); + foreach (var permissionGrant in permissionGrantsInRole) + { + await PermissionManager.UpdateProviderKeyAsync(permissionGrant, eventData.ClientId); + } + + var resourcePermissionGrantsInRole = await ResourcePermissionGrantRepository.GetListAsync(ClientResourcePermissionValueProvider.ProviderName, eventData.OldClientId); + foreach (var resourcePermissionGrant in resourcePermissionGrantsInRole) + { + await ResourcePermissionManager.UpdateProviderKeyAsync(resourcePermissionGrant, eventData.ClientId); + } + } +} diff --git a/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/OpenIddictApplicationDeletedEventHandler.cs b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/OpenIddictApplicationDeletedEventHandler.cs new file mode 100644 index 0000000000..ac02065e63 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/OpenIddictApplicationDeletedEventHandler.cs @@ -0,0 +1,31 @@ +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Authorization.Permissions.Resources; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.OpenIddict.Applications; +using Volo.Abp.Uow; + +namespace Volo.Abp.PermissionManagement.OpenIddict; + +public class OpenIddictApplicationDeletedEventHandler : + IDistributedEventHandler>, + ITransientDependency +{ + protected IPermissionManager PermissionManager { get; } + protected IResourcePermissionManager ResourcePermissionManager { get; } + + public OpenIddictApplicationDeletedEventHandler(IPermissionManager permissionManager, IResourcePermissionManager resourcePermissionManager) + { + PermissionManager = permissionManager; + ResourcePermissionManager = resourcePermissionManager; + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(EntityDeletedEto eventData) + { + await PermissionManager.DeleteAsync(ClientPermissionValueProvider.ProviderName, eventData.Entity.ClientId); + await ResourcePermissionManager.DeleteAsync(ClientResourcePermissionValueProvider.ProviderName, eventData.Entity.ClientId); + } +} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGrantInfoDto.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGrantInfoDto.cs index b608a69b54..79ddc93047 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGrantInfoDto.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGrantInfoDto.cs @@ -15,4 +15,6 @@ public class PermissionGrantInfoDto public List AllowedProviders { get; set; } public List GrantedProviders { get; set; } + + public bool IsEditable { get; set; } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs index e26e387fae..5baf233c8c 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs @@ -10,6 +10,8 @@ using Volo.Abp.Localization; using Volo.Abp.MultiTenancy; using Volo.Abp.SimpleStateChecking; using Volo.Abp.PermissionManagement.Localization; +using Volo.Abp.Roles; +using Volo.Abp.Users; namespace Volo.Abp.PermissionManagement; @@ -128,9 +130,47 @@ public class PermissionAppService : ApplicationService, IPermissionAppService } } + // Filter permissions for the current user: only show permissions they have or that are already granted + await FilterOutputPermissionsByCurrentUserAsync(result); + return result; } + protected virtual async Task FilterOutputPermissionsByCurrentUserAsync(GetPermissionListResultDto result) + { + if (await HasAdminRoleAsync()) + { + return; + } + + // Collect all permission names + var allPermissionNames = result.Groups + .SelectMany(g => g.Permissions) + .Select(p => p.Name) + .ToArray(); + + if (!allPermissionNames.Any()) + { + return; + } + + // Check which permissions current user has + var currentUserPermissions = await PermissionChecker.IsGrantedAsync(allPermissionNames); + var grantedPermissionNames = currentUserPermissions.Result + .Where(x => x.Value == PermissionGrantResult.Granted) + .Select(x => x.Key) + .ToHashSet(); + + // Mark editability: users can only edit permissions they currently have + foreach (var group in result.Groups) + { + foreach (var permission in group.Permissions) + { + permission.IsEditable = grantedPermissionNames.Contains(permission.Name); + } + } + } + protected virtual PermissionGrantInfoDto CreatePermissionGrantInfoDto(PermissionDefinition permission) { return new PermissionGrantInfoDto @@ -139,7 +179,8 @@ public class PermissionAppService : ApplicationService, IPermissionAppService DisplayName = permission.DisplayName?.Localize(StringLocalizerFactory), ParentName = permission.Parent?.Name, AllowedProviders = permission.Providers, - GrantedProviders = new List() + GrantedProviders = new List(), + IsEditable = true }; } @@ -162,6 +203,7 @@ public class PermissionAppService : ApplicationService, IPermissionAppService public virtual async Task UpdateAsync(string providerName, string providerKey, UpdatePermissionsDto input) { await CheckProviderPolicy(providerName); + await FilterInputPermissionsByCurrentUserAsync(input); foreach (var permissionDto in input.Permissions) { @@ -379,4 +421,32 @@ public class PermissionAppService : ApplicationService, IPermissionAppService await AuthorizationService.CheckAsync(policyName); } + + protected virtual async Task FilterInputPermissionsByCurrentUserAsync(UpdatePermissionsDto input) + { + if (await HasAdminRoleAsync()) + { + return; + } + + if (input.Permissions.IsNullOrEmpty()) + { + input.Permissions = Array.Empty(); + return; + } + + var currentUserPermissions = await PermissionChecker.IsGrantedAsync(input.Permissions.Select(p => p.Name).ToArray()); + var grantedPermissions = currentUserPermissions.Result + .Where(x => x.Value == PermissionGrantResult.Granted) + .Select(x => x.Key) + .ToHashSet(); + + // Filters the input DTO in-place to only include manageable permissions. + input.Permissions = input.Permissions.Where(x => grantedPermissions.Contains(x.Name)).ToArray(); + } + + protected virtual Task HasAdminRoleAsync() + { + return Task.FromResult(CurrentUser.IsInRole(AbpRoleConsts.AdminRoleName)); + } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs index b3c917177b..356e334f91 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs @@ -28,8 +28,6 @@ public partial class PermissionManagementModal protected List _allGroups; protected List _groups; - protected List _disabledPermissions = new List(); - protected string _selectedTabName; protected bool _selectAllDisabled; @@ -62,8 +60,8 @@ public partial class PermissionManagementModal NormalizePermissionGroup(); - GrantAll = _groups.SelectMany(x => x.Permissions).All(p => p.IsGranted); - GrantAny = !GrantAll && _groups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); + GrantAll = _allGroups.SelectMany(x => x.Permissions).All(p => p.IsGranted); + GrantAny = !GrantAll && _allGroups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); await InvokeAsync(_modal.Show); } @@ -102,19 +100,6 @@ public partial class PermissionManagementModal { _selectAllDisabled = _groups.All(IsPermissionGroupDisabled); - if (checkDisabledPermissions) - { - _disabledPermissions.Clear(); - } - - foreach (var permission in _groups.SelectMany(x => x.Permissions)) - { - if (checkDisabledPermissions && permission.IsGranted && permission.GrantedProviders.All(x => x.ProviderName != _providerName)) - { - _disabledPermissions.Add(permission); - } - } - foreach (var group in _groups) { SetPermissionDepths(group.Permissions, null, 0); @@ -203,8 +188,8 @@ public partial class PermissionManagementModal } } - GrantAll = _groups.SelectMany(x => x.Permissions).All(p => p.IsGranted); - GrantAny = !GrantAll && _groups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); + GrantAll = _allGroups.SelectMany(x => x.Permissions).All(p => p.IsGranted); + GrantAny = !GrantAll && _allGroups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); await InvokeAsync(StateHasChanged); } @@ -226,8 +211,8 @@ public partial class PermissionManagementModal } } - GrantAll = _groups.SelectMany(x => x.Permissions).All(p => p.IsGranted); - GrantAny = !GrantAll && _groups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); + GrantAll = _allGroups.SelectMany(x => x.Permissions).All(p => p.IsGranted); + GrantAny = !GrantAll && _allGroups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); await InvokeAsync(StateHasChanged); } @@ -285,12 +270,28 @@ public partial class PermissionManagementModal protected virtual bool IsDisabledPermission(PermissionGrantInfoDto permissionGrantInfo) { - return _disabledPermissions.Any(x => x == permissionGrantInfo); + if (!permissionGrantInfo.IsEditable) + { + return true; + } + + return permissionGrantInfo.IsGranted && + permissionGrantInfo.GrantedProviders.All(p => p.ProviderName != _providerName); } protected virtual string GetShownName(PermissionGrantInfoDto permissionGrantInfo) { - if (!IsDisabledPermission(permissionGrantInfo)) + if (permissionGrantInfo.GrantedProviders.All(p => p.ProviderName == _providerName)) + { + return permissionGrantInfo.DisplayName; + } + + var grantedByOtherProviders = permissionGrantInfo.GrantedProviders + .Where(p => p.ProviderName != _providerName) + .Select(p => p.ProviderName) + .ToList(); + + if (!grantedByOtherProviders.Any()) { return permissionGrantInfo.DisplayName; } @@ -298,10 +299,7 @@ public partial class PermissionManagementModal return string.Format( "{0} ({1})", permissionGrantInfo.DisplayName, - permissionGrantInfo.GrantedProviders - .Where(p => p.ProviderName != _providerName) - .Select(p => p.ProviderName) - .JoinAsString(", ") + grantedByOtherProviders.JoinAsString(", ") ); } @@ -313,10 +311,7 @@ public partial class PermissionManagementModal protected virtual bool IsPermissionGroupDisabled(PermissionGroupDto group) { - var permissions = group.Permissions; - var grantedProviders = permissions.SelectMany(x => x.GrantedProviders); - - return permissions.All(x => x.IsGranted) && grantedProviders.Any(p => p.ProviderName != _providerName); + return group.Permissions.All(IsDisabledPermission); } protected virtual async Task ResetSearchTextAsync() @@ -339,8 +334,8 @@ public partial class PermissionManagementModal _permissionGroupSearchText = value; _groups = _permissionGroupSearchText.IsNullOrWhiteSpace() ? _allGroups.ToList() : _allGroups.Where(x => x.DisplayName.Contains(_permissionGroupSearchText, StringComparison.OrdinalIgnoreCase) || x.Permissions.Any(permission => permission.DisplayName.Contains(_permissionGroupSearchText, StringComparison.OrdinalIgnoreCase))).ToList(); - GrantAll = _groups.SelectMany(x => x.Permissions).All(p => p.IsGranted); - GrantAny = !GrantAll && _groups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); + GrantAll = _allGroups.SelectMany(x => x.Permissions).All(p => p.IsGranted); + GrantAny = !GrantAll && _allGroups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); NormalizePermissionGroup(false); 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 3029625ffb..aa77063dd7 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 @@ -31,8 +31,6 @@ public class AbpPermissionManagementDomainModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Replace(ServiceDescriptor.Singleton()); - if (context.Services.IsDataMigrationEnvironment()) { Configure(options => diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs index 71570aafce..89390d1515 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs @@ -4,6 +4,7 @@ using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.MultiTenancy; +using Volo.Abp.Roles; namespace Volo.Abp.PermissionManagement; @@ -34,7 +35,7 @@ public class PermissionDataSeedContributor : IDataSeedContributor, ITransientDep await PermissionDataSeeder.SeedAsync( RolePermissionValueProvider.ProviderName, - "admin", + AbpRoleConsts.AdminRoleName, permissionNames, context?.TenantId ); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/ResourcePermissionManagementProvider.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/ResourcePermissionManagementProvider.cs index 90d4e176d3..9682965c67 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/ResourcePermissionManagementProvider.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/ResourcePermissionManagementProvider.cs @@ -26,7 +26,7 @@ public abstract class ResourcePermissionManagementProvider : IResourcePermission CurrentTenant = currentTenant; } - public virtual async Task CheckAsync(string name, string resourceName,string resourceKey, string providerName, string providerKey) + public virtual async Task CheckAsync(string name, string resourceName, string resourceKey, string providerName, string providerKey) { var multiplePermissionValueProviderGrantInfo = await CheckAsync(new[] { name }, resourceName, resourceKey, providerName, providerKey); @@ -55,7 +55,7 @@ public abstract class ResourcePermissionManagementProvider : IResourcePermission } } - public virtual Task SetAsync(string name, string resourceName,string resourceKey, string providerKey, bool isGranted) + public virtual Task SetAsync(string name, string resourceName, string resourceKey, string providerKey, bool isGranted) { return isGranted ? GrantAsync(name, resourceName, resourceKey, providerKey) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs index 6f6d6113e9..8b62db692d 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs @@ -135,9 +135,7 @@ public class PermissionManagementModal : AbpPageModel public bool IsDisabled(string currentProviderName) { - var grantedProviders = Permissions.SelectMany(x => x.GrantedProviders); - - return Permissions.All(x => x.IsGranted) && grantedProviders.All(p => p.ProviderName != currentProviderName); + return Permissions.All(p => p.IsDisabled(currentProviderName)); } } @@ -159,9 +157,11 @@ public class PermissionManagementModal : AbpPageModel public List GrantedProviders { get; set; } + public bool IsEditable { get; set; } + public bool IsDisabled(string currentProviderName) { - return IsGranted && GrantedProviders.All(p => p.ProviderName != currentProviderName); + return !IsEditable || (IsGranted && GrantedProviders.All(p => p.ProviderName != currentProviderName)); } public string GetShownName(string currentProviderName) @@ -171,13 +171,20 @@ public class PermissionManagementModal : AbpPageModel return DisplayName; } + var grantedByOtherProviders = GrantedProviders + .Where(p => p.ProviderName != currentProviderName) + .Select(p => p.ProviderName) + .ToList(); + + if (!grantedByOtherProviders.Any()) + { + return DisplayName; + } + return string.Format( "{0} ({1})", DisplayName, - GrantedProviders - .Where(p => p.ProviderName != currentProviderName) - .Select(p => p.ProviderName) - .JoinAsString(", ") + grantedByOtherProviders.JoinAsString(", ") ); } } diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestBase.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestBase.cs index 36697e9c6c..6756b96da8 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestBase.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestBase.cs @@ -1,9 +1,7 @@ using System; -using System.Collections.Generic; -using System.Text; using Microsoft.Extensions.DependencyInjection; -using NSubstitute; -using Volo.Abp.Users; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Volo.Abp.Authorization.Permissions; namespace Volo.Abp.PermissionManagement; @@ -17,10 +15,8 @@ public class AbpPermissionManagementApplicationTestBase : PermissionManagementTe } protected override void AfterAddApplication(IServiceCollection services) { - var currentUser = Substitute.For(); - currentUser.Roles.Returns(new[] { "admin" }); - currentUser.IsAuthenticated.Returns(true); - - services.AddSingleton(currentUser); + var fakePermissionChecker = new FakePermissionChecker(); + services.AddSingleton(fakePermissionChecker); + services.Replace(ServiceDescriptor.Singleton(fakePermissionChecker)); } } diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/FakePermissionChecker.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/FakePermissionChecker.cs new file mode 100644 index 0000000000..19bba864c4 --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/FakePermissionChecker.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using System.Security.Claims; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; + +namespace Volo.Abp.PermissionManagement; + +public class FakePermissionChecker : IPermissionChecker +{ + private HashSet? _grantedPermissions; + + public void GrantAllPermissions() + { + _grantedPermissions = null; + } + + public void SetGrantedPermissions(params string[] permissions) + { + _grantedPermissions = new HashSet(permissions); + } + + private bool IsGranted(string name) + { + return _grantedPermissions == null || _grantedPermissions.Contains(name); + } + + public Task IsGrantedAsync(string name) + { + return Task.FromResult(IsGranted(name)); + } + + public Task IsGrantedAsync(ClaimsPrincipal? claimsPrincipal, string name) + { + return Task.FromResult(IsGranted(name)); + } + + public Task IsGrantedAsync(string[] names) + { + return IsGrantedAsync(null, names); + } + + public Task IsGrantedAsync(ClaimsPrincipal? claimsPrincipal, string[] names) + { + var result = new MultiplePermissionGrantResult(); + foreach (var name in names) + { + result.Result[name] = IsGranted(name) + ? PermissionGrantResult.Granted + : PermissionGrantResult.Undefined; + } + return Task.FromResult(result); + } +} diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs index 61f984a27b..1fddf07181 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs @@ -16,12 +16,14 @@ public class PermissionAppService_Tests : AbpPermissionManagementApplicationTest private readonly IPermissionAppService _permissionAppService; private readonly IPermissionGrantRepository _permissionGrantRepository; private readonly ICurrentPrincipalAccessor _currentPrincipalAccessor; + private readonly FakePermissionChecker _fakePermissionChecker; public PermissionAppService_Tests() { _permissionAppService = GetRequiredService(); _permissionGrantRepository = GetRequiredService(); _currentPrincipalAccessor = GetRequiredService(); + _fakePermissionChecker = GetRequiredService(); } [Fact] @@ -135,4 +137,122 @@ public class PermissionAppService_Tests : AbpPermissionManagementApplicationTest (await _permissionGrantRepository.FindAsync("MyPermission1", "Test", "Test")).ShouldBeNull(); } + + [Fact] + public async Task Get_Should_Mark_Permissions_As_Non_Editable_When_Current_User_Does_Not_Have_Them() + { + // Current user only has MyPermission1 and MyPermission2 + _fakePermissionChecker.SetGrantedPermissions("MyPermission1", "MyPermission2"); + + var result = await _permissionAppService.GetAsync( + UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString()); + + var testGroup = result.Groups.FirstOrDefault(g => g.Name == "TestGroup"); + testGroup.ShouldNotBeNull(); + + // Permissions the current user has -> IsEditable = true + testGroup.Permissions.First(p => p.Name == "MyPermission1").IsEditable.ShouldBeTrue(); + testGroup.Permissions.First(p => p.Name == "MyPermission2").IsEditable.ShouldBeTrue(); + + // Permissions the current user does NOT have -> IsEditable = false + testGroup.Permissions.First(p => p.Name == "MyPermission2.ChildPermission1").IsEditable.ShouldBeFalse(); + testGroup.Permissions.First(p => p.Name == "MyPermission3").IsEditable.ShouldBeFalse(); + testGroup.Permissions.First(p => p.Name == "MyPermission4").IsEditable.ShouldBeFalse(); + testGroup.Permissions.First(p => p.Name == "MyPermission6").IsEditable.ShouldBeFalse(); + testGroup.Permissions.First(p => p.Name == "MyPermission6.ChildPermission2").IsEditable.ShouldBeFalse(); + } + + [Fact] + public async Task Get_Should_Allow_Admin_To_Edit_All_Permissions() + { + // Current user does NOT have these permissions, but has admin role + _fakePermissionChecker.SetGrantedPermissions("MyPermission1"); + + using (_currentPrincipalAccessor.Change(new Claim(AbpClaimTypes.Role, "admin"))) + { + var result = await _permissionAppService.GetAsync( + UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString()); + + var testGroup = result.Groups.FirstOrDefault(g => g.Name == "TestGroup"); + testGroup.ShouldNotBeNull(); + + testGroup.Permissions.First(p => p.Name == "MyPermission3").IsEditable.ShouldBeTrue(); + testGroup.Permissions.First(p => p.Name == "MyPermission6").IsEditable.ShouldBeTrue(); + } + } + + [Fact] + public async Task Update_Should_Not_Grant_Permission_That_Current_User_Does_Not_Have() + { + // Current user only has MyPermission1, NOT MyPermission2 + _fakePermissionChecker.SetGrantedPermissions("MyPermission1"); + + // Try to grant both MyPermission1 and MyPermission2 + await _permissionAppService.UpdateAsync("Test", "Test", new UpdatePermissionsDto() + { + Permissions = new UpdatePermissionDto[] + { + new UpdatePermissionDto() { IsGranted = true, Name = "MyPermission1" }, + new UpdatePermissionDto() { IsGranted = true, Name = "MyPermission2" } + } + }); + + // MyPermission1 should be granted (current user has it) + (await _permissionGrantRepository.FindAsync("MyPermission1", "Test", "Test")).ShouldNotBeNull(); + + // MyPermission2 should NOT be granted (current user doesn't have it, filtered out) + (await _permissionGrantRepository.FindAsync("MyPermission2", "Test", "Test")).ShouldBeNull(); + } + + [Fact] + public async Task Update_Should_Not_Revoke_Permission_That_Current_User_Does_Not_Have() + { + // First, grant both permissions + await _permissionGrantRepository.InsertAsync( + new PermissionGrant(Guid.NewGuid(), "MyPermission1", "Test", "Test")); + await _permissionGrantRepository.InsertAsync( + new PermissionGrant(Guid.NewGuid(), "MyPermission2", "Test", "Test")); + + // Current user only has MyPermission1, NOT MyPermission2 + _fakePermissionChecker.SetGrantedPermissions("MyPermission1"); + + // Try to revoke both + await _permissionAppService.UpdateAsync("Test", "Test", new UpdatePermissionsDto() + { + Permissions = new UpdatePermissionDto[] + { + new UpdatePermissionDto() { IsGranted = false, Name = "MyPermission1" }, + new UpdatePermissionDto() { IsGranted = false, Name = "MyPermission2" } + } + }); + + // MyPermission1 should be revoked (current user has it) + (await _permissionGrantRepository.FindAsync("MyPermission1", "Test", "Test")).ShouldBeNull(); + + // MyPermission2 should still be granted (current user doesn't have it, revoke filtered out) + (await _permissionGrantRepository.FindAsync("MyPermission2", "Test", "Test")).ShouldNotBeNull(); + } + + [Fact] + public async Task Update_Should_Allow_Admin_To_Grant_Permissions_Without_Having_Them() + { + (await _permissionGrantRepository.FindAsync("MyPermission2", "Test", "Test")).ShouldBeNull(); + + _fakePermissionChecker.SetGrantedPermissions(); + + using (_currentPrincipalAccessor.Change(new Claim(AbpClaimTypes.Role, "admin"))) + { + await _permissionAppService.UpdateAsync("Test", "Test", new UpdatePermissionsDto() + { + Permissions = new UpdatePermissionDto[] + { + new UpdatePermissionDto() { IsGranted = true, Name = "MyPermission2" } + } + }); + } + + (await _permissionGrantRepository.FindAsync("MyPermission2", "Test", "Test")).ShouldNotBeNull(); + } } diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs index 88c6ea1d69..bf6eca7bc2 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs @@ -1,6 +1,8 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Autofac; +using Volo.Abp.DistributedLocking; using Volo.Abp.Modularity; using Volo.Abp.Threading; @@ -15,6 +17,8 @@ public class AbpPermissionManagementTestBaseModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { + context.Services.Replace(ServiceDescriptor.Singleton()); + context.Services.Configure(options => { options.ManagementProviders.Add(); diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json index 3a8321fed9..fa6daf88f1 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json @@ -3,6 +3,6 @@ "name": "demo-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0" } } diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock index a2b6e13b29..1910c85cf1 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock @@ -2,185 +2,185 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0-rc.2.tgz#599f5c47a417d1230fc17c0446a0229f920f7246" - integrity sha512-8F4nEK+VtgRRf8n+66HMbtCEaOMCW/OdbSEWRl9ahMNoj860oPIJ8P8Qn/2+LjtkPMdDAfCdEzyDzCd3igaFaA== +"@abp/aspnetcore.mvc.ui.theme.basic@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.1.0.tgz#94f68982ce8b67b6ac827f824aed3faad50e56e9" + integrity sha512-wqbEANW8CRZ+/7qGNprC828yNN17TsYtFxywL0B+EA2UfUtcTpzR/3ompZd/XcDm3N2NmS1n5Ao3WEn2NJlHgA== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0" -"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0-rc.2.tgz#e5056e4e159f5815e3cffecab5c46f3d7d4f79d7" - integrity sha512-bo56XzQZPYL/3ckWTTTSSUsSFSFJobvfE29cz13NIrZ/tBtWyQCAJn92wYHuY+6IezYUWb4ga3PkFeHRzR142A== +"@abp/aspnetcore.mvc.ui.theme.shared@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.1.0.tgz#b89c5d38fdeceda9e421f9357842838be36dce49" + integrity sha512-9QyZ7lYr17thTKxq9WN/KVCxNyYurY5Ph9y3vFBkA3u+uOZcaxdw0T417vy0hJvAB7RGlkpLRTmZL7q5P9FzJA== dependencies: - "@abp/aspnetcore.mvc.ui" "~10.1.0-rc.2" - "@abp/bootstrap" "~10.1.0-rc.2" - "@abp/bootstrap-datepicker" "~10.1.0-rc.2" - "@abp/bootstrap-daterangepicker" "~10.1.0-rc.2" - "@abp/datatables.net-bs5" "~10.1.0-rc.2" - "@abp/font-awesome" "~10.1.0-rc.2" - "@abp/jquery-form" "~10.1.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~10.1.0-rc.2" - "@abp/lodash" "~10.1.0-rc.2" - "@abp/luxon" "~10.1.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~10.1.0-rc.2" - "@abp/moment" "~10.1.0-rc.2" - "@abp/select2" "~10.1.0-rc.2" - "@abp/sweetalert2" "~10.1.0-rc.2" - "@abp/timeago" "~10.1.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0-rc.2.tgz#e25d3575d40bfcb3f809bd2d355671181ee5ff40" - integrity sha512-MOF86bVbi7N/nIla+361nsBrN4tiSka8xzpWcgqlLcCAl9ILG4rugbtafBAjN81taPma2peZM7egaOR4SDkTMw== + "@abp/aspnetcore.mvc.ui" "~10.1.0" + "@abp/bootstrap" "~10.1.0" + "@abp/bootstrap-datepicker" "~10.1.0" + "@abp/bootstrap-daterangepicker" "~10.1.0" + "@abp/datatables.net-bs5" "~10.1.0" + "@abp/font-awesome" "~10.1.0" + "@abp/jquery-form" "~10.1.0" + "@abp/jquery-validation-unobtrusive" "~10.1.0" + "@abp/lodash" "~10.1.0" + "@abp/luxon" "~10.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.1.0" + "@abp/moment" "~10.1.0" + "@abp/select2" "~10.1.0" + "@abp/sweetalert2" "~10.1.0" + "@abp/timeago" "~10.1.0" + +"@abp/aspnetcore.mvc.ui@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.1.0.tgz#79d76232aacb9c8e1762d903f75007d0418bf5a8" + integrity sha512-brVfaSUicZuSuwtizrEcMvtRjFsoAHr9i56HjJZb7bmElr+q5STiul3stRumly4IfoLkYqdy85hMk+B3G0bJDg== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0-rc.2.tgz#be80c6104ba53e18935fbf62ca2c1890f4b2fde4" - integrity sha512-BNcDYUSbZaLah4SfXm0efoqFTsOViVm6370k9L7vix/OGpIWwklJsr8y78lvdM5ANgNCfl0LPSq+seLJFc/OLA== +"@abp/bootstrap-datepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.1.0.tgz#68270ed8cf8e0c23a77331ef2ba6ef2d1da3cefc" + integrity sha512-ahKKHlluo4U1Z238mBNzpL0YaErTPENLQDVLNZB1BnZcUTqz1j7WJHGZoy4j3CXZKt7mnFCRe1+vJMCcwP+DYA== dependencies: bootstrap-datepicker "^1.10.1" -"@abp/bootstrap-daterangepicker@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0-rc.2.tgz#f189f7d070ebd97d9cfdcb99571cab2d6a198ab5" - integrity sha512-bV8J0MuiAFVLkr48JsB6aZU6aPoqw+Gyhq1szQ74bEwNQlRBPuF92WVA5FACaUBj8dMUzR9HDDAYQuxUzpKYKA== +"@abp/bootstrap-daterangepicker@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.1.0.tgz#69f7775eafe7c038c2684d3e990384c8f2966cff" + integrity sha512-mFMaH7GqPn7W5zzIMOOTl4f0at9Vx8da4ewvPU/IvngrTeezMRPC1tofHmiWDhHfZpzF5J9DDMCGul9Q4nOl5A== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0-rc.2.tgz#2300800a29ea09b91f5ed2e6177e5921fe7d2a0f" - integrity sha512-K+tDI9vz/Y9B/yu0i3AVpm4v3Odi44Q/yH5hAprL7f4pGxEOiqAFB/qzHAxG+7Oa7wjv5tPLv+Cz4DavBQjd8Q== +"@abp/bootstrap@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.1.0.tgz#816436ab547fc46d4c00b1facbdd80e3f4f78af1" + integrity sha512-ioqQDOvjXIUWncmLJuTcLPTnlJ3xGxyKXC9veSTJWFd+5pZswK7/QIlAuTvIIujs/7Z13GLunUIMMjny7WFBMw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" bootstrap "^5.3.8" -"@abp/core@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0-rc.2.tgz#403687aff5a30788f7b7ca660abdfd85d89438aa" - integrity sha512-euuG2Hna/DT6/R1dGOjgp3vcehYtF+CcOkRj31oquYKaM5YWk4OaZ314DSpnjgs/xo8DuVc4eKFQwIxD9RK41w== +"@abp/core@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.1.0.tgz#7cb21012deee5510a0774d982f85627d47b368f4" + integrity sha512-/N0K2NVdk5/OM+Q5JDnpC+0CD0mS4wpDhLO1SIQbMXSTFbplhfPw2SFm7+MvPA9pVx2L8TYAzXmS7CtAJxKvCg== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.1.0" -"@abp/datatables.net-bs5@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0-rc.2.tgz#a60650d1802b40751d30f8f6c56beb23fd66481b" - integrity sha512-IWwexNqbMpET54Fvm9LoPTJYf+4CoBbjFOvz3sL6CgO2feV5R5fKigjVU8zXKNh2W+RG8L6zEarfVxrr114TsA== +"@abp/datatables.net-bs5@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.1.0.tgz#ea2a60c22bdcc80882662b9f55f198793f6ea556" + integrity sha512-dPe3bVW3Hfnm/X9Bw5k7TuEIsYYwFk1faC8kIxf2Spk+4Z9TdYFS2zGaHBYStE9iRtKmneNYMykG2O88mX3quA== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.1.0" datatables.net-bs5 "^2.3.4" -"@abp/datatables.net@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0-rc.2.tgz#9147f68bc6dbc4eb40a9ddf65c7859e788cdcac2" - integrity sha512-a9DJpwg14S4nVOiC4ipw0CQwEYWB602e2gCJiH7W1mxopbQb135RxwhtdTnW//eIONcxC9IrEuvcBEAUVt2B7Q== +"@abp/datatables.net@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.1.0.tgz#7fe641883e6d1417c86a030481777a75c9a5a555" + integrity sha512-p9S/ZaJ4OXpihTOWIxsSQ0s3G4S+ScQLD+Q+w0NrWbUa7HTKg9tdqSh6VDhyW9KZ/iiLUO5jNzsAFXyUjjDQuw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" datatables.net "^2.3.4" -"@abp/font-awesome@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0-rc.2.tgz#364466cfe67e41e0c4d16b57d3923d10f66369f1" - integrity sha512-F1Jy8xoFV2aA+VN+NH1gtrG96/j9w7Picc+KLoCoIyNnJr/xJur11XkJyu5ln8KF4V7p/DY7QaQodWV/btOs8g== +"@abp/font-awesome@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.1.0.tgz#79c5b7eb9a85467b0078b9f9bf201493fc3de358" + integrity sha512-dm4VRtZnvm5p8mYQys9KWLkQ+JdwPahQSan2DV1s5Rq4P96hk8p8VshZu7pI3iE0MS+rSZnXYvetZrqCdt1mOQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" "@fortawesome/fontawesome-free" "^7.0.1" -"@abp/jquery-form@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0-rc.2.tgz#3857717d07569c22d4bbbe459238abeb816d606a" - integrity sha512-2D5WHVnfK9bhRces1tgPwOEoc7KCYKYiKHBOcqct+LTA7zoRjJv/PM8/JhFVl+grVIw1aSwO4tU3YfZ22Vxipg== +"@abp/jquery-form@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-10.1.0.tgz#7c19605eb103519fea332d0f153cac185b7f2ebb" + integrity sha512-ddlapZqFVwpXU3uDi/RnQ6uSpseMxPAKE+/LgLF+SVyPzazNFognxPT3ztzqTk84P/gFleNgNjAfUlKrfyIfGw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0-rc.2.tgz#efd7b69a078a20c0bf405408dbdf52a7bf770b3b" - integrity sha512-tZ0MWgzBqp+SNfMxM0z2cGB21NiTHuVJyyQaXKE/ptuD5pc0uRkcqw/J2kWfiqsoVgChz27IB6h8/jqDafS4qg== +"@abp/jquery-validation-unobtrusive@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.1.0.tgz#13aa462c4347d3459541a9a9ea19a60458805328" + integrity sha512-94smwn/W3d+gkX2UKH+/OiB7poKDP1ZK0DqWiiH4BGGmpRk9j3B+eJxPbL86dwNG4XT8upuX3ZOrUb6Fy2SA3A== dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0-rc.2.tgz#d39537a7356c51f9db2e66f6740cf6df86bd0442" - integrity sha512-LOkS0NKk4pLtLjPU0CCbwROyUg6EtJN8Z/it7QuKK1CIRfYYcAStgNnNm5geZP7CqECIkoiFfgWjI+L5Z9/Tfg== +"@abp/jquery-validation@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.1.0.tgz#5389785f5ff359ecd6291889420d6c2f84e633aa" + integrity sha512-/X5smp0xpNqCM+BuLI9eEyMPQ0uF42hmEfBvCIfWWBhfp7uFfq7sS706QcGfXYqFdpprRYoUJGKDfSaHxPaJUA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0-rc.2.tgz#101a55f70d510978c8c05f5857d0e9d4965263f7" - integrity sha512-bQV1uFWGtwRYjNOsqJ8FM2004idX2Jj7YVL19YF1/PjyPUSMX+s8/IvJizBjyY5hPAiWBBhmV9g+IFWzxlDQoQ== +"@abp/jquery@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.1.0.tgz#d8812a7d410ad959a1ed27696beb9b7885142684" + integrity sha512-cVF2hOP6GGp0N3VMBOFjEHuHFgXbDH8x0d7Agw4DN2ydFU8wYuj3m9u0HCc0aoBG6Zls90tMpTfM0RqDNFgCKA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" jquery "~3.7.1" -"@abp/lodash@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0-rc.2.tgz#d08c03f8d3d0fbaa3e71e603cbe5fb7f176933ef" - integrity sha512-KCnD1p2y52ZI+2ifpiFIUAiDPsKehnOD8HV5qKeObO6UCP97okif8IP+sQDmNQb8O33y/NKTyx/HcpwBbe/NYQ== +"@abp/lodash@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.1.0.tgz#fdebe764d1142abfd3ecdeef56aa33746e31815b" + integrity sha512-r4WwpqLFFQi721edd8XF5wueAdqEvx75dmRlEuhZoIBA6RQ0yYjTRMNWjTOlIEzFDGj7XrisV5CSUQ9BhhuS+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" lodash "^4.17.21" -"@abp/luxon@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0-rc.2.tgz#ef8d2b323bac054fc9610e241e1b1763d229e065" - integrity sha512-qYFl6XO3g9mZiu0dtIczI7LRuYWwc+RkpbDzSmruXcRks3KA+ZZco2vhHNnlwtXcINl/TXtbW7Wc0MX+8IB1Kw== +"@abp/luxon@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.1.0.tgz#c80cdb1a85e9cc824946dc0009df0daba384a4ca" + integrity sha512-slwiGSrevvWZrBhuy9sw7UP6akk2Ln9eAY3nxxo8xzE7C7uezcNk12dbKN4psdSAVpbDwuqC3GGrkmcFL+6sBQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" luxon "^3.7.2" -"@abp/malihu-custom-scrollbar-plugin@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0-rc.2.tgz#dfaf666442c7c122f7da72c83b9adf194d5b6ec8" - integrity sha512-PudMHmNQgZ6JZeaVt1ZoXLqO0UZXJzUYiBah2LDkC4EMLjnMJFINHBoEVVa4ooXH0yjFv+zsbN0vWZYJ8TBJIA== +"@abp/malihu-custom-scrollbar-plugin@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.1.0.tgz#d257e83b7cc1af89a708e365eef7af0136ccebcf" + integrity sha512-+h8hoYUkjcYBdm/M3b8c3CeE5WNU8K6kQ5MwQXNaaGLCvwEmZHy0A6+U8yxtKv2eRRhAkAqOkQyWYRWA5w1XzQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0-rc.2.tgz#610a1592d13984aea51abbd13df8c5995a089149" - integrity sha512-ep8PnAXARw0t/wtGOVp/oiNhF3B0Bh6y2vRzKrcSoyXAQREGGm4fJdZVYZLGTfI4lFLTjebEgf4O7T9feUwJAw== +"@abp/moment@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.1.0.tgz#5755e4e10a7302e2832b1a1ce571f20b27600303" + integrity sha512-faHV7vmPEjFUJTRNTTlmnpx0VZuyvQt4O98WBLAjPdcqpLfWazdS9Ro405St5liIkgvmAXWsrwVmZb0VKTLcNA== dependencies: moment "^2.30.1" -"@abp/select2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0-rc.2.tgz#40c5418d007fc36817eecbe6388d767e4e7ca887" - integrity sha512-Pq0wlpL01sWRLUg5um3JtBXIqi3mmbwPwvgxP8hFbQngAt9JXAK8geNRiTMrIZgtW/ycXtM1v6I4zuWOLOeAGg== +"@abp/select2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.1.0.tgz#8b15954e462e65329b8eb481226170df6d55d36a" + integrity sha512-7+1GirZe4i/2/LR4jZgWhiN6lFHhClLtUmrdCjh7FeeuBvy5GGA417DybDihna/GzlcOVI4GHnn2fjEwcFqJiw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0-rc.2.tgz#d35858c69e10c6726b02cdfcea88dfc32385963f" - integrity sha512-s9VPRToohN45uzHcKCF5Mcj8FVjsXcXUb0U3tuaT/Y+u4adHB3fBxYiXJFM0sVsCJ81dFktxwka40Wm8Taz/zA== +"@abp/sweetalert2@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.1.0.tgz#6997cb7909671f9deddaea53f17ed054aab27cd3" + integrity sha512-vlkH+DkuQBvOqnDPqTtyZ5mHb+GfIR/QJBXI7yrS62ML+ZNqkg0vXftCrm4aAR2kPmvgYsbUOJcKJAmgydcOEQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.1.0" sweetalert2 "^11.23.0" -"@abp/timeago@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0-rc.2.tgz#98d630cc3843eee64dbcc34fb8ca5afbab034718" - integrity sha512-vJmk+otyXXJE2s2J8iYpLVaFuNAYnIUSOitmi7umYnL+k/UE2KQhBXU7FR0/OBY9mAZYd+shaiGIU1LMSaJ+Xg== +"@abp/timeago@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.1.0.tgz#45c1e8b1451e31910e330053981a871787fe02f1" + integrity sha512-3RVMlBbOepa4WBTLthRmf2VddkNwsjE+FNnaSUaMQ2ZQaXnghnZc4xZ3f3oKraGcWMgqpz1IfrWWV1POKRsEXw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.1.0" timeago "^1.6.7" -"@abp/utils@~10.1.0-rc.2": - version "10.1.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0-rc.2.tgz#86a980c6536b3b5ce185d406723b28be421864ac" - integrity sha512-Oz863VNA8fraQ81vTvqM0IqwiaseLwfFU5QNn6iOGOfn5wQrEkPwtZ0jMI+DGNtJgPzoKiq+iKc3K+SiuVgldg== +"@abp/utils@~10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.1.0.tgz#ef7f6bf16abb34b77fa57c156b264154827bc0af" + integrity sha512-UDgbvDMbcQklNu+SlQPhkIcIfZoWsQjCCzihanLBiHc474BCOlcTsO6K/EatV9LwqG3zY0mYd0ExAWjH44G0rQ== dependencies: just-compare "^2.3.0" diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor index 66b0f96604..ad3e6cf559 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor @@ -107,7 +107,7 @@ { -
+ @L["SendTestEmail"] @@ -158,7 +158,7 @@ - + @L["Send"]
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json index 44077ac44f..38464ed8c0 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "إدارة الإعداد", "Feature:SettingManagementEnable": "تمكين إدارة الإعداد", "Feature:SettingManagementEnableDescription": "تفعيل إعداد نظام الإدارة في التطبيق.", - "Feature:AllowChangingEmailSettings": "السماح لتغيير إعدادات البريد الإلكتروني.", + "Feature:AllowChangingEmailSettings": "السماح لتغيير إعدادات البريد الإلكتروني", "Feature:AllowChangingEmailSettingsDescription": "السماح لتغيير إعدادات البريد الإلكتروني.", "SmtpPasswordPlaceholder": "أدخل قيمة لتحديث كلمة المرور" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json index 94a6e1f6ea..34a9f6dd2c 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Správa nastavení", "Feature:SettingManagementEnable": "Povolit správu nastavení", "Feature:SettingManagementEnableDescription": "Povolit systém správy nastavení v aplikaci.", - "Feature:AllowChangingEmailSettings": "Povolit změnu nastavení e-mailu.", + "Feature:AllowChangingEmailSettings": "Povolit změnu nastavení e-mailu", "Feature:AllowChangingEmailSettingsDescription": "Povolit změnu nastavení e-mailu.", "SmtpPasswordPlaceholder": "Zadejte hodnotu pro aktualizaci hesla" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json index a63b7201f2..a2b2c9ab95 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Einstellungsverwaltung", "Feature:SettingManagementEnable": "Einstellungsverwaltung aktivieren", "Feature:SettingManagementEnableDescription": "Aktivieren Sie das Einstellungsverwaltungssystem in der Anwendung.", - "Feature:AllowChangingEmailSettings": "Änderung der E-Mail-Einstellungen zulassen.", + "Feature:AllowChangingEmailSettings": "Änderung der E-Mail-Einstellungen zulassen", "Feature:AllowChangingEmailSettingsDescription": "Änderung der E-Mail-Einstellungen zulassen.", "SmtpPasswordPlaceholder": "Geben Sie einen Wert ein, um das Passwort zu aktualisieren" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json index e78aa19fca..fabd73852f 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json @@ -36,7 +36,7 @@ "Feature:SettingManagementGroup": "Einstellungsmanagement", "Feature:SettingManagementEnable": "Aktivieren Sie die Einstellungsverwaltung", "Feature:SettingManagementEnableDescription": "Aktivieren Sie das Einstellungsverwaltungssystem in der Anwendung.", - "Feature:AllowChangingEmailSettings": "Erlauben Sie das Ändern der E-Mail-Einstellungen.", + "Feature:AllowChangingEmailSettings": "Erlauben Sie das Ändern der E-Mail-Einstellungen", "Feature:AllowChangingEmailSettingsDescription": "Erlauben Sie das Ändern der E-Mail-Einstellungen.", "SmtpPasswordPlaceholder": "Geben Sie einen Wert ein, um das Passwort zu aktualisieren" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json index 424e38e8de..118b1664fe 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json @@ -31,7 +31,7 @@ "Feature:SettingManagementGroup": "Διαχείριση ρυθμίσεων", "Feature:SettingManagementEnable": "Ενεργοποίηση διαχείρισης ρυθμίσεων", "Feature:SettingManagementEnableDescription": "Ενεργοποίηση συστήματος διαχείρισης ρυθμίσεων στην εφαρμογή.", - "Feature:AllowChangingEmailSettings": "Επιτρέψτε την αλλαγή των ρυθμίσεων email.", + "Feature:AllowChangingEmailSettings": "Επιτρέψτε την αλλαγή των ρυθμίσεων email", "Feature:AllowChangingEmailSettingsDescription": "Επιτρέψτε την αλλαγή των ρυθμίσεων email.", "SmtpPasswordPlaceholder": "Εισαγάγετε μια τιμή για ενημέρωση κωδικού πρόσβασης" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json index 832163574b..cffd6f27cd 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Setting management", "Feature:SettingManagementEnable": "Enable setting management", "Feature:SettingManagementEnableDescription": "Enable setting management system in the application.", - "Feature:AllowChangingEmailSettings": "Allow changing email settings.", + "Feature:AllowChangingEmailSettings": "Allow changing email settings", "Feature:AllowChangingEmailSettingsDescription": "Allow changing email settings.", "SmtpPasswordPlaceholder": "Enter a value to update password" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json index 91cc71d532..f158ec3b0d 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Gestión de la configuración", "Feature:SettingManagementEnable": "Habilitar la gestión de la configuración", "Feature:SettingManagementEnableDescription": "Habilite el sistema de gestión de la configuración en la aplicación.", - "Feature:AllowChangingEmailSettings": "Permitir cambiar la configuración de correo electrónico.", + "Feature:AllowChangingEmailSettings": "Permitir cambiar la configuración de correo electrónico", "Feature:AllowChangingEmailSettingsDescription": "Permitir cambiar la configuración de correo electrónico.", "SmtpPasswordPlaceholder": "Ingrese un valor para actualizar la contraseña" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json index 8e7efcb8c6..a2062743fd 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Asetusten hallinta", "Feature:SettingManagementEnable": "Ota asetusten hallinta käyttöön", "Feature:SettingManagementEnableDescription": "Ota asetustenhallintajärjestelmä käyttöön sovelluksessa.", - "Feature:AllowChangingEmailSettings": "Salli sähköpostiasetusten muuttaminen.", + "Feature:AllowChangingEmailSettings": "Salli sähköpostiasetusten muuttaminen", "Feature:AllowChangingEmailSettingsDescription": "Salli sähköpostiasetusten muuttaminen.", "SmtpPasswordPlaceholder": "Syötä arvo päivittääksesi salasana" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json index 1844cc3fbb..957ff62a19 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Gestion des paramètres", "Feature:SettingManagementEnable": "Activer la gestion des paramètres", "Feature:SettingManagementEnableDescription": "Activer le système de gestion des paramètres dans l'application.", - "Feature:AllowChangingEmailSettings": "Autoriser la modification des paramètres de messagerie.", + "Feature:AllowChangingEmailSettings": "Autoriser la modification des paramètres de messagerie", "Feature:AllowChangingEmailSettingsDescription": "Autoriser la modification des paramètres de messagerie.", "SmtpPasswordPlaceholder": "Entrez une valeur pour mettre à jour le mot de passe" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json index c0979707a4..1e68c9ad7e 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json @@ -36,7 +36,7 @@ "Feature:SettingManagementGroup": "Upravljanje postavkama", "Feature:SettingManagementEnable": "Omogući upravljanje postavkama", "Feature:SettingManagementEnableDescription": "Omogućite sustav upravljanja postavkama u aplikaciji.", - "Feature:AllowChangingEmailSettings": "Dopusti promjenu postavki e-pošte.", + "Feature:AllowChangingEmailSettings": "Dopusti promjenu postavki e-pošte", "Feature:AllowChangingEmailSettingsDescription": "Dopusti promjenu postavki e-pošte.", "SmtpPasswordPlaceholder": "Unesite vrijednost za ažuriranje lozinke" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json index efe7876d8d..43b8a53593 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Beállításkezelés", "Feature:SettingManagementEnable": "Beállításkezelés engedélyezése", "Feature:SettingManagementEnableDescription": "A beállításkezelő rendszer engedélyezése az alkalmazásban.", - "Feature:AllowChangingEmailSettings": "Az e-mail beállítások módosításának engedélyezése.", + "Feature:AllowChangingEmailSettings": "Az e-mail beállítások módosításának engedélyezése", "Feature:AllowChangingEmailSettingsDescription": "Az e-mail beállítások módosításának engedélyezése.", "SmtpPasswordPlaceholder": "Adjon meg egy értéket a jelszó frissítéséhez" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json index 73c3c736a9..69a437b66e 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Stillingar", "Feature:SettingManagementEnable": "Virkja stillingar", "Feature:SettingManagementEnableDescription": "Virkja stillingar í forritinu.", - "Feature:AllowChangingEmailSettings": "Leyfa að breyta stillingum tölvupósts.", + "Feature:AllowChangingEmailSettings": "Leyfa að breyta stillingum tölvupósts", "Feature:AllowChangingEmailSettingsDescription": "Leyfa að breyta stillingum tölvupósts.", "SmtpPasswordPlaceholder": "Sláðu inn gildi til að uppfæra lykilorð" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json index cc6669e7c8..01f80cecfb 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Gestione Impostazioni", "Feature:SettingManagementEnable": "Abilita gestione impostazioni", "Feature:SettingManagementEnableDescription": "Abilita sistema gestione impostazioni nell'applicazione", - "Feature:AllowChangingEmailSettings": "Consenti di modificare le loro impostazioni e-mail.", + "Feature:AllowChangingEmailSettings": "Consenti di modificare le loro impostazioni e-mail", "Feature:AllowChangingEmailSettingsDescription": "Consenti di modificare le loro impostazioni e-mail.", "SmtpPasswordPlaceholder": "Inserisci un valore per aggiornare la password" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json index f6d86ab9ba..57a87f550b 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Instellingsbeheer", "Feature:SettingManagementEnable": "Instellingenbeheer inschakelen", "Feature:SettingManagementEnableDescription": "Schakel het instellingsbeheersysteem in de toepassing in.", - "Feature:AllowChangingEmailSettings": "Toestaan om e-mailinstellingen te wijzigen.", + "Feature:AllowChangingEmailSettings": "Toestaan om e-mailinstellingen te wijzigen", "Feature:AllowChangingEmailSettingsDescription": "Toestaan om e-mailinstellingen te wijzigen.", "SmtpPasswordPlaceholder": "Voer een waarde in om het wachtwoord bij te werken" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json index 45c144626d..28c8dd3689 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Zarządzanie ustawieniami", "Feature:SettingManagementEnable": "Włącz zarządzanie ustawieniami", "Feature:SettingManagementEnableDescription": "Włącz system zarządzania ustawieniami w aplikacji.", - "Feature:AllowChangingEmailSettings": "Zezwól na zmianę ustawień poczty e-mail.", + "Feature:AllowChangingEmailSettings": "Zezwól na zmianę ustawień poczty e-mail", "Feature:AllowChangingEmailSettingsDescription": "Zezwól na zmianę ustawień poczty e-mail.", "SmtpPasswordPlaceholder": "Wprowadź wartość, aby zaktualizować hasło" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json index 831d54707e..8b968bacfe 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Gestão de Cenários", "Feature:SettingManagementEnable": "Habilitar gerenciamento de configuração", "Feature:SettingManagementEnableDescription": "Habilite o sistema de gerenciamento de configuração no aplicativo.", - "Feature:AllowChangingEmailSettings": "Permitir alterar as configurações de e-mail.", + "Feature:AllowChangingEmailSettings": "Permitir alterar as configurações de e-mail", "Feature:AllowChangingEmailSettingsDescription": "Permitir alterar as configurações de e-mail.", "SmtpPasswordPlaceholder": "Digite um valor para atualizar a senha" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json index a0f94747ed..83a9b3e2dc 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Administrarea setărilor", "Feature:SettingManagementEnable": "Activează administrarea setărilor", "Feature:SettingManagementEnableDescription": "Activează sistemul de administrare a setărilor în aplicaţie.", - "Feature:AllowChangingEmailSettings": "Permiteți modificarea setărilor de e-mail.", + "Feature:AllowChangingEmailSettings": "Permiteți modificarea setărilor de e-mail", "Feature:AllowChangingEmailSettingsDescription": "Permiteți modificarea setărilor de e-mail.", "SmtpPasswordPlaceholder": "Introduceți o valoare pentru a actualiza parola" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json index 1145595e8e..7026026918 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Управление настройками", "Feature:SettingManagementEnable": "Включить управление настройками", "Feature:SettingManagementEnableDescription": "Включите систему управления настройками в приложении.", - "Feature:AllowChangingEmailSettings": "Разрешить изменение настроек электронной почты.", + "Feature:AllowChangingEmailSettings": "Разрешить изменение настроек электронной почты", "Feature:AllowChangingEmailSettingsDescription": "Разрешить изменение настроек электронной почты.", "SmtpPasswordPlaceholder": "Введите значение для обновления пароля" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json index e8661a3471..9e4ef99363 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Správa nastavení", "Feature:SettingManagementEnable": "Povoliť správu nastavení", "Feature:SettingManagementEnableDescription": "Povoliť systém správy nastavení v aplikácii.", - "Feature:AllowChangingEmailSettings": "Povoliť zmenu nastavení e-mailu.", + "Feature:AllowChangingEmailSettings": "Povoliť zmenu nastavení e-mailu", "Feature:AllowChangingEmailSettingsDescription": "Povoliť zmenu nastavení e-mailu.", "SmtpPasswordPlaceholder": "Zadajte hodnotu pre aktualizáciu hesla" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json index 9bd877053b..e1cce43730 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Upravljanje nastavitev", "Feature:SettingManagementEnable": "Omogoči upravljanje nastavitev", "Feature:SettingManagementEnableDescription": "Omogočite nastavitev sistema upravljanja v aplikaciji.", - "Feature:AllowChangingEmailSettings": "Dovoli spreminjanje e-poštnih nastavitev.", + "Feature:AllowChangingEmailSettings": "Dovoli spreminjanje e-poštnih nastavitev", "Feature:AllowChangingEmailSettingsDescription": "Dovoli spreminjanje e-poštnih nastavitev.", "SmtpPasswordPlaceholder": "Vnesite vrednost za posodobitev gesla" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json index 01719059cc..95462e08b7 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json @@ -34,7 +34,7 @@ "Feature:SettingManagementGroup": "Hantering av inställningar", "Feature:SettingManagementEnable": "Aktivera hantering av inställningar", "Feature:SettingManagementEnableDescription": "Aktivera inställningshanteringssystem i applikationen.", - "Feature:AllowChangingEmailSettings": "Tillåt ändring av e-postinställningar.", + "Feature:AllowChangingEmailSettings": "Tillåt ändring av e-postinställningar", "Feature:AllowChangingEmailSettingsDescription": "Tillåt ändring av e-postinställningar.", "SmtpPasswordPlaceholder": "Ange ett värde för att uppdatera lösenordet" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json index ff4107e21b..8a2db80e58 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Ayar yönetimi", "Feature:SettingManagementEnable": "Ayar yönetimini etkinleştir", "Feature:SettingManagementEnableDescription": "Uygulamada ayar yönetim sistemini etkinleştirin.", - "Feature:AllowChangingEmailSettings": "E-posta ayarlarını değiştirmeye izin verin.", + "Feature:AllowChangingEmailSettings": "E-posta ayarlarını değiştirmeye izin verin", "Feature:AllowChangingEmailSettingsDescription": "E-posta ayarlarını değiştirmeye izin verin.", "SmtpPasswordPlaceholder": "Şifreyi güncellemek için bir değer girin" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json index 38b284a6ca..4c4f74ec2c 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "Cài đặt quản lý", "Feature:SettingManagementEnable": "Bật quản lý cài đặt", "Feature:SettingManagementEnableDescription": "Bật cài đặt hệ thống quản lý trong ứng dụng.", - "Feature:AllowChangingEmailSettings": "Cho phép thay đổi cài đặt email.", + "Feature:AllowChangingEmailSettings": "Cho phép thay đổi cài đặt email", "Feature:AllowChangingEmailSettingsDescription": "Cho phép thay đổi cài đặt email.", "SmtpPasswordPlaceholder": "Nhập một giá trị để cập nhật mật khẩu" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json index b9d0940273..392eb7e4e9 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "设置管理", "Feature:SettingManagementEnable": "启用设置管理", "Feature:SettingManagementEnableDescription": "在应用程序中启用设置管理系统。", - "Feature:AllowChangingEmailSettings": "允许更改邮件设置。", + "Feature:AllowChangingEmailSettings": "允许更改邮件设置", "Feature:AllowChangingEmailSettingsDescription": "允许更改邮件设置。", "SmtpPasswordPlaceholder": "输入一个值以更新密码" } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json index b57a542842..3dea507456 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json @@ -35,7 +35,7 @@ "Feature:SettingManagementGroup": "設定管理", "Feature:SettingManagementEnable": "啟用設定管理", "Feature:SettingManagementEnableDescription": "在應用程序中啟用設定管理系統.", - "Feature:AllowChangingEmailSettings": "允許更改電子郵件設置。", + "Feature:AllowChangingEmailSettings": "允許更改電子郵件設置", "Feature:AllowChangingEmailSettingsDescription": "允許更改電子郵件設置。", "SmtpPasswordPlaceholder": "輸入一個值以更新密碼" } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor index f87467f8c2..77dc2b494c 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor @@ -40,7 +40,7 @@ { -
+ @L["NewTenant"] @@ -89,7 +89,7 @@ - +
@@ -101,7 +101,7 @@ { -
+ @L["Edit"] @@ -123,7 +123,7 @@ - +
diff --git a/modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/InviteUserToTenantRequestedEto.cs b/modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/InviteUserToTenantRequestedEto.cs new file mode 100644 index 0000000000..f47b1ea0e9 --- /dev/null +++ b/modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/InviteUserToTenantRequestedEto.cs @@ -0,0 +1,16 @@ +using System; +using Volo.Abp.EventBus; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Users; + +[Serializable] +[EventName("Volo.Abp.Users.InviteUserToTenantRequested")] +public class InviteUserToTenantRequestedEto : IMultiTenant +{ + public Guid? TenantId { get; set; } + + public string Email { get; set; } + + public bool DirectlyAddToTenant { get; set; } +} diff --git a/modules/virtual-file-explorer/app/package.json b/modules/virtual-file-explorer/app/package.json index 50866814bc..0bab9f7fda 100644 --- a/modules/virtual-file-explorer/app/package.json +++ b/modules/virtual-file-explorer/app/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0-rc.2", - "@abp/virtual-file-explorer": "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.1.0", + "@abp/virtual-file-explorer": "~10.1.0" } } diff --git a/npm/lerna.json b/npm/lerna.json index ee02c6794e..b8fb175701 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "10.1.0-rc.2", + "version": "10.1.0", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/apps/dev-app/src/app/app.config.ts b/npm/ng-packs/apps/dev-app/src/app/app.config.ts index daa8a1f937..6b8bcf2c05 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app.config.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app.config.ts @@ -31,6 +31,10 @@ export const appConfig: ApplicationConfig = { registerLocaleFn: registerLocaleForEsBuild(), sendNullsAsQueryParam: false, skipGetAppConfiguration: false, + uiLocalization: { + enabled: true, + basePath: '/assets/localization', + }, }), ), provideAbpOAuth(), diff --git a/npm/ng-packs/apps/dev-app/src/app/app.routes.ts b/npm/ng-packs/apps/dev-app/src/app/app.routes.ts index c520328975..6c59a18bb1 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app.routes.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app.routes.ts @@ -10,6 +10,10 @@ export const appRoutes: Routes = [ path: 'dynamic-form', loadComponent: () => import('./dynamic-form-page/dynamic-form-page.component').then(m => m.DynamicFormPageComponent), }, + { + path: 'localization-test', + loadComponent: () => import('./localization-test/localization-test.component').then(m => m.LocalizationTestComponent), + }, { path: 'account', loadChildren: () => import('@abp/ng.account').then(m => m.createRoutes()), diff --git a/npm/ng-packs/apps/dev-app/src/app/dynamic-form-page/dynamic-form-page.component.ts b/npm/ng-packs/apps/dev-app/src/app/dynamic-form-page/dynamic-form-page.component.ts index 0955a448e5..aaa213775c 100644 --- a/npm/ng-packs/apps/dev-app/src/app/dynamic-form-page/dynamic-form-page.component.ts +++ b/npm/ng-packs/apps/dev-app/src/app/dynamic-form-page/dynamic-form-page.component.ts @@ -1,4 +1,4 @@ -import { Component, inject, OnInit, ViewChild } from '@angular/core'; +import { Component, inject, OnInit, viewChild } from '@angular/core'; import { DynamicFormComponent, FormFieldConfig } from '@abp/ng.components/dynamic-form'; import { FormConfigService } from './form-config.service'; @@ -8,7 +8,7 @@ import { FormConfigService } from './form-config.service'; imports: [DynamicFormComponent], }) export class DynamicFormPageComponent implements OnInit { - @ViewChild(DynamicFormComponent, { static: false }) dynamicFormComponent: DynamicFormComponent; + readonly dynamicFormComponent = viewChild(DynamicFormComponent); protected readonly formConfigService = inject(FormConfigService); formFields: FormFieldConfig[] = []; @@ -27,12 +27,12 @@ export class DynamicFormPageComponent implements OnInit { alert('✅ Form submitted successfully! Check the console for details.'); // Reset form after submission - this.dynamicFormComponent.resetForm(); + this.dynamicFormComponent().resetForm(); } cancel() { console.log('❌ Form Cancelled'); alert('Form cancelled'); - this.dynamicFormComponent.resetForm(); + this.dynamicFormComponent().resetForm(); } } diff --git a/npm/ng-packs/apps/dev-app/src/app/home/home.component.html b/npm/ng-packs/apps/dev-app/src/app/home/home.component.html index d83f2be7f1..d8b08c06ae 100644 --- a/npm/ng-packs/apps/dev-app/src/app/home/home.component.html +++ b/npm/ng-packs/apps/dev-app/src/app/home/home.component.html @@ -1,6 +1,7 @@
-
+ \ No newline at end of file diff --git a/npm/ng-packs/packages/account/src/lib/components/manage-profile/manage-profile.component.ts b/npm/ng-packs/packages/account/src/lib/components/manage-profile/manage-profile.component.ts index c9095f63da..5be91d34f7 100644 --- a/npm/ng-packs/packages/account/src/lib/components/manage-profile/manage-profile.component.ts +++ b/npm/ng-packs/packages/account/src/lib/components/manage-profile/manage-profile.component.ts @@ -1,10 +1,9 @@ import { ProfileService } from '@abp/ng.account.core/proxy'; -import { fadeIn, LoadingDirective } from '@abp/ng.theme.shared'; -import { transition, trigger, useAnimation } from '@angular/animations'; +import { LoadingDirective } from '@abp/ng.theme.shared'; import { Component, inject, OnInit } from '@angular/core'; import { eAccountComponents } from '../../enums/components'; import { ManageProfileStateService } from '../../services/manage-profile.state.service'; -import { NgClass, AsyncPipe } from '@angular/common'; +import { AsyncPipe } from '@angular/common'; import { ReactiveFormsModule } from '@angular/forms'; import { LocalizationPipe, ReplaceableTemplateDirective } from '@abp/ng.core'; import { PersonalSettingsComponent } from '../personal-settings/personal-settings.component'; @@ -13,24 +12,34 @@ import { ChangePasswordComponent } from '../change-password/change-password.comp @Component({ selector: 'abp-manage-profile', templateUrl: './manage-profile.component.html', - animations: [trigger('fadeIn', [transition(':enter', useAnimation(fadeIn))])], styles: [ - //TODO: move static styles ` .min-h-400 { min-height: 400px; } + + .fade-in { + animation: fadeIn 350ms ease both; + } + + @keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } + } `, ], imports: [ - NgClass, AsyncPipe, ReactiveFormsModule, PersonalSettingsComponent, ChangePasswordComponent, LocalizationPipe, ReplaceableTemplateDirective, - LoadingDirective, + LoadingDirective ], }) export class ManageProfileComponent implements OnInit { diff --git a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts index 53ebf25a39..731c589ba0 100644 --- a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts +++ b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts @@ -87,7 +87,7 @@ export class PersonalSettingsComponent .subscribe(profile => { this.manageProfileState.setProfile(profile); this.configState.refreshAppState(); - this.toasterService.success('AbpAccount::PersonalSettingsSaved', 'Success', { life: 5000 }); + this.toasterService.success('AbpAccount::PersonalSettingsSaved', '', { life: 5000 }); if (isRefreshTokenExists) { return this.authService.refreshToken(); diff --git a/npm/ng-packs/packages/cms-kit/README.md b/npm/ng-packs/packages/cms-kit/README.md new file mode 100644 index 0000000000..a471ac2eb2 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/README.md @@ -0,0 +1,85 @@ +# @abp/ng.cms-kit + +ABP CMS Kit Angular package providing admin and public functionality for content management. + +## Structure + +This package is organized into two main sub-packages: + +- **Admin** (`admin/`) - Admin interface for managing CMS content +- **Public** (`public/`) - Public-facing components for displaying CMS content + +## Installation + +```bash +npm install @abp/ng.cms-kit +``` + +## Usage + +### Admin + +```typescript +import { provideCmsKitAdminConfig } from '@abp/ng.cms-kit/admin/config'; + +// In your app config +export const appConfig: ApplicationConfig = { + providers: [ + provideCmsKitAdminConfig(), + // ... other providers + ], +}; + +// In your routes +export const routes: Routes = [ + { + path: 'cms', + loadChildren: () => import('@abp/ng.cms-kit/admin').then(m => m.createRoutes()), + }, +]; +``` + +### Public + +```typescript +import { provideCmsKitPublicConfig } from '@abp/ng.cms-kit/public/config'; + +// In your app config +export const appConfig: ApplicationConfig = { + providers: [ + provideCmsKitPublicConfig(), + // ... other providers + ], +}; + +// In your routes +export const routes: Routes = [ + { + path: 'cms', + loadChildren: () => import('@abp/ng.cms-kit/public').then(m => m.createRoutes()), + }, +]; +``` + +## Features + +### Admin Features + +- Comments management +- Tags management +- Pages management +- Blogs management +- Blog posts management +- Menus management +- Global resources management + +### Public Features + +- Public page viewing +- Public blog and blog post viewing +- Commenting functionality +- Shared components (MarkedItemToggle, PopularTags, Rating, ReactionSelection, Tags) + +## Documentation + +For more information, see the [ABP Documentation](https://docs.abp.io). diff --git a/npm/ng-packs/packages/cms-kit/admin/config/ng-package.json b/npm/ng-packs/packages/cms-kit/admin/config/ng-package.json new file mode 100644 index 0000000000..f55dff93db --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../node_modules/ng-packagr/ng-entrypoint.schema.json", + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/enums/index.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/enums/index.ts new file mode 100644 index 0000000000..4a7a6a0e23 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/enums/index.ts @@ -0,0 +1,2 @@ +export * from './policy-names'; +export * from './route-names'; diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/enums/policy-names.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/enums/policy-names.ts new file mode 100644 index 0000000000..7493070ddb --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/enums/policy-names.ts @@ -0,0 +1,10 @@ +export enum eCmsKitAdminPolicyNames { + Cms = 'CmsKit.Comments || CmsKit.Tags || CmsKit.Pages || CmsKit.Blogs || CmsKit.BlogPosts || CmsKit.Menus || CmsKit.GlobalResources', + Comments = 'CmsKit.Comments', + Tags = 'CmsKit.Tags', + Pages = 'CmsKit.Pages', + Blogs = 'CmsKit.Blogs', + BlogPosts = 'CmsKit.BlogPosts', + Menus = 'CmsKit.Menus', + GlobalResources = 'CmsKit.GlobalResources', +} diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/enums/route-names.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/enums/route-names.ts new file mode 100644 index 0000000000..5e600eee3a --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/enums/route-names.ts @@ -0,0 +1,10 @@ +export enum eCmsKitAdminRouteNames { + Cms = 'CmsKit::Menu:CMS', + Comments = 'CmsKit::CmsKit.Comments', + Tags = 'CmsKit::CmsKit.Tags', + Pages = 'CmsKit::Pages', + Blogs = 'CmsKit::Blogs', + BlogPosts = 'CmsKit::BlogPosts', + Menus = 'CmsKit::Menus', + GlobalResources = 'CmsKit::GlobalResources', +} diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/models/cms-kit-admin-settings.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/models/cms-kit-admin-settings.ts new file mode 100644 index 0000000000..5ff7df02cf --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/models/cms-kit-admin-settings.ts @@ -0,0 +1,3 @@ +export interface Settings { + commentRequireApprovement: boolean; +} diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/models/index.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/models/index.ts new file mode 100644 index 0000000000..e1c3be2829 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/models/index.ts @@ -0,0 +1 @@ +export * from './cms-kit-admin-settings'; diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/providers/cms-kit-admin-config.provider.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/providers/cms-kit-admin-config.provider.ts new file mode 100644 index 0000000000..755577d5ff --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/providers/cms-kit-admin-config.provider.ts @@ -0,0 +1,10 @@ +import { makeEnvironmentProviders } from '@angular/core'; +import { CMS_KIT_ADMIN_ROUTE_PROVIDERS } from './route.provider'; +import { CMS_KIT_ADMIN_SETTING_TAB_PROVIDERS } from './setting-tab.provider'; + +export function provideCmsKitAdminConfig() { + return makeEnvironmentProviders([ + CMS_KIT_ADMIN_ROUTE_PROVIDERS, + CMS_KIT_ADMIN_SETTING_TAB_PROVIDERS, + ]); +} diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/providers/index.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/providers/index.ts new file mode 100644 index 0000000000..1abcce3a32 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/providers/index.ts @@ -0,0 +1,3 @@ +export * from './cms-kit-admin-config.provider'; +export * from './route.provider'; +export * from './setting-tab.provider'; diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/providers/route.provider.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/providers/route.provider.ts new file mode 100644 index 0000000000..ead5fcbc36 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/providers/route.provider.ts @@ -0,0 +1,79 @@ +import { eLayoutType, RoutesService } from '@abp/ng.core'; +import { inject, provideAppInitializer } from '@angular/core'; +import { eCmsKitAdminPolicyNames } from '../enums/policy-names'; +import { eCmsKitAdminRouteNames } from '../enums/route-names'; + +export const CMS_KIT_ADMIN_ROUTE_PROVIDERS = [ + provideAppInitializer(() => { + configureRoutes(); + }), +]; + +export function configureRoutes() { + const routesService = inject(RoutesService); + routesService.add([ + { + path: '/cms/blog-posts', + name: eCmsKitAdminRouteNames.BlogPosts, + parentName: eCmsKitAdminRouteNames.Cms, + order: 1, + layout: eLayoutType.application, + iconClass: 'fa fa-file-alt', + requiredPolicy: eCmsKitAdminPolicyNames.BlogPosts, + }, + { + path: '/cms/blogs', + name: eCmsKitAdminRouteNames.Blogs, + parentName: eCmsKitAdminRouteNames.Cms, + order: 2, + layout: eLayoutType.application, + iconClass: 'fa fa-blog', + requiredPolicy: eCmsKitAdminPolicyNames.Blogs, + }, + { + path: '/cms/comments', + name: eCmsKitAdminRouteNames.Comments, + parentName: eCmsKitAdminRouteNames.Cms, + order: 3, + layout: eLayoutType.application, + iconClass: 'fa fa-comments', + requiredPolicy: eCmsKitAdminPolicyNames.Comments, + }, + { + path: '/cms/global-resources', + name: eCmsKitAdminRouteNames.GlobalResources, + parentName: eCmsKitAdminRouteNames.Cms, + order: 5, + layout: eLayoutType.application, + iconClass: 'fa fa-globe', + requiredPolicy: eCmsKitAdminPolicyNames.GlobalResources, + }, + { + path: '/cms/menus', + name: eCmsKitAdminRouteNames.Menus, + parentName: eCmsKitAdminRouteNames.Cms, + order: 6, + layout: eLayoutType.application, + iconClass: 'fa fa-bars', + requiredPolicy: eCmsKitAdminPolicyNames.Menus, + }, + { + path: '/cms/pages', + name: eCmsKitAdminRouteNames.Pages, + parentName: eCmsKitAdminRouteNames.Cms, + order: 9, + layout: eLayoutType.application, + iconClass: 'fa fa-file', + requiredPolicy: eCmsKitAdminPolicyNames.Pages, + }, + { + path: '/cms/tags', + name: eCmsKitAdminRouteNames.Tags, + parentName: eCmsKitAdminRouteNames.Cms, + order: 11, + layout: eLayoutType.application, + iconClass: 'fa fa-tags', + requiredPolicy: eCmsKitAdminPolicyNames.Tags, + }, + ]); +} diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/providers/setting-tab.provider.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/providers/setting-tab.provider.ts new file mode 100644 index 0000000000..432fe2971d --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/providers/setting-tab.provider.ts @@ -0,0 +1,27 @@ +import { ABP, ConfigStateService } from '@abp/ng.core'; +import { SettingTabsService } from '@abp/ng.setting-management/config'; +import { inject, provideAppInitializer } from '@angular/core'; +import { eCmsKitAdminPolicyNames, eCmsKitAdminRouteNames } from '../enums'; +import { CmsSettingsComponent } from '@abp/ng.cms-kit/admin'; + +export const CMS_KIT_ADMIN_SETTING_TAB_PROVIDERS = [ + provideAppInitializer(() => { + configureSettingTabs(); + }), +]; + +export async function configureSettingTabs() { + const settingTabs = inject(SettingTabsService); + const configState = inject(ConfigStateService); + const tabsArray: ABP.Tab[] = [ + { + name: eCmsKitAdminRouteNames.Cms, + order: 100, + requiredPolicy: eCmsKitAdminPolicyNames.Cms, + invisible: configState.getFeature('CmsKit.CommentEnable')?.toLowerCase() === 'true', + component: CmsSettingsComponent, + }, + ]; + + settingTabs.add(tabsArray); +} diff --git a/npm/ng-packs/packages/cms-kit/admin/config/src/public-api.ts b/npm/ng-packs/packages/cms-kit/admin/config/src/public-api.ts new file mode 100644 index 0000000000..b76fc0b2a7 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/config/src/public-api.ts @@ -0,0 +1,3 @@ +export * from './enums'; +export * from './providers'; +export * from './models'; diff --git a/npm/ng-packs/packages/cms-kit/admin/ng-package.json b/npm/ng-packs/packages/cms-kit/admin/ng-package.json new file mode 100644 index 0000000000..e09fb3fd03 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-entrypoint.schema.json", + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/cms-kit-admin.routes.ts b/npm/ng-packs/packages/cms-kit/admin/src/cms-kit-admin.routes.ts new file mode 100644 index 0000000000..204569e0d2 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/cms-kit-admin.routes.ts @@ -0,0 +1,241 @@ +import { Routes } from '@angular/router'; +import { Provider } from '@angular/core'; +import { + RouterOutletComponent, + authGuard, + permissionGuard, + ReplaceableRouteContainerComponent, +} from '@abp/ng.core'; +import { eCmsKitAdminComponents } from './enums'; +import { + CommentListComponent, + CommentDetailsComponent, + TagListComponent, + PageListComponent, + PageFormComponent, + BlogListComponent, + BlogPostListComponent, + BlogPostFormComponent, + MenuItemListComponent, + GlobalResourcesComponent, +} from './components'; +import { + CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS, + CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS, + CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS, + CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS, + CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS, +} from './tokens'; +import { cmsKitAdminExtensionsResolver } from './resolvers'; +import { CmsKitAdminConfigOptions } from './models'; + +export function createRoutes(config: CmsKitAdminConfigOptions = {}): Routes { + return [ + { + path: '', + component: RouterOutletComponent, + providers: provideCmsKitAdminContributors(config), + canActivate: [authGuard, permissionGuard], + children: [ + { + path: 'comments', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.Comments', + replaceableComponent: { + key: eCmsKitAdminComponents.CommentList, + defaultComponent: CommentListComponent, + }, + }, + title: 'CmsKit::Comments', + }, + { + path: 'comments/:id', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.Comments', + replaceableComponent: { + key: eCmsKitAdminComponents.CommentDetails, + defaultComponent: CommentDetailsComponent, + }, + }, + title: 'CmsKit::Comments', + }, + { + path: 'tags', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.Tags', + replaceableComponent: { + key: eCmsKitAdminComponents.Tags, + defaultComponent: TagListComponent, + }, + }, + title: 'CmsKit::Tags', + }, + { + path: 'pages', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.Pages', + replaceableComponent: { + key: eCmsKitAdminComponents.Pages, + defaultComponent: PageListComponent, + }, + }, + title: 'CmsKit::Pages', + }, + { + path: 'pages/create', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.Pages.Create', + replaceableComponent: { + key: eCmsKitAdminComponents.PageForm, + defaultComponent: PageFormComponent, + }, + }, + title: 'CmsKit::Pages', + }, + { + path: 'pages/update/:id', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.Pages.Update', + replaceableComponent: { + key: eCmsKitAdminComponents.PageForm, + defaultComponent: PageFormComponent, + }, + }, + title: 'CmsKit::Pages', + }, + { + path: 'blogs', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.Blogs', + replaceableComponent: { + key: eCmsKitAdminComponents.Blogs, + defaultComponent: BlogListComponent, + }, + }, + title: 'CmsKit::Blogs', + }, + { + path: 'blog-posts', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.BlogPosts', + replaceableComponent: { + key: eCmsKitAdminComponents.BlogPosts, + defaultComponent: BlogPostListComponent, + }, + }, + title: 'CmsKit::BlogPosts', + }, + { + path: 'blog-posts/create', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.BlogPosts.Create', + replaceableComponent: { + key: eCmsKitAdminComponents.BlogPostForm, + defaultComponent: BlogPostFormComponent, + }, + }, + title: 'CmsKit::BlogPosts', + }, + { + path: 'blog-posts/update/:id', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.BlogPosts.Update', + replaceableComponent: { + key: eCmsKitAdminComponents.BlogPostForm, + defaultComponent: BlogPostFormComponent, + }, + }, + title: 'CmsKit::BlogPosts', + }, + { + path: 'menus', + component: ReplaceableRouteContainerComponent, + resolve: { + extensions: cmsKitAdminExtensionsResolver, + }, + data: { + requiredPolicy: 'CmsKit.Menus', + replaceableComponent: { + key: eCmsKitAdminComponents.Menus, + defaultComponent: MenuItemListComponent, + }, + }, + title: 'CmsKit::MenuItems', + }, + { + path: 'global-resources', + component: GlobalResourcesComponent, + data: { + requiredPolicy: 'CmsKit.GlobalResources', + }, + title: 'CmsKit::GlobalResources', + }, + ], + }, + ]; +} + +function provideCmsKitAdminContributors(options: CmsKitAdminConfigOptions = {}): Provider[] { + return [ + { + provide: CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS, + useValue: options.entityActionContributors, + }, + { + provide: CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS, + useValue: options.entityPropContributors, + }, + { + provide: CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS, + useValue: options.toolbarActionContributors, + }, + { + provide: CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS, + useValue: options.createFormPropContributors, + }, + { + provide: CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS, + useValue: options.editFormPropContributors, + }, + ]; +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.html new file mode 100644 index 0000000000..2f8a80d721 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.html @@ -0,0 +1,81 @@ + +
+
+ @if (form && (!isEditMode || blogPost)) { +
+ +
+ @if (coverImagePreview) { +
+ Cover Image +
+ +
+
+ } + + +
+ + + + + +
+ + +
+ + + + @if (isTagsEnabled) { +
+
+ + +
{{ 'CmsKit::TagsHelpText' | abpLocalization }}
+
+ } + } @else { +
+ +
+ } +
+ +
+
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.ts new file mode 100644 index 0000000000..36a7cc2629 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-form/blog-post-form.component.ts @@ -0,0 +1,257 @@ +import { CommonModule } from '@angular/common'; +import { ActivatedRoute } from '@angular/router'; +import { Component, OnInit, inject, Injector, DestroyRef } from '@angular/core'; +import { ReactiveFormsModule, FormsModule, FormGroup, FormControl } from '@angular/forms'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { forkJoin, of } from 'rxjs'; +import { switchMap, tap } from 'rxjs/operators'; +import { LocalizationPipe, RestService } from '@abp/ng.core'; +import { + ExtensibleFormComponent, + FormPropData, + generateFormFromProps, + EXTENSIONS_IDENTIFIER, +} from '@abp/ng.components/extensible'; +import { PageComponent } from '@abp/ng.components/page'; +import { ButtonComponent } from '@abp/ng.theme.shared'; +import { ToastuiEditorComponent, prepareSlugFromControl } from '@abp/ng.cms-kit'; +import { + BlogPostAdminService, + BlogPostDto, + MediaDescriptorAdminService, + EntityTagAdminService, + CreateMediaInputWithStream, + TagDto, + BlogFeatureDto, +} from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; +import { BlogPostFormService } from '../../../services'; + +@Component({ + selector: 'abp-blog-post-form', + templateUrl: './blog-post-form.component.html', + providers: [ + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.BlogPostForm, + }, + ], + imports: [ + ButtonComponent, + ExtensibleFormComponent, + PageComponent, + ToastuiEditorComponent, + LocalizationPipe, + ReactiveFormsModule, + FormsModule, + CommonModule, + NgxValidateCoreModule, + ], +}) +export class BlogPostFormComponent implements OnInit { + private blogPostService = inject(BlogPostAdminService); + private mediaService = inject(MediaDescriptorAdminService); + private entityTagService = inject(EntityTagAdminService); + private restService = inject(RestService); + private injector = inject(Injector); + private blogPostFormService = inject(BlogPostFormService); + private route = inject(ActivatedRoute); + private destroyRef = inject(DestroyRef); + + form: FormGroup; + blogPost: BlogPostDto | null = null; + blogPostId: string | null = null; + isEditMode = false; + coverImageFile: File | null = null; + coverImagePreview: string | null = null; + tags: string = ''; + isTagsEnabled = true; + + readonly BLOG_POST_ENTITY_TYPE = 'BlogPost'; + + ngOnInit() { + const id = this.route.snapshot.params['id']; + if (id) { + this.isEditMode = true; + this.blogPostId = id; + this.loadBlogPost(id); + } else { + this.isEditMode = false; + this.buildForm(); + } + } + + private loadBlogPost(id: string) { + this.blogPostService.get(id).subscribe(blogPost => { + this.blogPost = blogPost; + if (blogPost.coverImageMediaId) { + this.coverImagePreview = `/api/cms-kit/media/${blogPost.coverImageMediaId}`; + } + this.buildForm(); + this.loadTags(id); + }); + } + + private loadTags(blogPostId: string) { + // TODO: use the public service to load the tags + this.restService + .request({ + method: 'GET', + url: `/api/cms-kit-public/tags/${this.BLOG_POST_ENTITY_TYPE}/${blogPostId}`, + }) + .subscribe(tags => { + if (tags && tags.length > 0) { + this.tags = tags.map(t => t.name || '').join(', '); + } + }); + } + + private buildForm() { + const data = new FormPropData(this.injector, this.blogPost || {}); + const baseForm = generateFormFromProps(data); + this.form = new FormGroup({ + ...baseForm.controls, + content: new FormControl(this.blogPost?.content || ''), + coverImageMediaId: new FormControl(this.blogPost?.coverImageMediaId || null), + }); + prepareSlugFromControl(this.form, 'title', 'slug', this.destroyRef); + + // Check if tags feature is enabled for the blog + const blogId = this.form.get('blogId')?.value || this.blogPost?.blogId; + if (blogId) { + this.checkTagsFeature(blogId); + } + + // Listen for blog selection changes + this.form + .get('blogId') + ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(blogId => { + if (blogId) { + this.checkTagsFeature(blogId); + } + }); + } + + private checkTagsFeature(blogId: string) { + this.restService + .request({ + method: 'GET', + url: `/api/cms-kit/blogs/${blogId}/features/CmsKit.Tags`, + }) + .subscribe(feature => { + const { isEnabled } = feature || {}; + this.isTagsEnabled = isEnabled; + }); + } + + onCoverImageChange(event: Event) { + const input = event.target as HTMLInputElement; + if (input.files && input.files[0]) { + this.coverImageFile = input.files[0]; + const reader = new FileReader(); + reader.onload = (e: any) => { + this.coverImagePreview = e.target.result; + }; + reader.readAsDataURL(this.coverImageFile); + } + } + + removeCoverImage() { + this.coverImageFile = null; + this.coverImagePreview = null; + this.form.patchValue({ coverImageMediaId: null }); + } + + private uploadCoverImage() { + if (!this.coverImageFile) { + return of(this.form.value.coverImageMediaId || null); + } + + const input: CreateMediaInputWithStream = { + name: this.coverImageFile.name, + file: this.coverImageFile as any, + }; + + return this.mediaService.create('blogpost', input).pipe( + tap(result => { + this.form.patchValue({ coverImageMediaId: result.id }); + }), + switchMap(result => of(result.id || null)), + ); + } + + private setTags(blogPostId: string) { + if (!this.tags || !this.tags.trim()) { + return of(null); + } + + const tagArray = this.tags + .split(',') + .map(t => t.trim()) + .filter(t => t.length > 0); + + if (tagArray.length === 0) { + return of(null); + } + + return this.entityTagService.setEntityTags({ + entityType: this.BLOG_POST_ENTITY_TYPE, + entityId: blogPostId, + tags: tagArray, + }); + } + + private executeSaveOperation(operation: 'save' | 'draft' | 'publish' | 'sendToReview') { + // First upload cover image if selected + this.uploadCoverImage() + .pipe( + tap(coverImageMediaId => { + if (coverImageMediaId) { + this.form.patchValue({ coverImageMediaId }); + } + }), + switchMap(() => { + if (this.isEditMode) { + if (!this.blogPost || !this.blogPostId) { + return of(null); + } + return this.blogPostFormService.update(this.blogPostId, this.form, this.blogPost); + } + + switch (operation) { + case 'save': + case 'draft': + return this.blogPostFormService.createAsDraft(this.form); + case 'publish': + return this.blogPostFormService.createAndPublish(this.form); + case 'sendToReview': + return this.blogPostFormService.createAndSendToReview(this.form); + default: + return of(null); + } + }), + switchMap(result => { + if (!result || !result.id) { + return of(null); + } + // Set tags after blog post is created/updated + return forkJoin([of(result), this.setTags(result.id)]); + }), + ) + .subscribe(); + } + + saveAsDraft() { + this.executeSaveOperation('draft'); + } + + publish() { + this.executeSaveOperation('publish'); + } + + sendToReview() { + this.executeSaveOperation('sendToReview'); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.html new file mode 100644 index 0000000000..9c8b768945 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.html @@ -0,0 +1,40 @@ + +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
+ +
+
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.ts new file mode 100644 index 0000000000..67f90689f4 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/blog-post-list/blog-post-list.component.ts @@ -0,0 +1,86 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { ListService, PagedResultDto, LocalizationPipe } from '@abp/ng.core'; +import { ExtensibleTableComponent, EXTENSIONS_IDENTIFIER } from '@abp/ng.components/extensible'; +import { Confirmation, ConfirmationService } from '@abp/ng.theme.shared'; +import { PageComponent } from '@abp/ng.components/page'; +import { + BlogPostAdminService, + BlogPostGetListInput, + BlogPostListDto, + BlogPostStatus, +} from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; + +@Component({ + selector: 'abp-blog-post-list', + templateUrl: './blog-post-list.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.BlogPosts, + }, + ], + imports: [ExtensibleTableComponent, PageComponent, LocalizationPipe, FormsModule, CommonModule], +}) +export class BlogPostListComponent implements OnInit { + data: PagedResultDto = { items: [], totalCount: 0 }; + + public readonly list = inject(ListService); + private blogPostService = inject(BlogPostAdminService); + private confirmationService = inject(ConfirmationService); + + filter = ''; + statusFilter: BlogPostStatus | null = null; + BlogPostStatus = BlogPostStatus; + + ngOnInit() { + this.hookToQuery(); + } + + onSearch() { + this.list.filter = this.filter; + this.list.get(); + } + + onStatusChange() { + this.list.get(); + } + + private hookToQuery() { + this.list + .hookToQuery(query => { + let filters: Partial = {}; + if (this.list.filter) { + filters.filter = this.list.filter; + } + if (this.statusFilter !== null) { + filters.status = this.statusFilter; + } + const input: BlogPostGetListInput = { + ...query, + ...filters, + }; + return this.blogPostService.getList(input); + }) + .subscribe(res => (this.data = res)); + } + + delete(id: string, title: string) { + this.confirmationService + .warn('CmsKit::BlogPostDeletionConfirmationMessage', 'AbpUi::AreYouSure', { + yesText: 'AbpUi::Yes', + cancelText: 'AbpUi::Cancel', + messageLocalizationParams: [title], + }) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + this.blogPostService.delete(id).subscribe(() => { + this.list.get(); + }); + } + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/index.ts new file mode 100644 index 0000000000..d82f02e326 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blog-posts/index.ts @@ -0,0 +1,2 @@ +export * from './blog-post-list/blog-post-list.component'; +export * from './blog-post-form/blog-post-form.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.html new file mode 100644 index 0000000000..da9240ac8c --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.html @@ -0,0 +1,65 @@ + + +

{{ 'CmsKit::Features' | abpLocalization }}

+
+ + + @if (form) { +
+
+ @for (featureControl of featuresFormArray.controls; track $index; let i = $index) { +
+ @let isAvailable = featureControl.get('isAvailable')?.value; + @if (isAvailable) { +
+ + +
+ } @else { +
+
+ + +
+
+ } + + +
+ } +
+
+ } @else { +
+ +
+ } +
+ + + + + {{ 'AbpUi::Save' | abpLocalization }} + + +
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.ts new file mode 100644 index 0000000000..4b4bd4f420 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-features-modal/blog-features-modal.component.ts @@ -0,0 +1,134 @@ +import { Component, OnInit, inject, input, output } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule, FormArray, FormBuilder, FormGroup } from '@angular/forms'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { forkJoin } from 'rxjs'; +import { LocalizationPipe } from '@abp/ng.core'; +import { + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ToasterService, +} from '@abp/ng.theme.shared'; +import { + BlogFeatureAdminService, + BlogFeatureDto, + BlogFeatureInputDto, +} from '@abp/ng.cms-kit/proxy'; + +export interface BlogFeaturesModalVisibleChange { + visible: boolean; + refresh: boolean; +} + +@Component({ + selector: 'abp-blog-features-modal', + templateUrl: './blog-features-modal.component.html', + imports: [ + LocalizationPipe, + ReactiveFormsModule, + CommonModule, + NgxValidateCoreModule, + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ], +}) +export class BlogFeaturesModalComponent implements OnInit { + private blogFeatureService = inject(BlogFeatureAdminService); + private fb = inject(FormBuilder); + private toasterService = inject(ToasterService); + + blogId = input(); + visibleChange = output(); + + form: FormGroup; + features: BlogFeatureDto[] = []; + private initialFeatureStates: Map = new Map(); + + ngOnInit() { + if (this.blogId()) { + this.loadFeatures(); + } + } + + private loadFeatures() { + this.blogFeatureService.getList(this.blogId()!).subscribe(features => { + this.features = features.sort((a, b) => + (a.featureName || '').localeCompare(b.featureName || ''), + ); + // Store initial states + this.initialFeatureStates = new Map( + this.features.map(f => [f.featureName || '', f.isEnabled || false]), + ); + this.buildForm(); + }); + } + + private buildForm() { + const featureControls = this.features.map(feature => + this.fb.group({ + featureName: [feature.featureName], + isEnabled: [feature.isEnabled], + isAvailable: [(feature as any).isAvailable ?? true], + }), + ); + + this.form = this.fb.group({ + features: this.fb.array(featureControls), + }); + } + + get featuresFormArray(): FormArray { + return this.form.get('features') as FormArray; + } + + onVisibleChange(visible: boolean, refresh = false) { + this.visibleChange.emit({ visible, refresh }); + } + + save() { + if (!this.form.valid || !this.blogId()) { + return; + } + + const featuresArray = this.form.get('features') as FormArray; + + // Only save features that have changed + const changedFeatures: BlogFeatureInputDto[] = featuresArray.controls + .map(control => { + const featureName = control.get('featureName')?.value; + const isEnabled = control.get('isEnabled')?.value; + const initialIsEnabled = this.initialFeatureStates.get(featureName); + + // Only include if the value has changed + if (featureName && initialIsEnabled !== isEnabled) { + return { + featureName, + isEnabled, + }; + } + return null; + }) + .filter((input): input is BlogFeatureInputDto => input !== null); + + // If no features changed, just close the modal + if (changedFeatures.length === 0) { + this.onVisibleChange(false, false); + return; + } + + // Save only changed features + const saveObservables = changedFeatures.map(input => + this.blogFeatureService.set(this.blogId()!, input), + ); + + // Use forkJoin to save all changed features at once + forkJoin(saveObservables).subscribe({ + next: () => { + this.onVisibleChange(false, true); + this.toasterService.success('AbpUi::SavedSuccessfully'); + }, + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.html new file mode 100644 index 0000000000..e9f224383f --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.html @@ -0,0 +1,16 @@ + +
+ +
+ + @if (isModalVisible) { + + } + + @if (isFeaturesModalVisible) { + + } +
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.ts new file mode 100644 index 0000000000..4b5c84495a --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-list/blog-list.component.ts @@ -0,0 +1,128 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { ListService, PagedResultDto, LocalizationPipe } from '@abp/ng.core'; +import { Confirmation, ConfirmationService } from '@abp/ng.theme.shared'; +import { ExtensibleTableComponent, EXTENSIONS_IDENTIFIER } from '@abp/ng.components/extensible'; +import { PageComponent } from '@abp/ng.components/page'; +import { BlogAdminService, BlogGetListInput, BlogDto } from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; +import { BlogModalComponent, BlogModalVisibleChange } from '../blog-modal/blog-modal.component'; +import { + BlogFeaturesModalComponent, + BlogFeaturesModalVisibleChange, +} from '../blog-features-modal/blog-features-modal.component'; + +@Component({ + selector: 'abp-blog-list', + templateUrl: './blog-list.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.Blogs, + }, + ], + imports: [ + ExtensibleTableComponent, + PageComponent, + LocalizationPipe, + FormsModule, + CommonModule, + BlogModalComponent, + BlogFeaturesModalComponent, + ], +}) +export class BlogListComponent implements OnInit { + data: PagedResultDto = { items: [], totalCount: 0 }; + + public readonly list = inject(ListService); + private blogService = inject(BlogAdminService); + private confirmationService = inject(ConfirmationService); + + filter = ''; + isModalVisible = false; + selected?: BlogDto; + isFeaturesModalVisible = false; + selectedBlogId?: string; + + ngOnInit() { + this.hookToQuery(); + } + + onSearch() { + this.list.filter = this.filter; + this.list.get(); + } + + add() { + this.selected = {} as BlogDto; + this.isModalVisible = true; + } + + edit(id: string) { + this.blogService.get(id).subscribe(blog => { + this.selected = blog; + this.isModalVisible = true; + }); + } + + delete(id: string, name: string) { + this.confirmationService + .warn('CmsKit::BlogDeletionConfirmationMessage', 'AbpUi::AreYouSure', { + messageLocalizationParams: [name], + }) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + this.blogService.delete(id).subscribe(() => { + this.list.get(); + }); + } + }); + } + + openFeatures(id: string) { + this.selectedBlogId = id; + this.isFeaturesModalVisible = true; + } + + private hookToQuery() { + this.list + .hookToQuery(query => { + let filters: Partial = {}; + if (this.list.filter) { + filters.filter = this.list.filter; + } + const input: BlogGetListInput = { + ...query, + ...filters, + }; + return this.blogService.getList(input); + }) + .subscribe(res => { + this.data = res; + }); + } + + onVisibleModalChange(visibilityChange: BlogModalVisibleChange) { + if (visibilityChange.visible) { + return; + } + if (visibilityChange.refresh) { + this.list.get(); + } + this.selected = null; + this.isModalVisible = false; + } + + onFeaturesModalChange(visibilityChange: BlogFeaturesModalVisibleChange) { + if (visibilityChange.visible) { + return; + } + if (visibilityChange.refresh) { + this.list.get(); + } + this.selectedBlogId = null; + this.isFeaturesModalVisible = false; + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.html new file mode 100644 index 0000000000..cb9d4d1e91 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.html @@ -0,0 +1,28 @@ + + +

+ {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }} +

+
+ + + @if (form) { +
+ + + } @else { +
+ +
+ } +
+ + + + + {{ 'AbpUi::Save' | abpLocalization }} + + +
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.ts new file mode 100644 index 0000000000..01a647c5ed --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/blog-modal/blog-modal.component.ts @@ -0,0 +1,86 @@ +import { Component, OnInit, inject, Injector, input, output, DestroyRef } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule, FormGroup } from '@angular/forms'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { LocalizationPipe } from '@abp/ng.core'; +import { + ExtensibleFormComponent, + FormPropData, + generateFormFromProps, +} from '@abp/ng.components/extensible'; +import { + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ToasterService, +} from '@abp/ng.theme.shared'; +import { BlogAdminService, BlogDto, CreateBlogDto, UpdateBlogDto } from '@abp/ng.cms-kit/proxy'; +import { prepareSlugFromControl } from '@abp/ng.cms-kit'; + +export interface BlogModalVisibleChange { + visible: boolean; + refresh: boolean; +} + +@Component({ + selector: 'abp-blog-modal', + templateUrl: './blog-modal.component.html', + imports: [ + ExtensibleFormComponent, + LocalizationPipe, + ReactiveFormsModule, + CommonModule, + NgxValidateCoreModule, + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ], +}) +export class BlogModalComponent implements OnInit { + private blogService = inject(BlogAdminService); + private injector = inject(Injector); + private toasterService = inject(ToasterService); + private destroyRef = inject(DestroyRef); + + selected = input(); + visibleChange = output(); + + form: FormGroup; + + ngOnInit() { + this.buildForm(); + } + + private buildForm() { + const data = new FormPropData(this.injector, this.selected()); + this.form = generateFormFromProps(data); + prepareSlugFromControl(this.form, 'name', 'slug', this.destroyRef); + } + + onVisibleChange(visible: boolean, refresh = false) { + this.visibleChange.emit({ visible, refresh }); + } + + save() { + if (!this.form.valid) { + return; + } + + let observable$ = this.blogService.create(this.form.value as CreateBlogDto); + + const selectedBlog = this.selected(); + const { id } = selectedBlog || {}; + + if (id) { + observable$ = this.blogService.update(id, { + ...selectedBlog, + ...this.form.value, + } as UpdateBlogDto); + } + + observable$.subscribe(() => { + this.onVisibleChange(false, true); + this.toasterService.success('AbpUi::SavedSuccessfully'); + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/index.ts new file mode 100644 index 0000000000..50a6989d02 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/blogs/index.ts @@ -0,0 +1,3 @@ +export * from './blog-list/blog-list.component'; +export * from './blog-modal/blog-modal.component'; +export * from './blog-features-modal/blog-features-modal.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/cms-settings/cms-settings.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/cms-settings/cms-settings.component.html new file mode 100644 index 0000000000..0f4cf1fd1d --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/cms-settings/cms-settings.component.html @@ -0,0 +1,42 @@ +
+
+ +
+
+
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/cms-settings/cms-settings.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/cms-settings/cms-settings.component.ts new file mode 100644 index 0000000000..34bf59385e --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/cms-settings/cms-settings.component.ts @@ -0,0 +1,59 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { FormControl, ReactiveFormsModule } from '@angular/forms'; +import { + NgbNav, + NgbNavItem, + NgbNavItemRole, + NgbNavLink, + NgbNavLinkBase, + NgbNavContent, + NgbNavOutlet, +} from '@ng-bootstrap/ng-bootstrap'; +import { finalize } from 'rxjs/operators'; +import { ConfigStateService, LocalizationPipe } from '@abp/ng.core'; +import { ButtonComponent, ToasterService } from '@abp/ng.theme.shared'; +import { CommentAdminService } from '@abp/ng.cms-kit/proxy'; + +import { CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT } from '../comments'; + +@Component({ + selector: 'abp-cms-settings', + templateUrl: './cms-settings.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + NgbNav, + NgbNavItem, + NgbNavItemRole, + NgbNavLink, + NgbNavLinkBase, + NgbNavContent, + NgbNavOutlet, + LocalizationPipe, + ButtonComponent, + ReactiveFormsModule, + ], +}) +export class CmsSettingsComponent { + readonly commentAdminService = inject(CommentAdminService); + readonly configState = inject(ConfigStateService); + readonly toaster = inject(ToasterService); + + commentApprovalControl = new FormControl(false); + + ngOnInit() { + const isCommentApprovalEnabled = + this.configState.getSetting(CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT).toLowerCase() === 'true'; + this.commentApprovalControl.setValue(isCommentApprovalEnabled); + } + + submit() { + this.commentAdminService + .updateSettings({ commentRequireApprovement: this.commentApprovalControl.value }) + .pipe( + finalize(() => { + this.configState.refreshAppState().subscribe(); + }), + ) + .subscribe(() => this.toaster.success('AbpUi::SavedSuccessfully', null)); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/cms-settings/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/cms-settings/index.ts new file mode 100644 index 0000000000..5153a82b86 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/cms-settings/index.ts @@ -0,0 +1 @@ +export * from './cms-settings.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/comment-details.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/comment-details.component.html new file mode 100644 index 0000000000..7b4c18c4a3 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/comment-details.component.html @@ -0,0 +1,147 @@ + + @if (comment) { +
+
+ + + + + + + + + + + + + + + + + + @if (comment.repliedCommentId) { + + + + + } + + + + +
+ {{ 'CmsKit::EntityType' | abpLocalization }}: + {{ comment.entityType }}
+ {{ 'CmsKit::EntityId' | abpLocalization }}: + {{ comment.entityId }}
+ {{ 'AbpIdentity::CreationTime' | abpLocalization }}: + {{ comment.creationTime | date }}
+ {{ 'CmsKit::Username' | abpLocalization }}: + {{ comment.author?.name }}
+ {{ 'CmsKit::ReplyTo' | abpLocalization }}: + + + {{ comment.repliedCommentId }} + +
+ {{ 'CmsKit::Text' | abpLocalization }}: + {{ comment.text }}
+
+
+ } + +
+
+
+ +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+ +
+ @if (requireApprovement) { +
+
+ + +
+
+ } + +
+
+ + + +
+
+
+
+
+
+ +

{{ 'CmsKit::RepliesToThisComment' | abpLocalization }}

+ +
+ +
+
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/comment-details.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/comment-details.component.ts new file mode 100644 index 0000000000..ffebe3ca2c --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-details/comment-details.component.ts @@ -0,0 +1,124 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { CommonModule, DatePipe } from '@angular/common'; +import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { NgbDateAdapter, NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; +import { ListService, LocalizationPipe, PagedResultDto } from '@abp/ng.core'; +import { PageComponent } from '@abp/ng.components/page'; +import { ExtensibleTableComponent, EXTENSIONS_IDENTIFIER } from '@abp/ng.components/extensible'; +import { ButtonComponent, DateTimeAdapter, FormInputComponent } from '@abp/ng.theme.shared'; +import { + CommentAdminService, + CommentGetListInput, + CommentWithAuthorDto, + CommentApproveState, + commentApproveStateOptions, +} from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; +import { CommentEntityService } from '../../../services'; + +@Component({ + selector: 'abp-comment-details', + templateUrl: './comment-details.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.CommentDetails, + }, + ], + viewProviders: [ + { + provide: NgbDateAdapter, + useClass: DateTimeAdapter, + }, + ], + imports: [ + ExtensibleTableComponent, + PageComponent, + LocalizationPipe, + ReactiveFormsModule, + NgbDatepickerModule, + CommonModule, + DatePipe, + FormInputComponent, + ButtonComponent, + ], +}) +export class CommentDetailsComponent implements OnInit { + comment: CommentWithAuthorDto | null = null; + data: PagedResultDto = { items: [], totalCount: 0 }; + + readonly list = inject(ListService); + readonly commentEntityService = inject(CommentEntityService); + + private commentService = inject(CommentAdminService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private fb = inject(FormBuilder); + + filterForm!: FormGroup; + commentApproveStateOptions = commentApproveStateOptions; + commentId!: string; + requireApprovement: boolean; + + ngOnInit() { + this.route.params.subscribe(params => { + const id = params['id']; + if (id) { + this.commentId = id; + this.loadComment(id); + this.createFilterForm(); + this.hookToQuery(); + } + }); + this.requireApprovement = this.commentEntityService.requireApprovement; + } + + private createFilterForm() { + this.filterForm = this.fb.group({ + creationStartDate: [null], + creationEndDate: [null], + author: [''], + commentApproveState: [CommentApproveState.All], + }); + } + + private loadComment(id: string) { + this.commentService.get(id).subscribe(comment => { + this.comment = comment; + }); + } + + onFilter() { + const formValue = this.filterForm.value; + const filters: Partial = { + author: formValue.author || undefined, + commentApproveState: formValue.commentApproveState, + repliedCommentId: this.commentId, + creationStartDate: formValue.creationStartDate || undefined, + creationEndDate: formValue.creationEndDate || undefined, + }; + + this.list.filter = filters as any; + this.list.get(); + } + + private hookToQuery() { + this.list + .hookToQuery(query => { + const filters = (this.list.filter as Partial) || {}; + const input: CommentGetListInput = { + repliedCommentId: this.commentId, + ...query, + ...filters, + }; + return this.commentService.getList(input); + }) + .subscribe(res => (this.data = res)); + } + + navigateToReply(id: string) { + this.router.navigate(['/cms/comments', id]); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/comment-list.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/comment-list.component.html new file mode 100644 index 0000000000..5137014959 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/comment-list.component.html @@ -0,0 +1,92 @@ + +
+
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+ +
+ +
+ +
+ @if (requireApprovement) { +
+
+ + +
+
+ } +
+ + + +
+
+
+
+
+ +
+ +
+
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/comment-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/comment-list.component.ts new file mode 100644 index 0000000000..dc7da58d78 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/comment-list/comment-list.component.ts @@ -0,0 +1,101 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { NgbDateAdapter, NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; +import { ListService, PagedResultDto, LocalizationPipe } from '@abp/ng.core'; +import { ExtensibleModule, EXTENSIONS_IDENTIFIER } from '@abp/ng.components/extensible'; +import { PageModule } from '@abp/ng.components/page'; +import { ButtonComponent, DateTimeAdapter, FormInputComponent } from '@abp/ng.theme.shared'; +import { + CommentAdminService, + CommentGetListInput, + CommentWithAuthorDto, + CommentApproveState, + commentApproveStateOptions, +} from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; +import { CommentEntityService } from '../../../services'; + +@Component({ + selector: 'abp-comment-list', + templateUrl: './comment-list.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.CommentList, + }, + ], + viewProviders: [ + { + provide: NgbDateAdapter, + useClass: DateTimeAdapter, + }, + ], + imports: [ + ExtensibleModule, + PageModule, + ReactiveFormsModule, + NgbDatepickerModule, + CommonModule, + LocalizationPipe, + FormInputComponent, + ButtonComponent, + ], +}) +export class CommentListComponent implements OnInit { + data: PagedResultDto = { items: [], totalCount: 0 }; + + readonly list = inject(ListService); + readonly commentEntityService = inject(CommentEntityService); + + private commentService = inject(CommentAdminService); + private fb = inject(FormBuilder); + + filterForm!: FormGroup; + commentApproveStateOptions = commentApproveStateOptions; + requireApprovement: boolean; + + ngOnInit() { + this.createFilterForm(); + this.hookToQuery(); + this.requireApprovement = this.commentEntityService.requireApprovement; + } + + private createFilterForm() { + this.filterForm = this.fb.group({ + creationStartDate: [null], + creationEndDate: [null], + author: [''], + entityType: [''], + commentApproveState: [CommentApproveState.All], + }); + } + + onFilter() { + const formValue = this.filterForm.value; + const filters: Partial = { + author: formValue.author || undefined, + entityType: formValue.entityType || undefined, + commentApproveState: formValue.commentApproveState, + creationStartDate: formValue.creationStartDate || undefined, + creationEndDate: formValue.creationEndDate || undefined, + }; + + this.list.filter = filters as any; + this.list.get(); + } + + private hookToQuery() { + this.list + .hookToQuery(query => { + const filters = (this.list.filter as Partial) || {}; + const input: CommentGetListInput = { + ...query, + ...filters, + }; + return this.commentService.getList(input); + }) + .subscribe(res => (this.data = res)); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/constants.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/constants.ts new file mode 100644 index 0000000000..95533e9eef --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/constants.ts @@ -0,0 +1 @@ +export const CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT = 'CmsKit.Comments.RequireApprovement'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/comments/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/index.ts new file mode 100644 index 0000000000..757b9958a5 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/comments/index.ts @@ -0,0 +1,3 @@ +export * from './comment-list/comment-list.component'; +export * from './comment-details/comment-details.component'; +export * from './constants'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/global-resources/global-resources.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/global-resources/global-resources.component.html new file mode 100644 index 0000000000..407c83dc26 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/global-resources/global-resources.component.html @@ -0,0 +1,39 @@ + +
+
+ + +
+
+
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/global-resources/global-resources.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/global-resources/global-resources.component.ts new file mode 100644 index 0000000000..a620267220 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/global-resources/global-resources.component.ts @@ -0,0 +1,95 @@ +import { Component, OnInit, inject, DestroyRef } from '@angular/core'; +import { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { CommonModule } from '@angular/common'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; +import { PageComponent } from '@abp/ng.components/page'; +import { LocalizationPipe } from '@abp/ng.core'; +import { ButtonComponent, ToasterService } from '@abp/ng.theme.shared'; +import { CodeMirrorEditorComponent } from '@abp/ng.cms-kit'; +import { + GlobalResourceAdminService, + GlobalResourcesDto, + GlobalResourcesUpdateDto, +} from '@abp/ng.cms-kit/proxy'; + +@Component({ + selector: 'abp-global-resources', + imports: [ + CommonModule, + ReactiveFormsModule, + NgxValidateCoreModule, + NgbNavModule, + CodeMirrorEditorComponent, + LocalizationPipe, + PageComponent, + ButtonComponent, + ], + templateUrl: './global-resources.component.html', +}) +export class GlobalResourcesComponent implements OnInit { + private globalResourceService = inject(GlobalResourceAdminService); + private toasterService = inject(ToasterService); + private destroyRef = inject(DestroyRef); + + form: FormGroup; + activeTab: string = 'script'; + + ngOnInit() { + this.buildForm(); + this.loadGlobalResources(); + } + + private buildForm() { + this.form = new FormGroup({ + script: new FormControl(''), + style: new FormControl(''), + }); + } + + private loadGlobalResources() { + this.globalResourceService + .get() + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe({ + next: (result: GlobalResourcesDto) => { + this.form.patchValue({ + script: result.scriptContent || '', + style: result.styleContent || '', + }); + }, + error: () => { + this.toasterService.error('AbpUi::ErrorMessage'); + }, + }); + } + + onTabChange(activeId: string) { + this.activeTab = activeId; + } + + save() { + if (!this.form.valid) { + return; + } + + const formValue = this.form.value; + const input: GlobalResourcesUpdateDto = { + script: formValue.script || '', + style: formValue.style || '', + }; + + this.globalResourceService + .setGlobalResources(input) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe({ + next: () => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + }, + error: () => { + this.toasterService.error('AbpUi::ErrorMessage'); + }, + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/global-resources/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/global-resources/index.ts new file mode 100644 index 0000000000..abd1051ee6 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/global-resources/index.ts @@ -0,0 +1 @@ +export * from './global-resources.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/index.ts new file mode 100644 index 0000000000..99a6a9049c --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/index.ts @@ -0,0 +1,8 @@ +export * from './comments'; +export * from './tags'; +export * from './pages'; +export * from './blogs'; +export * from './blog-posts'; +export * from './menus'; +export * from './cms-settings'; +export * from './global-resources'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/menus/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/menus/index.ts new file mode 100644 index 0000000000..78600c1cef --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/menus/index.ts @@ -0,0 +1,2 @@ +export * from './menu-item-list/menu-item-list.component'; +export * from './menu-item-modal/menu-item-modal.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-list/menu-item-list.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-list/menu-item-list.component.html new file mode 100644 index 0000000000..11e2653aa6 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-list/menu-item-list.component.html @@ -0,0 +1,56 @@ + +
+
+ @if (nodes.length > 0) { + + + + + + + + } @else { +
+ {{ 'CmsKit::NoMenuItems' | abpLocalization }} +
+ } +
+
+
+ +@if (isModalVisible) { + +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-list/menu-item-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-list/menu-item-list.component.ts new file mode 100644 index 0000000000..5f687113f5 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-list/menu-item-list.component.ts @@ -0,0 +1,214 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { of } from 'rxjs'; +import { PageComponent } from '@abp/ng.components/page'; +import { ListService, LocalizationPipe, PermissionDirective } from '@abp/ng.core'; +import { TreeComponent } from '@abp/ng.components/tree'; +import { EXTENSIONS_IDENTIFIER } from '@abp/ng.components/extensible'; +import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; +import { + MenuItemAdminService, + MenuItemDto, + MenuItemWithDetailsDto, + MenuItemMoveInput, +} from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; +import { + MenuItemModalComponent, + MenuItemModalVisibleChange, +} from '../menu-item-modal/menu-item-modal.component'; + +@Component({ + selector: 'abp-menu-item-list', + templateUrl: './menu-item-list.component.html', + imports: [ + PageComponent, + TreeComponent, + LocalizationPipe, + CommonModule, + MenuItemModalComponent, + PermissionDirective, + ], + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.Menus, + }, + ], +}) +export class MenuItemListComponent implements OnInit { + private menuItemService = inject(MenuItemAdminService); + private confirmationService = inject(ConfirmationService); + + nodes: any[] = []; + selectedNode: MenuItemDto | null = null; + expandedKeys: string[] = []; + draggable = true; + isModalVisible = false; + selectedMenuItem: MenuItemDto | MenuItemWithDetailsDto | null = null; + parentId: string | null = null; + + ngOnInit() { + this.loadMenuItems(); + } + + private loadMenuItems() { + this.menuItemService.getList().subscribe(result => { + if (result.items && result.items.length > 0) { + this.nodes = this.buildTreeNodes(result.items); + // Expand all nodes by default + this.expandedKeys = this.nodes.map(n => n.key); + } else { + this.nodes = []; + } + }); + } + + private buildTreeNodes(items: MenuItemDto[]): any[] { + const nodeMap = new Map(); + const rootNodes: any[] = []; + + // First pass: create all nodes + items.forEach(item => { + const node: any = { + key: item.id, + title: item.displayName || '', + entity: item, + children: [], + isLeaf: false, + }; + nodeMap.set(item.id!, node); + }); + + // Second pass: build tree structure + items.forEach(item => { + const node = nodeMap.get(item.id!); + if (item.parentId) { + const parent = nodeMap.get(item.parentId); + if (parent) { + parent.children.push(node); + parent.isLeaf = false; + } else { + rootNodes.push(node); + } + } else { + rootNodes.push(node); + } + }); + + // Sort by order + const sortByOrder = (nodes: any[]) => { + nodes.sort((a, b) => (a.entity.order || 0) - (b.entity.order || 0)); + nodes.forEach(node => { + if (node.children && node.children.length > 0) { + sortByOrder(node.children); + } + }); + }; + + sortByOrder(rootNodes); + return rootNodes; + } + + onSelectedNodeChange(node: any) { + this.selectedNode = node?.entity || null; + } + + onDrop(event: any) { + const node = event.dragNode?.origin?.entity; + if (!node) { + return; + } + + const newParentId = event.dragNode?.parent?.key === '0' ? null : event.dragNode?.parent?.key; + const position = event.dragNode?.pos || 0; + + const parentNodeName = + !newParentId || newParentId === '0' + ? 'Root' + : event.dragNode?.parent?.origin?.entity?.displayName || 'Root'; + + this.confirmationService + .warn('CmsKit::MenuItemMoveConfirmMessage', 'AbpUi::AreYouSure', { + messageLocalizationParams: [node.displayName || '', parentNodeName], + yesText: 'AbpUi::Yes', + cancelText: 'AbpUi::Cancel', + }) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + const input: MenuItemMoveInput = { + newParentId: newParentId === '0' ? null : newParentId, + position: position, + }; + + this.menuItemService.moveMenuItem(node.id!, input).subscribe({ + next: () => { + this.loadMenuItems(); + }, + error: () => { + // Reload to rollback + this.loadMenuItems(); + }, + }); + } else { + // Reload to rollback + this.loadMenuItems(); + } + }); + } + + beforeDrop = (event: any) => { + return of(true); + }; + + add() { + this.selectedMenuItem = null; + this.parentId = null; + this.isModalVisible = true; + } + + addSubMenuItem(parentId?: string) { + this.selectedMenuItem = null; + this.parentId = parentId || null; + this.isModalVisible = true; + } + + edit(id: string) { + this.menuItemService.get(id).subscribe(menuItem => { + this.selectedMenuItem = menuItem; + this.parentId = null; + this.isModalVisible = true; + }); + } + + onVisibleModalChange(visibilityChange: MenuItemModalVisibleChange) { + if (visibilityChange.visible) { + return; + } + if (visibilityChange.refresh) { + this.loadMenuItems(); + } + this.selectedMenuItem = null; + this.parentId = null; + this.isModalVisible = false; + } + + delete(id: string, displayName?: string) { + this.confirmationService + .warn('CmsKit::MenuItemDeletionConfirmationMessage', 'AbpUi::AreYouSure', { + messageLocalizationParams: [displayName || ''], + yesText: 'AbpUi::Yes', + cancelText: 'AbpUi::Cancel', + }) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + this.menuItemService.delete(id).subscribe({ + next: () => { + this.loadMenuItems(); + }, + }); + } + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-modal/menu-item-modal.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-modal/menu-item-modal.component.html new file mode 100644 index 0000000000..4802a4e570 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-modal/menu-item-modal.component.html @@ -0,0 +1,127 @@ + + +

+ @if (selected()?.id) { + {{ 'AbpUi::Edit' | abpLocalization }} + } @else { + {{ 'AbpUi::New' | abpLocalization }} + } +

+
+ + + @if (form) { +
+ +
+
+ + + } +
+ + + + + {{ 'AbpUi::Save' | abpLocalization }} + + +
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-modal/menu-item-modal.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-modal/menu-item-modal.component.ts new file mode 100644 index 0000000000..333cd1a564 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/menus/menu-item-modal/menu-item-modal.component.ts @@ -0,0 +1,399 @@ +import { Component, OnInit, inject, Injector, input, output, DestroyRef } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule, FormGroup, FormControl, FormsModule } from '@angular/forms'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { NgbNavModule, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { forkJoin, Subject } from 'rxjs'; +import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; +import { LocalizationPipe } from '@abp/ng.core'; +import { + ExtensibleFormComponent, + FormPropData, + generateFormFromProps, +} from '@abp/ng.components/extensible'; +import { + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ToasterService, +} from '@abp/ng.theme.shared'; +import { dasharize } from '@abp/ng.cms-kit'; +import { + MenuItemAdminService, + MenuItemDto, + MenuItemWithDetailsDto, + MenuItemCreateInput, + MenuItemUpdateInput, + PageLookupDto, +} from '@abp/ng.cms-kit/proxy'; + +export interface MenuItemModalVisibleChange { + visible: boolean; + refresh: boolean; +} + +// Constants +const PAGE_LOOKUP_MAX_RESULT = 1000; +const PAGE_SEARCH_MAX_RESULT = 100; +const PAGE_SEARCH_DEBOUNCE_MS = 300; +const TABS = { + URL: 'url', + PAGE: 'page', +} as const; + +@Component({ + selector: 'abp-menu-item-modal', + templateUrl: './menu-item-modal.component.html', + imports: [ + ExtensibleFormComponent, + LocalizationPipe, + ReactiveFormsModule, + CommonModule, + NgxValidateCoreModule, + ModalComponent, + ModalCloseDirective, + ButtonComponent, + NgbNavModule, + NgbDropdownModule, + FormsModule, + ], + styles: [ + ` + .dropdown-toggle::after { + display: none !important; + } + `, + ], +}) +export class MenuItemModalComponent implements OnInit { + // Injected services + private readonly menuItemService = inject(MenuItemAdminService); + private readonly injector = inject(Injector); + private readonly toasterService = inject(ToasterService); + private readonly destroyRef = inject(DestroyRef); + + // Inputs/Outputs + readonly selected = input(); + readonly parentId = input(); + readonly visible = input(true); + readonly visibleChange = output(); + + // Form state + form: FormGroup; + activeTab: string = TABS.URL; + + // Page selection state + pages: PageLookupDto[] = []; + selectedPage: PageLookupDto | null = null; + pageSearchText: string = ''; + filteredPages: PageLookupDto[] = []; + + // Search subject for debouncing + private readonly pageSearchSubject = new Subject(); + + get isPageSelected(): boolean { + return !!this.form?.get('pageId')?.value; + } + + ngOnInit() { + this.setupPageSearch(); + this.initializeComponent(); + } + + /** + * Sets up debounced page search functionality + */ + private setupPageSearch(): void { + this.pageSearchSubject + .pipe( + debounceTime(PAGE_SEARCH_DEBOUNCE_MS), + distinctUntilChanged(), + switchMap(searchText => { + if (!searchText?.trim()) { + // Show all pages when search is cleared + return this.menuItemService.getPageLookup({ maxResultCount: PAGE_LOOKUP_MAX_RESULT }); + } + return this.menuItemService.getPageLookup({ + filter: searchText.trim(), + maxResultCount: PAGE_SEARCH_MAX_RESULT, + }); + }), + takeUntilDestroyed(this.destroyRef), + ) + .subscribe({ + next: result => { + this.filteredPages = result.items || []; + }, + error: () => { + this.filteredPages = []; + }, + }); + } + + /** + * Initializes the component based on create or edit mode + */ + private initializeComponent(): void { + const selectedItem = this.selected(); + + if (selectedItem?.id) { + this.loadMenuItemForEdit(selectedItem.id); + } else { + this.loadPagesForCreate(); + this.buildForm(); + } + } + + /** + * Loads menu item data and pages for edit mode + */ + private loadMenuItemForEdit(menuItemId: string): void { + forkJoin({ + menuItem: this.menuItemService.get(menuItemId), + pages: this.menuItemService.getPageLookup({ maxResultCount: PAGE_LOOKUP_MAX_RESULT }), + }) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe({ + next: ({ menuItem, pages }) => { + this.pages = pages.items || []; + this.filteredPages = this.pages; + this.buildForm(menuItem); + this.initializePageSelection(menuItem); + }, + error: () => { + this.toasterService.error('AbpUi::ErrorMessage'); + }, + }); + } + + /** + * Loads pages for create mode + */ + private loadPagesForCreate(): void { + this.menuItemService + .getPageLookup({ maxResultCount: PAGE_LOOKUP_MAX_RESULT }) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe({ + next: result => { + this.pages = result.items || []; + this.filteredPages = this.pages; + }, + error: () => { + this.toasterService.error('AbpUi::ErrorMessage'); + }, + }); + } + + /** + * Initializes page selection when editing a menu item with a page + */ + private initializePageSelection(menuItem: MenuItemWithDetailsDto | MenuItemDto): void { + if (menuItem.pageId) { + this.activeTab = TABS.PAGE; + this.selectedPage = this.pages.find(p => p.id === menuItem.pageId) || null; + + const url = this.selectedPage + ? this.generateUrlFromPage(this.selectedPage) + : menuItem.url || ''; + this.form.patchValue({ pageId: menuItem.pageId, url }, { emitEvent: false }); + this.pageSearchText = this.selectedPage?.title || ''; + } else if (menuItem.url) { + this.activeTab = TABS.URL; + this.form.patchValue({ url: menuItem.url, pageId: null }, { emitEvent: false }); + } + } + + /** + * Generates a URL from a page's slug or title + */ + private generateUrlFromPage(page: PageLookupDto): string { + if (!page) return ''; + + const source = page.slug || page.title; + if (!source) return ''; + + return '/' + dasharize(source); + } + + /** + * Handles page search input changes + */ + onPageSearchChange(searchText: string): void { + this.pageSearchText = searchText; + if (!searchText?.trim()) { + this.filteredPages = this.pages; + return; + } + this.pageSearchSubject.next(searchText); + } + + /** + * Handles dropdown open event + */ + onDropdownOpen(): void { + if (!this.pageSearchText?.trim()) { + this.filteredPages = this.pages; + } + } + + /** + * Handles page selection from dropdown + */ + selectPage(page: PageLookupDto): void { + if (!page) return; + + this.selectedPage = page; + const url = this.generateUrlFromPage(page); + + this.form.patchValue({ pageId: page.id, url }, { emitEvent: false }); + this.pageSearchText = page.title || ''; + } + + /** + * Clears the selected page + */ + clearPageSelection(): void { + this.form.patchValue({ pageId: null }, { emitEvent: false }); + this.selectedPage = null; + this.pageSearchText = ''; + this.filteredPages = this.pages; + } + + /** + * Builds the reactive form for menu item creation/editing + */ + private buildForm(menuItem?: MenuItemWithDetailsDto | MenuItemDto): void { + const data = new FormPropData(this.injector, menuItem || {}); + const baseForm = generateFormFromProps(data); + const parentId = this.parentId() || menuItem?.parentId || null; + + this.form = new FormGroup({ + ...baseForm.controls, + url: new FormControl(menuItem?.url || ''), + pageId: new FormControl(menuItem?.pageId || null), + parentId: new FormControl(parentId), + }); + + this.loadAvailableOrder(parentId, menuItem?.id); + } + + /** + * Loads the available menu order for new menu items + */ + private loadAvailableOrder(parentId: string | null, menuItemId?: string): void { + if (menuItemId) return; // Only needed for new items + + const order$ = parentId + ? this.menuItemService.getAvailableMenuOrder(parentId) + : this.menuItemService.getAvailableMenuOrder(); + + order$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({ + next: order => { + this.form.patchValue({ order }); + }, + }); + } + + /** + * Handles modal visibility changes + */ + onVisibleChange(visible: boolean, refresh = false): void { + this.visibleChange.emit({ visible, refresh }); + } + + /** + * Handles tab changes + */ + onTabChange(activeId: string): void { + this.activeTab = activeId; + } + + /** + * Handles URL input changes - clears page selection if URL is manually entered + */ + onUrlInput(): void { + const urlValue = this.form.get('url')?.value; + if (urlValue && this.form.get('pageId')?.value) { + this.clearPageSelection(); + if (this.activeTab === TABS.PAGE) { + this.activeTab = TABS.URL; + } + } + } + + /** + * Saves the menu item (create or update) + */ + save(): void { + if (!this.form.valid) { + return; + } + + const formValue = this.prepareFormValue(); + const selectedItem = this.selected(); + const isEditMode = !!selectedItem?.id; + + const observable$ = isEditMode + ? this.updateMenuItem(selectedItem.id, formValue, selectedItem as MenuItemWithDetailsDto) + : this.createMenuItem(formValue); + + observable$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({ + next: () => { + this.onVisibleChange(false, true); + this.toasterService.success('AbpUi::SavedSuccessfully'); + }, + error: () => { + this.toasterService.error('AbpUi::ErrorMessage'); + }, + }); + } + + /** + * Prepares form value ensuring mutual exclusivity between pageId and url + */ + private prepareFormValue(): Partial { + const formValue = { ...this.form.value }; + + if (formValue.pageId) { + // If pageId is set, generate URL from the page + const selectedPage = this.pages.find(p => p.id === formValue.pageId); + if (selectedPage) { + formValue.url = this.generateUrlFromPage(selectedPage); + } + } else if (formValue.url) { + // If URL is manually entered, ensure pageId is cleared + formValue.pageId = null; + } + + // Clean up undefined values + return { + ...formValue, + url: formValue.url || undefined, + pageId: formValue.pageId || undefined, + }; + } + + /** + * Creates a new menu item + */ + private createMenuItem(formValue: Partial) { + const createInput: MenuItemCreateInput = formValue as MenuItemCreateInput; + return this.menuItemService.create(createInput); + } + + /** + * Updates an existing menu item + */ + private updateMenuItem( + id: string, + formValue: Partial, + selectedItem: MenuItemWithDetailsDto, + ) { + const updateInput: MenuItemUpdateInput = { + ...formValue, + concurrencyStamp: selectedItem.concurrencyStamp, + } as MenuItemUpdateInput; + return this.menuItemService.update(id, updateInput); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/pages/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/index.ts new file mode 100644 index 0000000000..c2665da015 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/index.ts @@ -0,0 +1,2 @@ +export * from './page-list/page-list.component'; +export * from './page-form/page-form.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-form/page-form.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-form/page-form.component.html new file mode 100644 index 0000000000..0dc5c4a296 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-form/page-form.component.html @@ -0,0 +1,57 @@ + +
+
+ @if (form && (!isEditMode || page)) { +
+ + + + + +
+ + } @else { +
+ +
+ } +
+ +
+
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-form/page-form.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-form/page-form.component.ts new file mode 100644 index 0000000000..49e75cdaaa --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-form/page-form.component.ts @@ -0,0 +1,134 @@ +import { Component, OnInit, inject, Injector, DestroyRef } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { LocalizationPipe } from '@abp/ng.core'; +import { + ExtensibleFormComponent, + FormPropData, + generateFormFromProps, + EXTENSIONS_IDENTIFIER, +} from '@abp/ng.components/extensible'; +import { PageComponent } from '@abp/ng.components/page'; +import { ButtonComponent } from '@abp/ng.theme.shared'; +import { + ToastuiEditorComponent, + CodeMirrorEditorComponent, + prepareSlugFromControl, +} from '@abp/ng.cms-kit'; +import { PageAdminService, PageDto } from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; +import { PageFormService } from '../../../services'; + +@Component({ + selector: 'abp-page-form', + templateUrl: './page-form.component.html', + providers: [ + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.PageForm, + }, + ], + imports: [ + ButtonComponent, + CodeMirrorEditorComponent, + ExtensibleFormComponent, + PageComponent, + ToastuiEditorComponent, + LocalizationPipe, + ReactiveFormsModule, + CommonModule, + NgxValidateCoreModule, + NgbNavModule, + ], +}) +export class PageFormComponent implements OnInit { + private pageService = inject(PageAdminService); + private injector = inject(Injector); + private pageFormService = inject(PageFormService); + private route = inject(ActivatedRoute); + private destroyRef = inject(DestroyRef); + + form: FormGroup; + page: PageDto | null = null; + pageId: string | null = null; + isEditMode = false; + + ngOnInit() { + const id = this.route.snapshot.params['id']; + if (id) { + this.isEditMode = true; + this.pageId = id; + this.loadPage(id); + } else { + this.isEditMode = false; + this.buildForm(); + } + } + + private loadPage(id: string) { + this.pageService.get(id).subscribe(page => { + this.page = page; + this.buildForm(); + }); + } + + private buildForm() { + const data = new FormPropData(this.injector, this.page || {}); + const baseForm = generateFormFromProps(data); + this.form = new FormGroup({ + ...baseForm.controls, + content: new FormControl(this.page?.content || ''), + script: new FormControl(this.page?.script || ''), + style: new FormControl(this.page?.style || ''), + }); + prepareSlugFromControl(this.form, 'title', 'slug', this.destroyRef); + } + + private executeSaveOperation(operation: 'save' | 'draft' | 'publish') { + if (this.isEditMode) { + if (!this.page || !this.pageId) { + return; + } + + switch (operation) { + case 'save': + this.pageFormService.update(this.pageId, this.form, this.page).subscribe(); + break; + case 'draft': + this.pageFormService.updateAsDraft(this.pageId, this.form, this.page).subscribe(); + break; + case 'publish': + this.pageFormService.updateAndPublish(this.pageId, this.form, this.page).subscribe(); + break; + } + return; + } + + switch (operation) { + case 'save': + this.pageFormService.create(this.form).subscribe(); + break; + case 'draft': + this.pageFormService.createAsDraft(this.form).subscribe(); + break; + case 'publish': + this.pageFormService.publish(this.form).subscribe(); + break; + } + } + + save() { + this.executeSaveOperation('save'); + } + + saveAsDraft() { + this.executeSaveOperation('draft'); + } + + publish() { + this.executeSaveOperation('publish'); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-list/page-list.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-list/page-list.component.html new file mode 100644 index 0000000000..3f87c51b2b --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-list/page-list.component.html @@ -0,0 +1,26 @@ + +
+
+
+
+
+ + +
+
+
+
+
+ +
+ +
+
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-list/page-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-list/page-list.component.ts new file mode 100644 index 0000000000..1537618a86 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/pages/page-list/page-list.component.ts @@ -0,0 +1,85 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { ListService, PagedResultDto, LocalizationPipe } from '@abp/ng.core'; +import { ExtensibleTableComponent, EXTENSIONS_IDENTIFIER } from '@abp/ng.components/extensible'; +import { Confirmation, ConfirmationService, ToasterService } from '@abp/ng.theme.shared'; +import { PageComponent } from '@abp/ng.components/page'; +import { PageAdminService, GetPagesInputDto, PageDto } from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; + +@Component({ + selector: 'abp-page-list', + templateUrl: './page-list.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.Pages, + }, + ], + imports: [ExtensibleTableComponent, PageComponent, LocalizationPipe, FormsModule, CommonModule], +}) +export class PageListComponent implements OnInit { + data: PagedResultDto = { items: [], totalCount: 0 }; + + public readonly list = inject(ListService); + private pageService = inject(PageAdminService); + private confirmationService = inject(ConfirmationService); + private toasterService = inject(ToasterService); + + filter = ''; + + ngOnInit() { + this.hookToQuery(); + } + + onSearch() { + this.list.filter = this.filter; + this.list.get(); + } + + private hookToQuery() { + this.list + .hookToQuery(query => { + let filters: Partial = {}; + if (this.list.filter) { + filters.filter = this.list.filter; + } + const input: GetPagesInputDto = { + ...query, + ...filters, + }; + return this.pageService.getList(input); + }) + .subscribe(res => { + this.data = res; + }); + } + + delete(id: string) { + this.confirmationService + .warn('CmsKit::PageDeletionConfirmationMessage', 'AbpUi::AreYouSure', { + yesText: 'AbpUi::Yes', + cancelText: 'AbpUi::Cancel', + }) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + this.pageService.delete(id).subscribe(() => { + this.list.get(); + }); + } + }); + } + + setAsHomePage(id: string, isHomePage: boolean) { + this.pageService.setAsHomePage(id).subscribe(() => { + this.list.get(); + if (isHomePage) { + this.toasterService.warn('CmsKit::RemovedSettingAsHomePage'); + } else { + this.toasterService.success('CmsKit::CompletedSettingAsHomePage'); + } + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/tags/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/index.ts new file mode 100644 index 0000000000..02b1f281a8 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/index.ts @@ -0,0 +1,2 @@ +export * from './tag-list/tag-list.component'; +export * from './tag-modal/tag-modal.component'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.html new file mode 100644 index 0000000000..da770aa36b --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.html @@ -0,0 +1,30 @@ + +
+
+
+
+
+ + +
+
+
+
+
+ +
+ +
+ + @if (isModalVisible) { + + } +
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.ts new file mode 100644 index 0000000000..ab455edbd7 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-list/tag-list.component.ts @@ -0,0 +1,113 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { ListService, PagedResultDto, LocalizationPipe } from '@abp/ng.core'; +import { ExtensibleTableComponent, EXTENSIONS_IDENTIFIER } from '@abp/ng.components/extensible'; +import { PageComponent } from '@abp/ng.components/page'; +import { Confirmation, ConfirmationService } from '@abp/ng.theme.shared'; +import { TagAdminService, TagGetListInput, TagDto, TagDefinitionDto } from '@abp/ng.cms-kit/proxy'; +import { eCmsKitAdminComponents } from '../../../enums'; +import { TagModalComponent, TagModalVisibleChange } from '../tag-modal/tag-modal.component'; + +@Component({ + selector: 'abp-tag-list', + templateUrl: './tag-list.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.Tags, + }, + ], + imports: [ + ExtensibleTableComponent, + PageComponent, + LocalizationPipe, + FormsModule, + CommonModule, + TagModalComponent, + ], +}) +export class TagListComponent implements OnInit { + data: PagedResultDto = { items: [], totalCount: 0 }; + + public readonly list = inject(ListService); + private tagService = inject(TagAdminService); + private confirmationService = inject(ConfirmationService); + + filter = ''; + isModalVisible = false; + selected?: TagDto; + tagDefinitions: TagDefinitionDto[] = []; + + ngOnInit() { + this.loadTagDefinitions(); + this.hookToQuery(); + } + + private loadTagDefinitions() { + this.tagService.getTagDefinitions().subscribe(definitions => { + this.tagDefinitions = definitions; + }); + } + + onSearch() { + this.list.filter = this.filter; + this.list.get(); + } + + add() { + this.selected = {} as TagDto; + this.isModalVisible = true; + } + + edit(id: string) { + this.tagService.get(id).subscribe(tag => { + this.selected = tag; + this.isModalVisible = true; + }); + } + + private hookToQuery() { + this.list + .hookToQuery(query => { + let filters: Partial = {}; + if (this.list.filter) { + filters.filter = this.list.filter; + } + const input: TagGetListInput = { + ...query, + ...filters, + }; + return this.tagService.getList(input); + }) + .subscribe(res => { + this.data = res; + }); + } + + onVisibleModalChange(visibilityChange: TagModalVisibleChange) { + if (visibilityChange.visible) { + return; + } + if (visibilityChange.refresh) { + this.list.get(); + } + this.selected = null; + this.isModalVisible = false; + } + + delete(id: string, name: string) { + this.confirmationService + .warn('CmsKit::TagDeletionConfirmationMessage', 'AbpUi::AreYouSure', { + messageLocalizationParams: [name], + }) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + this.tagService.delete(id).subscribe(() => { + this.list.get(); + }); + } + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.html b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.html new file mode 100644 index 0000000000..cb9d4d1e91 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.html @@ -0,0 +1,28 @@ + + +

+ {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }} +

+
+ + + @if (form) { +
+ + + } @else { +
+ +
+ } +
+ + + + + {{ 'AbpUi::Save' | abpLocalization }} + + +
diff --git a/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.ts b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.ts new file mode 100644 index 0000000000..da58a74409 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/components/tags/tag-modal/tag-modal.component.ts @@ -0,0 +1,84 @@ +import { Component, OnInit, inject, Injector, input, output } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule, FormGroup } from '@angular/forms'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { LocalizationPipe } from '@abp/ng.core'; +import { + ExtensibleFormComponent, + FormPropData, + generateFormFromProps, +} from '@abp/ng.components/extensible'; +import { + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ToasterService, +} from '@abp/ng.theme.shared'; +import { TagAdminService, TagDto, TagCreateDto, TagUpdateDto } from '@abp/ng.cms-kit/proxy'; + +export interface TagModalVisibleChange { + visible: boolean; + refresh: boolean; +} + +@Component({ + selector: 'abp-tag-modal', + templateUrl: './tag-modal.component.html', + imports: [ + ExtensibleFormComponent, + LocalizationPipe, + ReactiveFormsModule, + CommonModule, + NgxValidateCoreModule, + ModalComponent, + ModalCloseDirective, + ButtonComponent, + ], +}) +export class TagModalComponent implements OnInit { + private tagService = inject(TagAdminService); + private injector = inject(Injector); + private toasterService = inject(ToasterService); + + selected = input(); + sectionId = input(); + visibleChange = output(); + + form: FormGroup; + + ngOnInit() { + this.buildForm(); + } + + private buildForm() { + const data = new FormPropData(this.injector, this.selected()); + this.form = generateFormFromProps(data); + } + + onVisibleChange(visible: boolean, refresh = false) { + this.visibleChange.emit({ visible, refresh }); + } + + save() { + if (!this.form.valid) { + return; + } + + let observable$ = this.tagService.create(this.form.value as TagCreateDto); + + const selectedTag = this.selected(); + const { id } = selectedTag || {}; + + if (id) { + observable$ = this.tagService.update(id, { + ...selectedTag, + ...this.form.value, + } as TagUpdateDto); + } + + observable$.subscribe(() => { + this.onVisibleChange(false, true); + this.toasterService.success('AbpUi::SavedSuccessfully'); + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-create-form-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-create-form-props.ts new file mode 100644 index 0000000000..c33568d794 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-create-form-props.ts @@ -0,0 +1,51 @@ +import { Validators } from '@angular/forms'; +import { map } from 'rxjs/operators'; +import { CreateBlogPostDto, BlogAdminService } from '@abp/ng.cms-kit/proxy'; +import { FormProp, ePropType } from '@abp/ng.components/extensible'; + +export const DEFAULT_BLOG_POST_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.Enum, + name: 'blogId', + displayName: 'CmsKit::Blog', + id: 'blogId', + options: data => { + const blogService = data.getInjected(BlogAdminService); + return blogService.getList({ maxResultCount: 1000 }).pipe( + map(result => + result.items.map(blog => ({ + key: blog.name || '', + value: blog.id || '', + })), + ), + ); + }, + validators: () => [Validators.required], + }, + { + type: ePropType.String, + name: 'title', + displayName: 'CmsKit::Title', + id: 'title', + validators: () => [Validators.required], + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + id: 'slug', + validators: () => [Validators.required], + tooltip: { + text: 'CmsKit::BlogPostSlugInformation', + }, + }, + { + type: ePropType.String, + name: 'shortDescription', + displayName: 'CmsKit::ShortDescription', + id: 'shortDescription', + }, +]); + +export const DEFAULT_BLOG_POST_EDIT_FORM_PROPS: FormProp[] = + DEFAULT_BLOG_POST_CREATE_FORM_PROPS; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-actions.ts new file mode 100644 index 0000000000..22e51b3cf0 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-actions.ts @@ -0,0 +1,23 @@ +import { Router } from '@angular/router'; +import { EntityAction } from '@abp/ng.components/extensible'; +import { BlogPostListDto } from '@abp/ng.cms-kit/proxy'; +import { BlogPostListComponent } from '../../components/blog-posts/blog-post-list/blog-post-list.component'; + +export const DEFAULT_BLOG_POST_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'AbpUi::Edit', + action: data => { + const router = data.getInjected(Router); + router.navigate(['/cms/blog-posts/update', data.record.id]); + }, + permission: 'CmsKit.BlogPosts.Update', + }, + { + text: 'AbpUi::Delete', + action: data => { + const component = data.getInjected(BlogPostListComponent); + component.delete(data.record.id!, data.record.title!); + }, + permission: 'CmsKit.BlogPosts.Delete', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-props.ts new file mode 100644 index 0000000000..070fe631e3 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-entity-props.ts @@ -0,0 +1,65 @@ +import { of } from 'rxjs'; +import { BlogPostListDto, BlogPostStatus } from '@abp/ng.cms-kit/proxy'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; +import { LocalizationService } from '@abp/ng.core'; + +export const DEFAULT_BLOG_POST_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'blogName', + displayName: 'CmsKit::Blog', + sortable: true, + columnWidth: 150, + }, + { + type: ePropType.String, + name: 'title', + displayName: 'CmsKit::Title', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.String, + name: 'status', + displayName: 'CmsKit::Status', + sortable: true, + columnWidth: 120, + valueResolver: data => { + const localization = data.getInjected(LocalizationService); + let result = ''; + switch (data.record.status) { + case BlogPostStatus.Draft: + result = localization.instant('CmsKit::CmsKit.BlogPost.Status.0'); + break; + case BlogPostStatus.Published: + result = localization.instant('CmsKit::CmsKit.BlogPost.Status.1'); + break; + case BlogPostStatus.WaitingForReview: + result = localization.instant('CmsKit::CmsKit.BlogPost.Status.2'); + break; + } + return of(result); + }, + }, + { + type: ePropType.Date, + name: 'creationTime', + displayName: 'AbpIdentity::CreationTime', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.Date, + name: 'lastModificationTime', + displayName: 'AbpIdentity::LastModificationTime', + sortable: true, + columnWidth: 200, + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-toolbar-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-toolbar-actions.ts new file mode 100644 index 0000000000..f0ed51f137 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/default-blog-post-toolbar-actions.ts @@ -0,0 +1,15 @@ +import { Router } from '@angular/router'; +import { BlogPostListDto } from '@abp/ng.cms-kit/proxy'; +import { ToolbarAction } from '@abp/ng.components/extensible'; + +export const DEFAULT_BLOG_POST_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'CmsKit::NewBlogPost', + action: data => { + const router = data.getInjected(Router); + router.navigate(['/cms/blog-posts/create']); + }, + permission: 'CmsKit.BlogPosts.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/index.ts new file mode 100644 index 0000000000..4ac9786452 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blog-posts/index.ts @@ -0,0 +1,4 @@ +export * from './default-blog-post-entity-actions'; +export * from './default-blog-post-entity-props'; +export * from './default-blog-post-toolbar-actions'; +export * from './default-blog-post-create-form-props'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-create-form-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-create-form-props.ts new file mode 100644 index 0000000000..c8e28f03bf --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-create-form-props.ts @@ -0,0 +1,26 @@ +import { CreateBlogDto } from '@abp/ng.cms-kit/proxy'; +import { FormProp, ePropType } from '@abp/ng.components/extensible'; +import { Validators } from '@angular/forms'; + +export const DEFAULT_BLOG_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.String, + name: 'name', + displayName: 'CmsKit::Name', + id: 'name', + validators: () => [Validators.required], + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + id: 'slug', + validators: () => [Validators.required], + tooltip: { + text: 'CmsKit::BlogSlugInformation', + // params: ['blogs'], + }, + }, +]); + +export const DEFAULT_BLOG_EDIT_FORM_PROPS = DEFAULT_BLOG_CREATE_FORM_PROPS; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-actions.ts new file mode 100644 index 0000000000..b39d510b36 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-actions.ts @@ -0,0 +1,30 @@ +import { BlogDto } from '@abp/ng.cms-kit/proxy'; +import { EntityAction } from '@abp/ng.components/extensible'; +import { BlogListComponent } from '../../components/blogs/blog-list/blog-list.component'; + +export const DEFAULT_BLOG_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'CmsKit::Features', + action: data => { + const component = data.getInjected(BlogListComponent); + component.openFeatures(data.record.id!); + }, + permission: 'CmsKit.Blogs.Features', + }, + { + text: 'AbpUi::Edit', + action: data => { + const component = data.getInjected(BlogListComponent); + component.edit(data.record.id!); + }, + permission: 'CmsKit.Blogs.Update', + }, + { + text: 'AbpUi::Delete', + action: data => { + const component = data.getInjected(BlogListComponent); + component.delete(data.record.id!, data.record.name!); + }, + permission: 'CmsKit.Blogs.Delete', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-props.ts new file mode 100644 index 0000000000..d3b2a3c30e --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-entity-props.ts @@ -0,0 +1,19 @@ +import { BlogDto } from '@abp/ng.cms-kit/proxy'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; + +export const DEFAULT_BLOG_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'name', + displayName: 'CmsKit::Name', + sortable: true, + columnWidth: 250, + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + sortable: true, + columnWidth: 250, + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-toolbar-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-toolbar-actions.ts new file mode 100644 index 0000000000..221c93fea5 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/default-blog-toolbar-actions.ts @@ -0,0 +1,15 @@ +import { BlogDto } from '@abp/ng.cms-kit/proxy'; +import { ToolbarAction } from '@abp/ng.components/extensible'; +import { BlogListComponent } from '../../components/blogs/blog-list/blog-list.component'; + +export const DEFAULT_BLOG_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'CmsKit::NewBlog', + action: data => { + const component = data.getInjected(BlogListComponent); + component.add(); + }, + permission: 'CmsKit.Blogs.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/index.ts new file mode 100644 index 0000000000..8755ff0675 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/blogs/index.ts @@ -0,0 +1,4 @@ +export * from './default-blog-entity-actions'; +export * from './default-blog-entity-props'; +export * from './default-blog-toolbar-actions'; +export * from './default-blog-create-form-props'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/comments/default-comment-entity-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/comments/default-comment-entity-actions.ts new file mode 100644 index 0000000000..ec49f544a6 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/comments/default-comment-entity-actions.ts @@ -0,0 +1,51 @@ +import { Router } from '@angular/router'; +import { CommentGetListInput, CommentWithAuthorDto } from '@abp/ng.cms-kit/proxy'; +import { ListService } from '@abp/ng.core'; +import { EntityAction } from '@abp/ng.components/extensible'; +import { CommentEntityService } from '../../services'; + +export const DEFAULT_COMMENT_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'CmsKit::Details', + action: data => { + const router = data.getInjected(Router); + router.navigate(['/cms/comments', data.record.id]); + }, + }, + { + text: 'CmsKit::Delete', + action: data => { + const commentEntityService = data.getInjected(CommentEntityService); + const list = data.getInjected(ListService); + commentEntityService.delete(data.record.id!, list); + }, + permission: 'CmsKit.Comments.Delete', + }, + { + text: 'CmsKit::Approve', + action: data => { + const commentEntityService = data.getInjected(CommentEntityService); + const list = data.getInjected(ListService); + commentEntityService.updateApprovalStatus(data.record.id!, true, list); + }, + visible: data => { + const commentEntityService = data.getInjected(CommentEntityService); + return commentEntityService.requireApprovement && data.record.isApproved === false; + }, + }, + { + text: 'CmsKit::Disapproved', + action: data => { + const commentEntityService = data.getInjected(CommentEntityService); + const list = data.getInjected(ListService); + commentEntityService.updateApprovalStatus(data.record.id!, false, list); + }, + visible: data => { + const commentEntityService = data.getInjected(CommentEntityService); + return ( + commentEntityService.requireApprovement && + (data.record.isApproved || data.record.isApproved === null) + ); + }, + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/comments/default-comment-entity-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/comments/default-comment-entity-props.ts new file mode 100644 index 0000000000..4abf9cef73 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/comments/default-comment-entity-props.ts @@ -0,0 +1,79 @@ +import { of } from 'rxjs'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; +import { CommentWithAuthorDto } from '@abp/ng.cms-kit/proxy'; +import { CommentEntityService } from '../../services'; + +export const DEFAULT_COMMENT_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'userName', + displayName: 'CmsKit::Username', + sortable: false, + columnWidth: 150, + valueResolver: data => { + const userName = data.record.author.userName; + return of(userName); + }, + }, + { + type: ePropType.String, + name: 'entityType', + displayName: 'CmsKit::EntityType', + sortable: false, + columnWidth: 200, + }, + { + type: ePropType.String, + name: 'url', + displayName: 'CmsKit::URL', + sortable: false, + valueResolver: data => { + const url = data.record.url; + if (url) { + return of( + ``, + ); + } + return of(''); + }, + }, + { + type: ePropType.String, + name: 'text', + displayName: 'CmsKit::Text', + sortable: false, + valueResolver: data => { + const text = data.record.text || ''; + const maxChars = 64; + if (text.length > maxChars) { + return of(text.substring(0, maxChars) + '...'); + } + return of(text); + }, + }, + { + type: ePropType.String, + name: 'isApproved', + displayName: 'CmsKit::ApproveState', + sortable: false, + columnWidth: 100, + columnVisible: getInjected => { + const commentEntityService = getInjected(CommentEntityService); + return commentEntityService.requireApprovement; + }, + valueResolver: data => { + const isApproved = data.record.isApproved; + if (isApproved || isApproved === null) { + return of('
'); + } + return of('
'); + }, + }, + { + type: ePropType.Date, + name: 'creationTime', + displayName: 'CmsKit::CreationTime', + sortable: true, + columnWidth: 200, + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/comments/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/comments/index.ts new file mode 100644 index 0000000000..48599b1647 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/comments/index.ts @@ -0,0 +1,2 @@ +export * from './default-comment-entity-actions'; +export * from './default-comment-entity-props'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/index.ts new file mode 100644 index 0000000000..efa8d5e5d8 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/index.ts @@ -0,0 +1,6 @@ +export * from './comments'; +export * from './tags'; +export * from './pages'; +export * from './blogs'; +export * from './blog-posts'; +export * from './menus'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/menus/default-menu-item-create-form-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/menus/default-menu-item-create-form-props.ts new file mode 100644 index 0000000000..102b3ab516 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/menus/default-menu-item-create-form-props.ts @@ -0,0 +1,72 @@ +import { Validators } from '@angular/forms'; +import { map } from 'rxjs/operators'; +import { + MenuItemCreateInput, + MenuItemAdminService, + PermissionLookupDto, +} from '@abp/ng.cms-kit/proxy'; +import { FormProp, ePropType } from '@abp/ng.components/extensible'; + +export const DEFAULT_MENU_ITEM_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.String, + name: 'displayName', + displayName: 'CmsKit::DisplayName', + id: 'displayName', + validators: () => [Validators.required], + }, + { + type: ePropType.Boolean, + name: 'isActive', + displayName: 'CmsKit::IsActive', + id: 'isActive', + defaultValue: true, + }, + { + type: ePropType.String, + name: 'icon', + displayName: 'CmsKit::Icon', + id: 'icon', + }, + { + type: ePropType.String, + name: 'target', + displayName: 'CmsKit::Target', + id: 'target', + }, + { + type: ePropType.String, + name: 'elementId', + displayName: 'CmsKit::ElementId', + id: 'elementId', + }, + { + type: ePropType.String, + name: 'cssClass', + displayName: 'CmsKit::CssClass', + id: 'cssClass', + }, + { + type: ePropType.Enum, + name: 'requiredPermissionName', + displayName: 'CmsKit::RequiredPermissionName', + id: 'requiredPermissionName', + options: data => { + const menuItemService = data.getInjected(MenuItemAdminService); + return menuItemService + .getPermissionLookup({ + filter: '', + }) + .pipe( + map((result: { items: PermissionLookupDto[] }) => + result.items.map(permission => ({ + key: permission.displayName || permission.name || '', + value: permission.name || '', + })), + ), + ); + }, + }, +]); + +export const DEFAULT_MENU_ITEM_EDIT_FORM_PROPS = DEFAULT_MENU_ITEM_CREATE_FORM_PROPS; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/menus/default-menu-item-toolbar-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/menus/default-menu-item-toolbar-actions.ts new file mode 100644 index 0000000000..bf1bc0de20 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/menus/default-menu-item-toolbar-actions.ts @@ -0,0 +1,15 @@ +import { MenuItemDto } from '@abp/ng.cms-kit/proxy'; +import { ToolbarAction } from '@abp/ng.components/extensible'; +import { MenuItemListComponent } from '../../components/menus/menu-item-list/menu-item-list.component'; + +export const DEFAULT_MENU_ITEM_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'CmsKit::NewMenuItem', + action: data => { + const component = data.getInjected(MenuItemListComponent); + component.add(); + }, + permission: 'CmsKit.Menus.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/menus/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/menus/index.ts new file mode 100644 index 0000000000..c7e6e8c86a --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/menus/index.ts @@ -0,0 +1,2 @@ +export * from './default-menu-item-create-form-props'; +export * from './default-menu-item-toolbar-actions'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-create-form-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-create-form-props.ts new file mode 100644 index 0000000000..1316c28b3f --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-create-form-props.ts @@ -0,0 +1,51 @@ +import { Validators } from '@angular/forms'; +import { of } from 'rxjs'; +import { CreatePageInputDto, UpdatePageInputDto } from '@abp/ng.cms-kit/proxy'; +import { FormProp, ePropType } from '@abp/ng.components/extensible'; +import { pageStatusOptions } from '@abp/ng.cms-kit/proxy'; +import { LAYOUT_CONSTANTS } from './layout-constants'; + +export const DEFAULT_PAGE_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.String, + name: 'title', + displayName: 'CmsKit::Title', + id: 'title', + validators: () => [Validators.required], + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + id: 'slug', + validators: () => [Validators.required], + tooltip: { + text: 'CmsKit::PageSlugInformation', + }, + }, + { + type: ePropType.Enum, + name: 'layoutName', + displayName: 'CmsKit::SelectLayout', + id: 'layoutName', + options: () => + of( + Object.values(LAYOUT_CONSTANTS).map(layout => ({ + key: layout, + value: layout.toUpperCase(), + })), + ), + validators: () => [Validators.required], + }, + { + type: ePropType.Enum, + name: 'status', + displayName: 'CmsKit::Status', + id: 'status', + options: () => of(pageStatusOptions), + validators: () => [Validators.required], + }, +]); + +export const DEFAULT_PAGE_EDIT_FORM_PROPS: FormProp[] = + DEFAULT_PAGE_CREATE_FORM_PROPS; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-entity-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-entity-actions.ts new file mode 100644 index 0000000000..427b34294b --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-entity-actions.ts @@ -0,0 +1,32 @@ +import { Router } from '@angular/router'; +import { EntityAction } from '@abp/ng.components/extensible'; +import { PageDto } from '@abp/ng.cms-kit/proxy'; +import { PageListComponent } from '../../components/pages/page-list/page-list.component'; + +export const DEFAULT_PAGE_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'AbpUi::Edit', + action: data => { + const router = data.getInjected(Router); + router.navigate(['/cms/pages/update', data.record.id]); + }, + permission: 'CmsKit.Pages.Update', + }, + { + text: 'AbpUi::Delete', + action: data => { + const component = data.getInjected(PageListComponent); + component.delete(data.record.id!); + }, + permission: 'CmsKit.Pages.Delete', + }, + { + text: 'CmsKit::SetAsHomePage', + action: data => { + const component = data.getInjected(PageListComponent); + const { id, isHomePage } = data.record; + component.setAsHomePage(id!, isHomePage!); + }, + permission: 'CmsKit.Pages.SetAsHomePage', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-entity-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-entity-props.ts new file mode 100644 index 0000000000..9e875bc175 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-entity-props.ts @@ -0,0 +1,62 @@ +import { of } from 'rxjs'; +import { PageDto, PageStatus } from '@abp/ng.cms-kit/proxy'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; +import { LocalizationService } from '@abp/ng.core'; + +export const DEFAULT_PAGE_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'title', + displayName: 'CmsKit::Title', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.String, + name: 'status', + displayName: 'CmsKit::Status', + sortable: true, + columnWidth: 120, + valueResolver: data => { + const localization = data.getInjected(LocalizationService); + let result = ''; + switch (data.record.status) { + case PageStatus.Draft: + result = localization.instant('CmsKit::Enum:PageStatus:0'); + break; + case PageStatus.Publish: + result = localization.instant('CmsKit::Enum:PageStatus:1'); + break; + } + return of(result); + }, + }, + { + type: ePropType.Boolean, + name: 'isHomePage', + displayName: 'CmsKit::IsHomePage', + sortable: true, + columnWidth: 120, + }, + { + type: ePropType.Date, + name: 'creationTime', + displayName: 'AbpIdentity::CreationTime', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.Date, + name: 'lastModificationTime', + displayName: 'AbpIdentity::LastModificationTime', + sortable: true, + columnWidth: 200, + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-toolbar-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-toolbar-actions.ts new file mode 100644 index 0000000000..378c62366f --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/default-page-toolbar-actions.ts @@ -0,0 +1,15 @@ +import { Router } from '@angular/router'; +import { PageDto } from '@abp/ng.cms-kit/proxy'; +import { ToolbarAction } from '@abp/ng.components/extensible'; + +export const DEFAULT_PAGE_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'CmsKit::NewPage', + action: data => { + const router = data.getInjected(Router); + router.navigate(['/cms/pages/create']); + }, + permission: 'CmsKit.Pages.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/index.ts new file mode 100644 index 0000000000..255ba7e337 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/index.ts @@ -0,0 +1,5 @@ +export * from './default-page-entity-actions'; +export * from './default-page-entity-props'; +export * from './default-page-toolbar-actions'; +export * from './default-page-create-form-props'; +export * from './layout-constants'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/layout-constants.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/layout-constants.ts new file mode 100644 index 0000000000..da7573afa9 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/pages/layout-constants.ts @@ -0,0 +1,8 @@ +import { eLayoutType } from '@abp/ng.core'; + +export const LAYOUT_CONSTANTS = { + Account: eLayoutType.account, + Public: 'public', + Empty: eLayoutType.empty, + Application: eLayoutType.application, +} as const; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-create-form-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-create-form-props.ts new file mode 100644 index 0000000000..c95ce18e42 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-create-form-props.ts @@ -0,0 +1,36 @@ +import { TagCreateDto, TagAdminService, TagDefinitionDto } from '@abp/ng.cms-kit/proxy'; +import { FormProp, ePropType } from '@abp/ng.components/extensible'; +import { Validators } from '@angular/forms'; +import { map } from 'rxjs/operators'; + +export const DEFAULT_TAG_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.Enum, + name: 'entityType', + displayName: 'CmsKit::EntityType', + id: 'entityType', + validators: () => [Validators.required], + options: data => { + const tagService = data.getInjected(TagAdminService); + return tagService.getTagDefinitions().pipe( + map((definitions: TagDefinitionDto[]) => + definitions.map(def => ({ + key: def.displayName || def.entityType || '', + value: def.entityType || '', + })), + ), + ); + }, + }, + { + type: ePropType.String, + name: 'name', + displayName: 'CmsKit::Name', + id: 'name', + validators: () => [Validators.required], + }, +]); + +export const DEFAULT_TAG_EDIT_FORM_PROPS = DEFAULT_TAG_CREATE_FORM_PROPS.filter( + prop => prop.name !== 'entityType', +); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-actions.ts new file mode 100644 index 0000000000..a4f2dcc81c --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-actions.ts @@ -0,0 +1,23 @@ +import { TagDto } from '@abp/ng.cms-kit/proxy'; +import { EntityAction } from '@abp/ng.components/extensible'; +import { TagListComponent } from '../../components/tags/tag-list/tag-list.component'; + +export const DEFAULT_TAG_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'AbpUi::Edit', + action: data => { + const component = data.getInjected(TagListComponent); + component.edit(data.record.id!); + }, + permission: 'CmsKit.Tags.Update', + }, + { + text: 'AbpUi::Delete', + action: data => { + const component = data.getInjected(TagListComponent); + const { id, name } = data.record; + component.delete(id!, name!); + }, + permission: 'CmsKit.Tags.Delete', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-props.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-props.ts new file mode 100644 index 0000000000..0e5a022615 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-entity-props.ts @@ -0,0 +1,19 @@ +import { TagDto } from '@abp/ng.cms-kit/proxy'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; + +export const DEFAULT_TAG_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'entityType', + displayName: 'CmsKit::EntityType', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.String, + name: 'name', + displayName: 'CmsKit::Name', + sortable: true, + columnWidth: 250, + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-toolbar-actions.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-toolbar-actions.ts new file mode 100644 index 0000000000..6d97bfd787 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/default-tag-toolbar-actions.ts @@ -0,0 +1,15 @@ +import { TagDto } from '@abp/ng.cms-kit/proxy'; +import { ToolbarAction } from '@abp/ng.components/extensible'; +import { TagListComponent } from '../../components/tags/tag-list/tag-list.component'; + +export const DEFAULT_TAG_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'CmsKit::NewTag', + action: data => { + const component = data.getInjected(TagListComponent); + component.add(); + }, + permission: 'CmsKit.Tags.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/index.ts new file mode 100644 index 0000000000..fbebe62554 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/defaults/tags/index.ts @@ -0,0 +1,4 @@ +export * from './default-tag-entity-actions'; +export * from './default-tag-entity-props'; +export * from './default-tag-toolbar-actions'; +export * from './default-tag-create-form-props'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/enums/components.ts b/npm/ng-packs/packages/cms-kit/admin/src/enums/components.ts new file mode 100644 index 0000000000..cf4fa898cf --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/enums/components.ts @@ -0,0 +1,18 @@ +export enum eCmsKitAdminComponents { + CommentList = 'CmsKit.Admin.CommentList', + CommentDetails = 'CmsKit.Admin.CommentDetails', + + Tags = 'CmsKit.Admin.Tags', + + Pages = 'CmsKit.Admin.Pages', + PageForm = 'CmsKit.Admin.PageForm', + + Blogs = 'CmsKit.Admin.Blogs', + + BlogPosts = 'CmsKit.Admin.BlogPosts', + BlogPostForm = 'CmsKit.Admin.BlogPostForm', + + Menus = 'CmsKit.Admin.Menus', + + GlobalResources = 'CmsKit.Admin.GlobalResources', +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/enums/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/enums/index.ts new file mode 100644 index 0000000000..07635cbbc8 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/enums/index.ts @@ -0,0 +1 @@ +export * from './components'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/models/config-options.ts b/npm/ng-packs/packages/cms-kit/admin/src/models/config-options.ts new file mode 100644 index 0000000000..7237ac6942 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/models/config-options.ts @@ -0,0 +1,76 @@ +import { eCmsKitAdminComponents } from '../enums'; +import { + EntityActionContributorCallback, + EntityPropContributorCallback, + ToolbarActionContributorCallback, + CreateFormPropContributorCallback, + EditFormPropContributorCallback, +} from '@abp/ng.components/extensible'; +import { + CommentWithAuthorDto, + TagDto, + PageDto, + BlogDto, + BlogPostListDto, + MenuItemDto, + MenuItemCreateInput, + MenuItemUpdateInput, + CreatePageInputDto, + UpdatePageInputDto, + CreateBlogDto, + CreateBlogPostDto, + UpdateBlogDto, + UpdateBlogPostDto, + TagCreateDto, + TagUpdateDto, +} from '@abp/ng.cms-kit/proxy'; + +export type CmsKitAdminEntityActionContributors = Partial<{ + [eCmsKitAdminComponents.CommentList]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.CommentDetails]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Tags]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Pages]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: EntityActionContributorCallback[]; +}>; + +export type CmsKitAdminEntityPropContributors = Partial<{ + [eCmsKitAdminComponents.CommentList]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.CommentDetails]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Tags]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Pages]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: EntityPropContributorCallback[]; +}>; + +export type CmsKitAdminToolbarActionContributors = Partial<{ + [eCmsKitAdminComponents.Tags]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Pages]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Menus]: ToolbarActionContributorCallback[]; +}>; + +export type CmsKitAdminCreateFormPropContributors = Partial<{ + [eCmsKitAdminComponents.Tags]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.PageForm]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPostForm]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.Menus]: CreateFormPropContributorCallback[]; +}>; + +export type CmsKitAdminEditFormPropContributors = Partial<{ + [eCmsKitAdminComponents.Tags]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.PageForm]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPostForm]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.Menus]: EditFormPropContributorCallback[]; +}>; + +export interface CmsKitAdminConfigOptions { + entityActionContributors?: CmsKitAdminEntityActionContributors; + entityPropContributors?: CmsKitAdminEntityPropContributors; + toolbarActionContributors?: CmsKitAdminToolbarActionContributors; + createFormPropContributors?: CmsKitAdminCreateFormPropContributors; + editFormPropContributors?: CmsKitAdminEditFormPropContributors; +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/models/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/models/index.ts new file mode 100644 index 0000000000..d474226b19 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/models/index.ts @@ -0,0 +1 @@ +export * from './config-options'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/public-api.ts b/npm/ng-packs/packages/cms-kit/admin/src/public-api.ts new file mode 100644 index 0000000000..419d0f94eb --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/public-api.ts @@ -0,0 +1,6 @@ +export * from './components'; +export * from './defaults'; +export * from './enums'; +export * from './resolvers'; +export * from './tokens'; +export * from './cms-kit-admin.routes'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/resolvers/extensions.resolver.ts b/npm/ng-packs/packages/cms-kit/admin/src/resolvers/extensions.resolver.ts new file mode 100644 index 0000000000..61d8309f8a --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/resolvers/extensions.resolver.ts @@ -0,0 +1,81 @@ +import { + ExtensionsService, + getObjectExtensionEntitiesFromStore, + mapEntitiesToContributors, + mergeWithDefaultActions, + mergeWithDefaultProps, +} from '@abp/ng.components/extensible'; +import { inject, Injector } from '@angular/core'; +import { ResolveFn } from '@angular/router'; +import { map, tap } from 'rxjs'; +import { eCmsKitAdminComponents } from '../enums'; +import { + CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS, + CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS, + CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS, + CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS, + CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS, + DEFAULT_CMS_KIT_ADMIN_ENTITY_ACTIONS, + DEFAULT_CMS_KIT_ADMIN_TOOLBAR_ACTIONS, + DEFAULT_CMS_KIT_ADMIN_ENTITY_PROPS, + DEFAULT_CMS_KIT_ADMIN_CREATE_FORM_PROPS, + DEFAULT_CMS_KIT_ADMIN_EDIT_FORM_PROPS, +} from '../tokens'; + +export const cmsKitAdminExtensionsResolver: ResolveFn = () => { + const injector = inject(Injector); + const extensions = inject(ExtensionsService); + + const config = { optional: true }; + + const actionContributors = inject(CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS, config) || {}; + const toolbarContributors = inject(CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS, config) || {}; + const propContributors = inject(CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS, config) || {}; + const createFormContributors = inject(CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS, config) || {}; + const editFormContributors = inject(CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS, config) || {}; + + return getObjectExtensionEntitiesFromStore(injector, 'CmsKit').pipe( + map(entities => ({ + [eCmsKitAdminComponents.CommentList]: entities.Comment, + [eCmsKitAdminComponents.CommentDetails]: entities.Comment, + [eCmsKitAdminComponents.Tags]: entities.Tag, + [eCmsKitAdminComponents.Pages]: entities.Page, + [eCmsKitAdminComponents.PageForm]: entities.Page, + [eCmsKitAdminComponents.Blogs]: entities.Blog, + [eCmsKitAdminComponents.BlogPosts]: entities.BlogPost, + [eCmsKitAdminComponents.BlogPostForm]: entities.BlogPost, + [eCmsKitAdminComponents.Menus]: entities.MenuItem, + })), + mapEntitiesToContributors(injector, 'CmsKit'), + tap(objectExtensionContributors => { + mergeWithDefaultActions( + extensions.entityActions, + DEFAULT_CMS_KIT_ADMIN_ENTITY_ACTIONS, + actionContributors, + ); + mergeWithDefaultActions( + extensions.toolbarActions, + DEFAULT_CMS_KIT_ADMIN_TOOLBAR_ACTIONS, + toolbarContributors, + ); + mergeWithDefaultProps( + extensions.entityProps, + DEFAULT_CMS_KIT_ADMIN_ENTITY_PROPS, + objectExtensionContributors.prop, + propContributors, + ); + mergeWithDefaultProps( + extensions.createFormProps, + DEFAULT_CMS_KIT_ADMIN_CREATE_FORM_PROPS, + objectExtensionContributors.createForm, + createFormContributors, + ); + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_CMS_KIT_ADMIN_EDIT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); + }), + ); +}; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/resolvers/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/resolvers/index.ts new file mode 100644 index 0000000000..1be292f2b0 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/resolvers/index.ts @@ -0,0 +1 @@ +export * from './extensions.resolver'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/services/blog-post-form.service.ts b/npm/ng-packs/packages/cms-kit/admin/src/services/blog-post-form.service.ts new file mode 100644 index 0000000000..37d971ca93 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/services/blog-post-form.service.ts @@ -0,0 +1,91 @@ +import { Injectable, inject } from '@angular/core'; +import { Router } from '@angular/router'; +import { FormGroup } from '@angular/forms'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { ToasterService } from '@abp/ng.theme.shared'; +import { + BlogPostAdminService, + CreateBlogPostDto, + UpdateBlogPostDto, + BlogPostDto, +} from '@abp/ng.cms-kit/proxy'; + +@Injectable({ + providedIn: 'root', +}) +export class BlogPostFormService { + private blogPostService = inject(BlogPostAdminService); + private toasterService = inject(ToasterService); + private router = inject(Router); + + create(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + return this.blogPostService.create(form.value as CreateBlogPostDto).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/blog-posts']); + }), + ); + } + + createAsDraft(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + return this.blogPostService.create(form.value as CreateBlogPostDto).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/blog-posts']); + }), + ); + } + + createAndPublish(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + return this.blogPostService.createAndPublish(form.value as CreateBlogPostDto).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/blog-posts']); + }), + ); + } + + createAndSendToReview(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + return this.blogPostService.createAndSendToReview(form.value as CreateBlogPostDto).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/blog-posts']); + }), + ); + } + + update(blogPostId: string, form: FormGroup, blogPost: BlogPostDto): Observable { + if (!form.valid || !blogPost) { + throw new Error('Form is invalid or blog post is missing'); + } + + const formValue = { + ...blogPost, + ...form.value, + } as UpdateBlogPostDto; + + return this.blogPostService.update(blogPostId, formValue).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/blog-posts']); + }), + ); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/services/comment-entity.service.ts b/npm/ng-packs/packages/cms-kit/admin/src/services/comment-entity.service.ts new file mode 100644 index 0000000000..01c174d9c0 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/services/comment-entity.service.ts @@ -0,0 +1,59 @@ +import { inject, Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { tap } from 'rxjs/operators'; +import { ConfigStateService, ListService } from '@abp/ng.core'; +import { Confirmation, ConfirmationService, ToasterService } from '@abp/ng.theme.shared'; +import { CommentAdminService, CommentGetListInput } from '@abp/ng.cms-kit/proxy'; +import { CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT } from '../components'; + +@Injectable({ + providedIn: 'root', +}) +export class CommentEntityService { + private commentService = inject(CommentAdminService); + private toasterService = inject(ToasterService); + private confirmation = inject(ConfirmationService); + private configState = inject(ConfigStateService); + private router = inject(Router); + + get requireApprovement(): boolean { + return ( + this.configState.getSetting(CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT).toLowerCase() === 'true' + ); + } + + isCommentReply(commentId: string | undefined): boolean { + if (!commentId) { + return false; + } + + const id = this.router.url.split('/').pop(); + return id === commentId; + } + + updateApprovalStatus(id: string, isApproved: boolean, list: ListService) { + this.commentService + .updateApprovalStatus(id, { isApproved: isApproved }) + .pipe(tap(() => list.get())) + .subscribe(() => + isApproved + ? this.toasterService.success('CmsKit::ApprovedSuccessfully') + : this.toasterService.success('CmsKit::ApprovalRevokedSuccessfully'), + ); + } + + delete(id: string, list: ListService) { + this.confirmation + .warn('CmsKit::CommentDeletionConfirmationMessage', 'AbpUi::AreYouSure', { + yesText: 'AbpUi::Yes', + cancelText: 'AbpUi::Cancel', + }) + .subscribe(status => { + if (status === Confirmation.Status.confirm) { + this.commentService.delete(id).subscribe(() => { + list.get(); + }); + } + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/services/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/services/index.ts new file mode 100644 index 0000000000..0385589637 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/services/index.ts @@ -0,0 +1,3 @@ +export * from './page-form.service'; +export * from './blog-post-form.service'; +export * from './comment-entity.service'; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/services/page-form.service.ts b/npm/ng-packs/packages/cms-kit/admin/src/services/page-form.service.ts new file mode 100644 index 0000000000..68b4aaef7c --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/services/page-form.service.ts @@ -0,0 +1,119 @@ +import { Injectable, inject } from '@angular/core'; +import { Router } from '@angular/router'; +import { FormGroup } from '@angular/forms'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { ToasterService } from '@abp/ng.theme.shared'; +import { + PageAdminService, + CreatePageInputDto, + UpdatePageInputDto, + PageDto, + PageStatus, +} from '@abp/ng.cms-kit/proxy'; + +@Injectable({ + providedIn: 'root', +}) +export class PageFormService { + private pageService = inject(PageAdminService); + private toasterService = inject(ToasterService); + private router = inject(Router); + + create(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + return this.pageService.create(form.value as CreatePageInputDto).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/pages']); + }), + ); + } + + createAsDraft(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + const formValue = { ...form.value, status: PageStatus.Draft } as CreatePageInputDto; + return this.pageService.create(formValue).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/pages']); + }), + ); + } + + publish(form: FormGroup): Observable { + if (!form.valid) { + throw new Error('Form is invalid'); + } + + const formValue = { ...form.value, status: PageStatus.Publish } as CreatePageInputDto; + return this.pageService.create(formValue).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/pages']); + }), + ); + } + + update(pageId: string, form: FormGroup, page: PageDto): Observable { + if (!form.valid || !page) { + throw new Error('Form is invalid or page is missing'); + } + + const formValue = { + ...page, + ...form.value, + } as UpdatePageInputDto; + + return this.pageService.update(pageId, formValue).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/pages']); + }), + ); + } + + updateAsDraft(pageId: string, form: FormGroup, page: PageDto): Observable { + if (!form.valid || !page) { + throw new Error('Form is invalid or page is missing'); + } + + const formValue = { + ...page, + ...form.value, + status: PageStatus.Draft, + } as UpdatePageInputDto; + + return this.pageService.update(pageId, formValue).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/pages']); + }), + ); + } + + updateAndPublish(pageId: string, form: FormGroup, page: PageDto): Observable { + if (!form.valid || !page) { + throw new Error('Form is invalid or page is missing'); + } + + const formValue = { + ...page, + ...form.value, + status: PageStatus.Publish, + } as UpdatePageInputDto; + + return this.pageService.update(pageId, formValue).pipe( + tap(() => { + this.toasterService.success('AbpUi::SavedSuccessfully'); + this.router.navigate(['/cms/pages']); + }), + ); + } +} diff --git a/npm/ng-packs/packages/cms-kit/admin/src/tests/blog-post-form.service.spec.ts b/npm/ng-packs/packages/cms-kit/admin/src/tests/blog-post-form.service.spec.ts new file mode 100644 index 0000000000..de63cc346d --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/tests/blog-post-form.service.spec.ts @@ -0,0 +1,141 @@ +/* eslint-disable */ +import { describe, it, expect, beforeEach, jest } from '@jest/globals'; +import { FormGroup } from '@angular/forms'; +import { Router } from '@angular/router'; +import { TestBed } from '@angular/core/testing'; +import { of } from 'rxjs'; +// @ts-ignore - test types are resolved only in the library build context +import { ToasterService } from '@abp/ng.theme.shared'; +// @ts-ignore - test types are resolved only in the library build context +import { BlogPostAdminService } from '@abp/ng.cms-kit/proxy'; +import { BlogPostFormService } from '../services'; + +describe('BlogPostFormService', () => { + let service: BlogPostFormService; + let blogPostAdminService: any; + let toasterService: any; + let router: any; + + beforeEach(() => { + blogPostAdminService = { + create: jest.fn().mockReturnValue(of({})), + createAndPublish: jest.fn().mockReturnValue(of({})), + createAndSendToReview: jest.fn().mockReturnValue(of({})), + update: jest.fn().mockReturnValue(of({})), + }; + + toasterService = { + success: jest.fn(), + }; + + router = { + navigate: jest.fn(), + }; + + TestBed.configureTestingModule({ + providers: [ + BlogPostFormService, + { provide: BlogPostAdminService, useValue: blogPostAdminService }, + { provide: ToasterService, useValue: toasterService }, + { provide: Router, useValue: router }, + ], + }); + + service = TestBed.inject(BlogPostFormService); + }); + + function createValidForm(): FormGroup { + // We don't rely on any specific controls, only on form.value and validity. + return new FormGroup({}); + } + + function createInvalidForm(): FormGroup { + const form = new FormGroup({}); + form.setErrors({ invalid: true }); + return form; + } + + it('should throw when creating with invalid form', () => { + const form = createInvalidForm(); + + expect(() => service.create(form)).toThrowError('Form is invalid'); + }); + + it('should call BlogPostAdminService.create and navigate on create', done => { + const form = createValidForm(); + + service.create(form).subscribe({ + next: () => { + expect(blogPostAdminService.create).toHaveBeenCalledWith(form.value); + expect(toasterService.success).toHaveBeenCalledWith('AbpUi::SavedSuccessfully'); + expect(router.navigate).toHaveBeenCalledWith(['/cms/blog-posts']); + done(); + }, + error: err => done(err as any), + }); + }); + + it('should call BlogPostAdminService.create on createAsDraft', done => { + const form = createValidForm(); + + service.createAsDraft(form).subscribe({ + next: () => { + expect(blogPostAdminService.create).toHaveBeenCalledWith(form.value); + done(); + }, + error: err => done(err as any), + }); + }); + + it('should call BlogPostAdminService.createAndPublish on createAndPublish', done => { + const form = createValidForm(); + + service.createAndPublish(form).subscribe({ + next: () => { + expect(blogPostAdminService.createAndPublish).toHaveBeenCalledWith(form.value); + done(); + }, + error: err => done(err as any), + }); + }); + + it('should call BlogPostAdminService.createAndSendToReview on createAndSendToReview', done => { + const form = createValidForm(); + + service.createAndSendToReview(form).subscribe({ + next: () => { + expect(blogPostAdminService.createAndSendToReview).toHaveBeenCalledWith(form.value); + done(); + }, + error: err => done(err as any), + }); + }); + + it('should throw when updating with invalid form or missing blog post', () => { + const form = createInvalidForm(); + + expect(() => service.update('id', form, {} as any)).toThrowError( + 'Form is invalid or blog post is missing', + ); + + const validForm = createValidForm(); + expect(() => service.update('id', validForm, null as any)).toThrowError( + 'Form is invalid or blog post is missing', + ); + }); + + it('should call BlogPostAdminService.update and navigate on update', done => { + const form = createValidForm(); + const blogPost = { id: '1', title: 't' }; + + service.update('1', form, blogPost).subscribe({ + next: () => { + expect(blogPostAdminService.update).toHaveBeenCalled(); + expect(toasterService.success).toHaveBeenCalledWith('AbpUi::SavedSuccessfully'); + expect(router.navigate).toHaveBeenCalledWith(['/cms/blog-posts']); + done(); + }, + error: err => done(err as any), + }); + }); +}); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/tests/cms-kit-admin.routes.spec.ts b/npm/ng-packs/packages/cms-kit/admin/src/tests/cms-kit-admin.routes.spec.ts new file mode 100644 index 0000000000..8248491fd0 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/tests/cms-kit-admin.routes.spec.ts @@ -0,0 +1,64 @@ +/* eslint-disable */ +import { describe, it, expect } from '@jest/globals'; +import { Routes } from '@angular/router'; +import { createRoutes } from '../cms-kit-admin.routes'; +import { CmsKitAdminConfigOptions } from '../models'; + +describe('cms-kit-admin routes', () => { + function findRoute(routes: Routes, path: string): any { + for (const route of routes) { + if (route.path === path) { + return route; + } + if (route.children) { + const found = findRoute(route.children, path); + if (found) { + return found; + } + } + } + return null; + } + + it('should create base route with children', () => { + const routes = createRoutes(); + + expect(Array.isArray(routes)).toBe(true); + const root = routes[0]; + expect(root.path).toBe(''); + expect(root.children?.length).toBeGreaterThan(0); + }); + + it('should contain expected admin routes with required policies', () => { + const routes = createRoutes(); + + const comments = findRoute(routes, 'comments'); + const pages = findRoute(routes, 'pages'); + const blogs = findRoute(routes, 'blogs'); + const blogPosts = findRoute(routes, 'blog-posts'); + const menus = findRoute(routes, 'menus'); + const globalResources = findRoute(routes, 'global-resources'); + + expect(comments?.data?.requiredPolicy).toBe('CmsKit.Comments'); + expect(pages?.data?.requiredPolicy).toBe('CmsKit.Pages'); + expect(blogs?.data?.requiredPolicy).toBe('CmsKit.Blogs'); + expect(blogPosts?.data?.requiredPolicy).toBe('CmsKit.BlogPosts'); + expect(menus?.data?.requiredPolicy).toBe('CmsKit.Menus'); + expect(globalResources?.data?.requiredPolicy).toBe('CmsKit.GlobalResources'); + }); + + it('should propagate contributors from config options', () => { + const options: CmsKitAdminConfigOptions = { + entityActionContributors: {}, + entityPropContributors: {}, + toolbarActionContributors: {}, + createFormPropContributors: {}, + editFormPropContributors: {}, + }; + + const routes = createRoutes(options); + const root = routes[0]; + + expect(root.providers).toBeDefined(); + }); +}); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/tests/comment-entity.service.spec.ts b/npm/ng-packs/packages/cms-kit/admin/src/tests/comment-entity.service.spec.ts new file mode 100644 index 0000000000..cedd3badfa --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/tests/comment-entity.service.spec.ts @@ -0,0 +1,102 @@ +/* eslint-disable */ +import { describe, it, expect, beforeEach, jest } from '@jest/globals'; +import { Router } from '@angular/router'; +import { TestBed } from '@angular/core/testing'; +import { of, Subject } from 'rxjs'; +// @ts-ignore - test types are resolved only in the library build context +import { ConfigStateService, ListService } from '@abp/ng.core'; +// @ts-ignore - test types are resolved only in the library build context +import { Confirmation, ConfirmationService, ToasterService } from '@abp/ng.theme.shared'; +// @ts-ignore - proxy module types are resolved only in the library build context +import { CommentAdminService, CommentGetListInput } from '@abp/ng.cms-kit/proxy'; +import { CommentEntityService } from '../services'; + +describe('CommentEntityService', () => { + let service: CommentEntityService; + let commentAdminService: any; + let toasterService: any; + let confirmationService: any; + let configStateService: any; + let router: any; + + beforeEach(() => { + commentAdminService = { + updateApprovalStatus: jest.fn().mockReturnValue(of(void 0)), + delete: jest.fn().mockReturnValue(of(void 0)), + }; + + toasterService = { + success: jest.fn(), + }; + + confirmationService = { + warn: jest.fn(), + }; + + configStateService = { + getSetting: jest.fn(), + }; + + router = { + url: '/cms/comments/123', + }; + + TestBed.configureTestingModule({ + providers: [ + CommentEntityService, + { provide: CommentAdminService, useValue: commentAdminService }, + { provide: ToasterService, useValue: toasterService }, + { provide: ConfirmationService, useValue: confirmationService }, + { provide: ConfigStateService, useValue: configStateService }, + { provide: Router, useValue: router }, + ], + }); + + service = TestBed.inject(CommentEntityService); + }); + + it('should return requireApprovement based on setting', () => { + configStateService.getSetting.mockReturnValue('true'); + expect(service.requireApprovement).toBe(true); + + configStateService.getSetting.mockReturnValue('false'); + expect(service.requireApprovement).toBe(false); + }); + + it('should detect comment reply from router url', () => { + expect(service.isCommentReply('123')).toBe(true); + expect(service.isCommentReply('456')).toBe(false); + expect(service.isCommentReply(undefined)).toBe(false); + }); + + it('should update approval status and refresh list', () => { + const list = { + get: jest.fn(), + } as unknown as ListService; + + service.updateApprovalStatus('1', true, list); + + expect(commentAdminService.updateApprovalStatus).toHaveBeenCalledWith('1', { + isApproved: true, + }); + expect(list.get).toHaveBeenCalled(); + expect(toasterService.success).toHaveBeenCalledWith('CmsKit::ApprovedSuccessfully'); + }); + + it('should show confirmation and delete comment when confirmed', () => { + const subject = new Subject(); + (confirmationService.warn as jest.Mock).mockReturnValue(subject.asObservable()); + + const list = { + get: jest.fn(), + } as unknown as ListService; + + service.delete('1', list); + + subject.next(Confirmation.Status.confirm); + subject.complete(); + + expect(commentAdminService.delete).toHaveBeenCalledWith('1'); + expect(list.get).toHaveBeenCalled(); + }); +}); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/tests/page-form.service.spec.ts b/npm/ng-packs/packages/cms-kit/admin/src/tests/page-form.service.spec.ts new file mode 100644 index 0000000000..e49a5ea839 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/tests/page-form.service.spec.ts @@ -0,0 +1,156 @@ +/* eslint-disable */ +import { describe, it, expect, beforeEach, jest } from '@jest/globals'; +import { FormGroup } from '@angular/forms'; +import { Router } from '@angular/router'; +import { TestBed } from '@angular/core/testing'; +import { of } from 'rxjs'; +// @ts-ignore - test types are resolved only in the library build context +import { ToasterService } from '@abp/ng.theme.shared'; +// @ts-ignore - proxy module types are resolved only in the library build context +import { PageAdminService, PageDto } from '@abp/ng.cms-kit/proxy'; +import { PageFormService } from '../services'; + +describe('PageFormService', () => { + let service: PageFormService; + let pageAdminService: any; + let toasterService: any; + let router: any; + + beforeEach(() => { + pageAdminService = { + create: jest.fn().mockReturnValue(of({})), + update: jest.fn().mockReturnValue(of({})), + setAsHomePage: jest.fn(), + delete: jest.fn(), + get: jest.fn(), + getList: jest.fn(), + }; + + toasterService = { + success: jest.fn(), + }; + + router = { + navigate: jest.fn(), + }; + + TestBed.configureTestingModule({ + providers: [ + PageFormService, + { provide: PageAdminService, useValue: pageAdminService }, + { provide: ToasterService, useValue: toasterService }, + { provide: Router, useValue: router }, + ], + }); + + service = TestBed.inject(PageFormService); + }); + + function createValidForm(): FormGroup { + return new FormGroup({}); + } + + function createInvalidForm(): FormGroup { + const form = new FormGroup({}); + form.setErrors({ invalid: true }); + return form; + } + + it('should throw when creating with invalid form', () => { + const form = createInvalidForm(); + + expect(() => service.create(form)).toThrowError('Form is invalid'); + }); + + it('should call PageAdminService.create and navigate on create', done => { + const form = createValidForm(); + + service.create(form).subscribe({ + next: () => { + expect(pageAdminService.create).toHaveBeenCalledWith(form.value); + expect(toasterService.success).toHaveBeenCalledWith('AbpUi::SavedSuccessfully'); + expect(router.navigate).toHaveBeenCalledWith(['/cms/pages']); + done(); + }, + error: err => done(err as any), + }); + }); + + it('should call PageAdminService.create on createAsDraft', done => { + const form = createValidForm(); + + service.createAsDraft(form).subscribe({ + next: () => { + expect(pageAdminService.create).toHaveBeenCalled(); + done(); + }, + error: err => done(err as any), + }); + }); + + it('should call PageAdminService.create on publish', done => { + const form = createValidForm(); + + service.publish(form).subscribe({ + next: () => { + expect(pageAdminService.create).toHaveBeenCalled(); + done(); + }, + error: err => done(err as any), + }); + }); + + it('should throw when updating with invalid form or missing page', () => { + const form = createInvalidForm(); + + expect(() => service.update('id', form, {} as any)).toThrowError( + 'Form is invalid or page is missing', + ); + + const validForm = createValidForm(); + expect(() => service.update('id', validForm, null as any)).toThrowError( + 'Form is invalid or page is missing', + ); + }); + + it('should call PageAdminService.update on update', done => { + const form = createValidForm(); + const page = { id: '1', name: 'test', isHomePage: false }; + + service.update('1', form, page).subscribe({ + next: () => { + expect(pageAdminService.update).toHaveBeenCalledWith('1', expect.objectContaining(page)); + done(); + }, + error: err => done(err as any), + }); + }); + + it('should set status Draft on updateAsDraft', done => { + const form = createValidForm(); + const page = { id: '1', name: 'test', isHomePage: false }; + + service.updateAsDraft('1', form, page).subscribe({ + next: () => { + const arg = pageAdminService.update.mock.calls[0][1]; + expect(arg).toMatchObject(page); + done(); + }, + error: err => done(err as any), + }); + }); + + it('should set status Publish on updateAndPublish', done => { + const form = createValidForm(); + const page = { id: '1', name: 'test', isHomePage: false }; + + service.updateAndPublish('1', form, page).subscribe({ + next: () => { + const arg = pageAdminService.update.mock.calls[0][1]; + expect(arg).toMatchObject(page); + done(); + }, + error: err => done(err as any), + }); + }); +}); diff --git a/npm/ng-packs/packages/cms-kit/admin/src/tokens/extensions.token.ts b/npm/ng-packs/packages/cms-kit/admin/src/tokens/extensions.token.ts new file mode 100644 index 0000000000..113ea864c7 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/tokens/extensions.token.ts @@ -0,0 +1,165 @@ +import { + CommentWithAuthorDto, + TagDto, + PageDto, + BlogDto, + BlogPostListDto, + MenuItemDto, + MenuItemCreateInput, + MenuItemUpdateInput, + TagCreateDto, + TagUpdateDto, + CreateBlogDto, + CreateBlogPostDto, + CreatePageInputDto, + UpdateBlogDto, + UpdateBlogPostDto, + UpdatePageInputDto, +} from '@abp/ng.cms-kit/proxy'; +import { + EntityActionContributorCallback, + EntityPropContributorCallback, + ToolbarActionContributorCallback, + CreateFormPropContributorCallback, + EditFormPropContributorCallback, +} from '@abp/ng.components/extensible'; +import { InjectionToken } from '@angular/core'; +import { DEFAULT_COMMENT_ENTITY_ACTIONS } from '../defaults/comments/default-comment-entity-actions'; +import { DEFAULT_COMMENT_ENTITY_PROPS } from '../defaults/comments/default-comment-entity-props'; +import { + DEFAULT_TAG_ENTITY_ACTIONS, + DEFAULT_TAG_ENTITY_PROPS, + DEFAULT_TAG_TOOLBAR_ACTIONS, + DEFAULT_TAG_CREATE_FORM_PROPS, + DEFAULT_TAG_EDIT_FORM_PROPS, +} from '../defaults/tags'; +import { + DEFAULT_PAGE_ENTITY_ACTIONS, + DEFAULT_PAGE_ENTITY_PROPS, + DEFAULT_PAGE_TOOLBAR_ACTIONS, + DEFAULT_PAGE_CREATE_FORM_PROPS, + DEFAULT_PAGE_EDIT_FORM_PROPS, +} from '../defaults/pages'; +import { + DEFAULT_BLOG_ENTITY_ACTIONS, + DEFAULT_BLOG_ENTITY_PROPS, + DEFAULT_BLOG_TOOLBAR_ACTIONS, + DEFAULT_BLOG_CREATE_FORM_PROPS, + DEFAULT_BLOG_EDIT_FORM_PROPS, +} from '../defaults/blogs'; +import { + DEFAULT_BLOG_POST_ENTITY_ACTIONS, + DEFAULT_BLOG_POST_ENTITY_PROPS, + DEFAULT_BLOG_POST_TOOLBAR_ACTIONS, + DEFAULT_BLOG_POST_CREATE_FORM_PROPS, + DEFAULT_BLOG_POST_EDIT_FORM_PROPS, +} from '../defaults/blog-posts'; +import { + DEFAULT_MENU_ITEM_CREATE_FORM_PROPS, + DEFAULT_MENU_ITEM_EDIT_FORM_PROPS, + DEFAULT_MENU_ITEM_TOOLBAR_ACTIONS, +} from '../defaults/menus'; +import { eCmsKitAdminComponents } from '../enums'; + +export const DEFAULT_CMS_KIT_ADMIN_ENTITY_ACTIONS = { + [eCmsKitAdminComponents.CommentList]: DEFAULT_COMMENT_ENTITY_ACTIONS, + [eCmsKitAdminComponents.CommentDetails]: DEFAULT_COMMENT_ENTITY_ACTIONS, + [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_ENTITY_ACTIONS, + [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_ENTITY_ACTIONS, + [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_ENTITY_ACTIONS, + [eCmsKitAdminComponents.BlogPosts]: DEFAULT_BLOG_POST_ENTITY_ACTIONS, +}; + +export const DEFAULT_CMS_KIT_ADMIN_ENTITY_PROPS = { + [eCmsKitAdminComponents.CommentList]: DEFAULT_COMMENT_ENTITY_PROPS, + [eCmsKitAdminComponents.CommentDetails]: DEFAULT_COMMENT_ENTITY_PROPS, + [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_ENTITY_PROPS, + [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_ENTITY_PROPS, + [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_ENTITY_PROPS, + [eCmsKitAdminComponents.BlogPosts]: DEFAULT_BLOG_POST_ENTITY_PROPS, +}; + +export const DEFAULT_CMS_KIT_ADMIN_TOOLBAR_ACTIONS = { + [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_TOOLBAR_ACTIONS, + [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_TOOLBAR_ACTIONS, + [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_TOOLBAR_ACTIONS, + [eCmsKitAdminComponents.BlogPosts]: DEFAULT_BLOG_POST_TOOLBAR_ACTIONS, + [eCmsKitAdminComponents.Menus]: DEFAULT_MENU_ITEM_TOOLBAR_ACTIONS, +}; + +export const DEFAULT_CMS_KIT_ADMIN_CREATE_FORM_PROPS = { + [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_CREATE_FORM_PROPS, + [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_CREATE_FORM_PROPS, + [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_CREATE_FORM_PROPS, + [eCmsKitAdminComponents.PageForm]: DEFAULT_PAGE_CREATE_FORM_PROPS, + [eCmsKitAdminComponents.BlogPostForm]: DEFAULT_BLOG_POST_CREATE_FORM_PROPS, + [eCmsKitAdminComponents.Menus]: DEFAULT_MENU_ITEM_CREATE_FORM_PROPS, +}; + +export const DEFAULT_CMS_KIT_ADMIN_EDIT_FORM_PROPS = { + [eCmsKitAdminComponents.Tags]: DEFAULT_TAG_EDIT_FORM_PROPS, + [eCmsKitAdminComponents.Pages]: DEFAULT_PAGE_EDIT_FORM_PROPS, + [eCmsKitAdminComponents.Blogs]: DEFAULT_BLOG_EDIT_FORM_PROPS, + [eCmsKitAdminComponents.PageForm]: DEFAULT_PAGE_EDIT_FORM_PROPS, + [eCmsKitAdminComponents.BlogPostForm]: DEFAULT_BLOG_POST_EDIT_FORM_PROPS, + [eCmsKitAdminComponents.Menus]: DEFAULT_MENU_ITEM_EDIT_FORM_PROPS, +}; + +export const CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS = + new InjectionToken('CMS_KIT_ADMIN_ENTITY_ACTION_CONTRIBUTORS'); + +export const CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS = new InjectionToken( + 'CMS_KIT_ADMIN_ENTITY_PROP_CONTRIBUTORS', +); + +export const CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS = + new InjectionToken('CMS_KIT_ADMIN_TOOLBAR_ACTION_CONTRIBUTORS'); + +export const CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS = + new InjectionToken('CMS_KIT_ADMIN_CREATE_FORM_PROP_CONTRIBUTORS'); + +export const CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS = + new InjectionToken('CMS_KIT_ADMIN_EDIT_FORM_PROP_CONTRIBUTORS'); + +// Fix for TS4023 -> https://github.com/microsoft/TypeScript/issues/9944#issuecomment-254693497 +type EntityActionContributors = Partial<{ + [eCmsKitAdminComponents.CommentList]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.CommentDetails]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Tags]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Pages]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EntityActionContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: EntityActionContributorCallback[]; +}>; + +type EntityPropContributors = Partial<{ + [eCmsKitAdminComponents.CommentList]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.CommentDetails]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Tags]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Pages]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EntityPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: EntityPropContributorCallback[]; +}>; + +type ToolbarActionContributors = Partial<{ + [eCmsKitAdminComponents.Tags]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Pages]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.BlogPosts]: ToolbarActionContributorCallback[]; + [eCmsKitAdminComponents.Menus]: ToolbarActionContributorCallback[]; +}>; + +type CreateFormPropContributors = Partial<{ + [eCmsKitAdminComponents.Tags]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.PageForm]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPostForm]: CreateFormPropContributorCallback[]; + [eCmsKitAdminComponents.Menus]: CreateFormPropContributorCallback[]; +}>; + +type EditFormPropContributors = Partial<{ + [eCmsKitAdminComponents.Tags]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.PageForm]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.Blogs]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.BlogPostForm]: EditFormPropContributorCallback[]; + [eCmsKitAdminComponents.Menus]: EditFormPropContributorCallback[]; +}>; diff --git a/npm/ng-packs/packages/cms-kit/admin/src/tokens/index.ts b/npm/ng-packs/packages/cms-kit/admin/src/tokens/index.ts new file mode 100644 index 0000000000..33233400a2 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/admin/src/tokens/index.ts @@ -0,0 +1 @@ +export * from './extensions.token'; diff --git a/npm/ng-packs/packages/cms-kit/jest.config.ts b/npm/ng-packs/packages/cms-kit/jest.config.ts new file mode 100644 index 0000000000..f09b31369e --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/jest.config.ts @@ -0,0 +1,23 @@ +/* eslint-disable */ +export default { + displayName: 'cms-kit', + preset: '../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + globals: {}, + coverageDirectory: '../../coverage/packages/cms-kit', + transform: { + '^.+.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/npm/ng-packs/packages/cms-kit/ng-package.json b/npm/ng-packs/packages/cms-kit/ng-package.json new file mode 100644 index 0000000000..7729ea45b3 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/ng-package.json @@ -0,0 +1,14 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/packages/cms-kit", + "lib": { + "entryFile": "src/public-api.ts" + }, + "allowedNonPeerDependencies": [ + "@abp/ng.theme.shared", + "@abp/ng.components", + "@abp/ng.setting-management", + "@toast-ui/editor", + "codemirror" + ] +} diff --git a/npm/ng-packs/packages/cms-kit/package.json b/npm/ng-packs/packages/cms-kit/package.json new file mode 100644 index 0000000000..b2ff4cc07b --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/package.json @@ -0,0 +1,20 @@ +{ + "name": "@abp/ng.cms-kit", + "version": "10.0.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, + "dependencies": { + "@abp/ng.components": "~10.0.1", + "@abp/ng.setting-management": "~10.0.1", + "@abp/ng.theme.shared": "~10.0.1", + "@toast-ui/editor": "~3.0.0", + "codemirror": "~6.0.0", + "tslib": "^2.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/npm/ng-packs/packages/cms-kit/project.json b/npm/ng-packs/packages/cms-kit/project.json new file mode 100644 index 0000000000..e8690be02c --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/project.json @@ -0,0 +1,38 @@ +{ + "name": "cms-kit", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "library", + "sourceRoot": "packages/cms-kit/src", + "prefix": "abp", + "targets": { + "build": { + "executor": "@nx/angular:package", + "outputs": ["{workspaceRoot}/dist/packages/cms-kit"], + "options": { + "project": "packages/cms-kit/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "packages/cms-kit/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "packages/cms-kit/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/packages/cms-kit"], + "options": { + "jestConfig": "packages/cms-kit/jest.config.ts" + } + }, + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"] + } + }, + "tags": [], + "implicitDependencies": ["core", "theme-shared", "components"] +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/ng-package.json b/npm/ng-packs/packages/cms-kit/proxy/ng-package.json new file mode 100644 index 0000000000..e09fb3fd03 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-entrypoint.schema.json", + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/index.ts new file mode 100644 index 0000000000..b9ad87a473 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/index.ts @@ -0,0 +1 @@ +export * from './proxy/volo'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/README.md b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/README.md new file mode 100644 index 0000000000..767dfd0f7c --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/README.md @@ -0,0 +1,17 @@ +# Proxy Generation Output + +This directory includes the output of the latest proxy generation. +The files and folders in it will be overwritten when proxy generation is run again. +Therefore, please do not place your own content in this folder. + +In addition, `generate-proxy.json` works like a lock file. +It includes information used by the proxy generator, so please do not delete or modify it. + +Finally, the name of the files and folders should not be changed for two reasons: +- Proxy generator will keep creating them at those paths and you will have multiple copies of the same content. +- ABP Suite generates files which include imports from this folder. + +> **Important Notice:** If you are building a module and are planning to publish to npm, +> some of the generated proxies are likely to be exported from public-api.ts file. In such a case, +> please make sure you export files directly and not from barrel exports. In other words, +> do not include index.ts exports in your public-api.ts exports. diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/generate-proxy.json b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/generate-proxy.json new file mode 100644 index 0000000000..4582c826fa --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/generate-proxy.json @@ -0,0 +1,47539 @@ +{ + "generated": [ + "cms-kit-admin" + ], + "modules": { + "abp": { + "rootPath": "abp", + "remoteServiceName": "abp", + "controllers": { + "Pages.Abp.MultiTenancy.AbpTenantController": { + "controllerName": "AbpTenant", + "controllerGroupName": "AbpTenant", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Pages.Abp.MultiTenancy.AbpTenantController", + "interfaces": [ + { + "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": { + "FindTenantByNameAsyncByName": { + "uniqueName": "FindTenantByNameAsyncByName", + "name": "FindTenantByNameAsync", + "httpMethod": "GET", + "url": "api/abp/multi-tenancy/tenants/by-name/{name}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "name", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "name", + "name": "name", + "jsonName": null, + "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", + "jsonName": null, + "type": "System.Guid", + "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" + } + } + }, + "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": [ + { + "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", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "model" + } + ], + "returnValue": { + "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel", + "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController" + } + } + }, + "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.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": { + "GetAsyncByOptions": { + "uniqueName": "GetAsyncByOptions", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/abp/application-configuration", + "supportedVersions": [], + "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 + } + ], + "parameters": [ + { + "nameOnMethod": "options", + "name": "IncludeLocalizationResources", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "options" + } + ], + "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.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/abp/application-localization", + "supportedVersions": [], + "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 + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "OnlyDynamics", + "jsonName": null, + "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": "AbpAccountPublic", + "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.Pro.Public.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" + } + }, + { + "name": "SendPasswordResetCodeAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.SendPasswordResetCodeDto, Volo.Abp.Account.Pro.Public.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.Pro.Public.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.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ResetPasswordDto", + "typeSimple": "Volo.Abp.Account.ResetPasswordDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetConfirmationStateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Account.IdentityUserConfirmationStateDto", + "typeSimple": "Volo.Abp.Account.IdentityUserConfirmationStateDto" + } + }, + { + "name": "SendPhoneNumberConfirmationTokenAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.SendPhoneNumberConfirmationTokenDto, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.SendPhoneNumberConfirmationTokenDto", + "typeSimple": "Volo.Abp.Account.SendPhoneNumberConfirmationTokenDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "SendEmailConfirmationTokenAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.SendEmailConfirmationTokenDto, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.SendEmailConfirmationTokenDto", + "typeSimple": "Volo.Abp.Account.SendEmailConfirmationTokenDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "VerifyEmailConfirmationTokenAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyEmailConfirmationTokenInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyEmailConfirmationTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyEmailConfirmationTokenInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "ConfirmPhoneNumberAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ConfirmPhoneNumberInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ConfirmPhoneNumberInput", + "typeSimple": "Volo.Abp.Account.ConfirmPhoneNumberInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "ConfirmEmailAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ConfirmEmailInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ConfirmEmailInput", + "typeSimple": "Volo.Abp.Account.ConfirmEmailInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "SendEmailConfirmationCodeAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.SendEmailConfirmationCodeDto, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.SendEmailConfirmationCodeDto", + "typeSimple": "Volo.Abp.Account.SendEmailConfirmationCodeDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "CheckEmailConfirmationCodeAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.CheckEmailConfirmationCodeDto, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.CheckEmailConfirmationCodeDto", + "typeSimple": "Volo.Abp.Account.CheckEmailConfirmationCodeDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetEmailConfirmationCodeLimitAsync", + "parametersOnMethod": [ + { + "name": "emailAddress", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Account.EmailConfirmationCodeLimitDto", + "typeSimple": "Volo.Abp.Account.EmailConfirmationCodeLimitDto" + } + }, + { + "name": "SetProfilePictureAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ProfilePictureInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ProfilePictureInput", + "typeSimple": "Volo.Abp.Account.ProfilePictureInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetProfilePictureAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Account.ProfilePictureSourceDto", + "typeSimple": "Volo.Abp.Account.ProfilePictureSourceDto" + } + }, + { + "name": "GetProfilePictureFileAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "GetTwoFactorProvidersAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.GetTwoFactorProvidersInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.GetTwoFactorProvidersInput", + "typeSimple": "Volo.Abp.Account.GetTwoFactorProvidersInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[string]" + } + }, + { + "name": "SendTwoFactorCodeAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.SendTwoFactorCodeInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.SendTwoFactorCodeInput", + "typeSimple": "Volo.Abp.Account.SendTwoFactorCodeInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetSecurityLogListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentitySecurityLogListInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentitySecurityLogListInput", + "typeSimple": "Volo.Abp.Identity.GetIdentitySecurityLogListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "VerifyAuthenticatorCodeAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyAuthenticatorCodeInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyAuthenticatorCodeInput", + "typeSimple": "Volo.Abp.Account.VerifyAuthenticatorCodeInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Account.VerifyAuthenticatorCodeDto", + "typeSimple": "Volo.Abp.Account.VerifyAuthenticatorCodeDto" + } + }, + { + "name": "ResetAuthenticatorAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "HasAuthenticatorAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "GetAuthenticatorInfoAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Account.AuthenticatorInfoDto", + "typeSimple": "Volo.Abp.Account.AuthenticatorInfoDto" + } + }, + { + "name": "VerifyChangeEmailTokenAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyChangeEmailTokenInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyChangeEmailTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyChangeEmailTokenInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "ChangeEmailAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ChangeEmailInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ChangeEmailInput", + "typeSimple": "Volo.Abp.Account.ChangeEmailInput", + "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.Pro.Public.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.Pro.Public.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" + }, + "VerifyPasswordResetTokenAsyncByInput": { + "uniqueName": "VerifyPasswordResetTokenAsyncByInput", + "name": "VerifyPasswordResetTokenAsync", + "httpMethod": "POST", + "url": "api/account/verify-password-reset-token", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyPasswordResetTokenInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyPasswordResetTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyPasswordResetTokenInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.VerifyPasswordResetTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyPasswordResetTokenInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "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.Pro.Public.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" + }, + "GetConfirmationStateAsyncById": { + "uniqueName": "GetConfirmationStateAsyncById", + "name": "GetConfirmationStateAsync", + "httpMethod": "GET", + "url": "api/account/confirmation-state", + "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": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Account.IdentityUserConfirmationStateDto", + "typeSimple": "Volo.Abp.Account.IdentityUserConfirmationStateDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "SendPhoneNumberConfirmationTokenAsyncByInput": { + "uniqueName": "SendPhoneNumberConfirmationTokenAsyncByInput", + "name": "SendPhoneNumberConfirmationTokenAsync", + "httpMethod": "POST", + "url": "api/account/send-phone-number-confirmation-token", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.SendPhoneNumberConfirmationTokenDto, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.SendPhoneNumberConfirmationTokenDto", + "typeSimple": "Volo.Abp.Account.SendPhoneNumberConfirmationTokenDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.SendPhoneNumberConfirmationTokenDto", + "typeSimple": "Volo.Abp.Account.SendPhoneNumberConfirmationTokenDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "SendEmailConfirmationTokenAsyncByInput": { + "uniqueName": "SendEmailConfirmationTokenAsyncByInput", + "name": "SendEmailConfirmationTokenAsync", + "httpMethod": "POST", + "url": "api/account/send-email-confirmation-token", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.SendEmailConfirmationTokenDto, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.SendEmailConfirmationTokenDto", + "typeSimple": "Volo.Abp.Account.SendEmailConfirmationTokenDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.SendEmailConfirmationTokenDto", + "typeSimple": "Volo.Abp.Account.SendEmailConfirmationTokenDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "VerifyEmailConfirmationTokenAsyncByInput": { + "uniqueName": "VerifyEmailConfirmationTokenAsyncByInput", + "name": "VerifyEmailConfirmationTokenAsync", + "httpMethod": "POST", + "url": "api/account/verify-email-confirmation-token", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyEmailConfirmationTokenInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyEmailConfirmationTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyEmailConfirmationTokenInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.VerifyEmailConfirmationTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyEmailConfirmationTokenInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "ConfirmPhoneNumberAsyncByInput": { + "uniqueName": "ConfirmPhoneNumberAsyncByInput", + "name": "ConfirmPhoneNumberAsync", + "httpMethod": "POST", + "url": "api/account/confirm-phone-number", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ConfirmPhoneNumberInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ConfirmPhoneNumberInput", + "typeSimple": "Volo.Abp.Account.ConfirmPhoneNumberInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.ConfirmPhoneNumberInput", + "typeSimple": "Volo.Abp.Account.ConfirmPhoneNumberInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "ConfirmEmailAsyncByInput": { + "uniqueName": "ConfirmEmailAsyncByInput", + "name": "ConfirmEmailAsync", + "httpMethod": "POST", + "url": "api/account/confirm-email", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ConfirmEmailInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ConfirmEmailInput", + "typeSimple": "Volo.Abp.Account.ConfirmEmailInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.ConfirmEmailInput", + "typeSimple": "Volo.Abp.Account.ConfirmEmailInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "SendEmailConfirmationCodeAsyncByInput": { + "uniqueName": "SendEmailConfirmationCodeAsyncByInput", + "name": "SendEmailConfirmationCodeAsync", + "httpMethod": "POST", + "url": "api/account/send-email-confirmation-code", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.SendEmailConfirmationCodeDto, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.SendEmailConfirmationCodeDto", + "typeSimple": "Volo.Abp.Account.SendEmailConfirmationCodeDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.SendEmailConfirmationCodeDto", + "typeSimple": "Volo.Abp.Account.SendEmailConfirmationCodeDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "CheckEmailConfirmationCodeAsyncByInput": { + "uniqueName": "CheckEmailConfirmationCodeAsyncByInput", + "name": "CheckEmailConfirmationCodeAsync", + "httpMethod": "POST", + "url": "api/account/check-email-confirmation-code", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.CheckEmailConfirmationCodeDto, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.CheckEmailConfirmationCodeDto", + "typeSimple": "Volo.Abp.Account.CheckEmailConfirmationCodeDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.CheckEmailConfirmationCodeDto", + "typeSimple": "Volo.Abp.Account.CheckEmailConfirmationCodeDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "GetEmailConfirmationCodeLimitAsyncByEmailAddress": { + "uniqueName": "GetEmailConfirmationCodeLimitAsyncByEmailAddress", + "name": "GetEmailConfirmationCodeLimitAsync", + "httpMethod": "GET", + "url": "api/account/email-confirmation-code-limit", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "emailAddress", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "emailAddress", + "name": "emailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Account.EmailConfirmationCodeLimitDto", + "typeSimple": "Volo.Abp.Account.EmailConfirmationCodeLimitDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "SetProfilePictureAsyncByInput": { + "uniqueName": "SetProfilePictureAsyncByInput", + "name": "SetProfilePictureAsync", + "httpMethod": "POST", + "url": "api/account/profile-picture", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ProfilePictureInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ProfilePictureInput", + "typeSimple": "Volo.Abp.Account.ProfilePictureInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Type", + "jsonName": null, + "type": "Volo.Abp.Account.ProfilePictureType", + "typeSimple": "enum", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ImageContent", + "jsonName": null, + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "FormFile", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "GetProfilePictureAsyncById": { + "uniqueName": "GetProfilePictureAsyncById", + "name": "GetProfilePictureAsync", + "httpMethod": "GET", + "url": "api/account/profile-picture/{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.Account.ProfilePictureSourceDto", + "typeSimple": "Volo.Abp.Account.ProfilePictureSourceDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "GetTwoFactorProvidersAsyncByInput": { + "uniqueName": "GetTwoFactorProvidersAsyncByInput", + "name": "GetTwoFactorProvidersAsync", + "httpMethod": "GET", + "url": "api/account/two-factor-providers", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.GetTwoFactorProvidersInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.GetTwoFactorProvidersInput", + "typeSimple": "Volo.Abp.Account.GetTwoFactorProvidersInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[string]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "SendTwoFactorCodeAsyncByInput": { + "uniqueName": "SendTwoFactorCodeAsyncByInput", + "name": "SendTwoFactorCodeAsync", + "httpMethod": "POST", + "url": "api/account/send-two-factor-code", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.SendTwoFactorCodeInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.SendTwoFactorCodeInput", + "typeSimple": "Volo.Abp.Account.SendTwoFactorCodeInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.SendTwoFactorCodeInput", + "typeSimple": "Volo.Abp.Account.SendTwoFactorCodeInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "GetSecurityLogListAsyncByInput": { + "uniqueName": "GetSecurityLogListAsyncByInput", + "name": "GetSecurityLogListAsync", + "httpMethod": "GET", + "url": "api/account/security-logs", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentitySecurityLogListInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentitySecurityLogListInput", + "typeSimple": "Volo.Abp.Identity.GetIdentitySecurityLogListInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "StartTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EndTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ApplicationName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Identity", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Action", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "CorrelationId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ClientIpAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "SkipCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ExtraProperties", + "jsonName": null, + "type": "Volo.Abp.Data.ExtraPropertyDictionary", + "typeSimple": "{string:object}", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "VerifyAuthenticatorCodeAsyncByInput": { + "uniqueName": "VerifyAuthenticatorCodeAsyncByInput", + "name": "VerifyAuthenticatorCodeAsync", + "httpMethod": "POST", + "url": "api/account/verify-authenticator-code", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyAuthenticatorCodeInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyAuthenticatorCodeInput", + "typeSimple": "Volo.Abp.Account.VerifyAuthenticatorCodeInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.VerifyAuthenticatorCodeInput", + "typeSimple": "Volo.Abp.Account.VerifyAuthenticatorCodeInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Account.VerifyAuthenticatorCodeDto", + "typeSimple": "Volo.Abp.Account.VerifyAuthenticatorCodeDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "ResetAuthenticatorAsync": { + "uniqueName": "ResetAuthenticatorAsync", + "name": "ResetAuthenticatorAsync", + "httpMethod": "POST", + "url": "api/account/reset-authenticator", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "HasAuthenticatorAsync": { + "uniqueName": "HasAuthenticatorAsync", + "name": "HasAuthenticatorAsync", + "httpMethod": "GET", + "url": "api/account/has-authenticator-key", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "GetAuthenticatorInfoAsync": { + "uniqueName": "GetAuthenticatorInfoAsync", + "name": "GetAuthenticatorInfoAsync", + "httpMethod": "GET", + "url": "api/account/authenticator-info", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Account.AuthenticatorInfoDto", + "typeSimple": "Volo.Abp.Account.AuthenticatorInfoDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "VerifyChangeEmailTokenAsyncByInput": { + "uniqueName": "VerifyChangeEmailTokenAsyncByInput", + "name": "VerifyChangeEmailTokenAsync", + "httpMethod": "POST", + "url": "api/account/verify-change-email-token", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyChangeEmailTokenInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyChangeEmailTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyChangeEmailTokenInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.VerifyChangeEmailTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyChangeEmailTokenInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "ChangeEmailAsyncByInput": { + "uniqueName": "ChangeEmailAsyncByInput", + "name": "ChangeEmailAsync", + "httpMethod": "POST", + "url": "api/account/change-email", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ChangeEmailInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ChangeEmailInput", + "typeSimple": "Volo.Abp.Account.ChangeEmailInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.ChangeEmailInput", + "typeSimple": "Volo.Abp.Account.ChangeEmailInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "GetProfilePictureFileAsyncById": { + "uniqueName": "GetProfilePictureFileAsyncById", + "name": "GetProfilePictureFileAsync", + "httpMethod": "GET", + "url": "api/account/profile-picture-file/{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.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" + }, + "RecaptchaByCaptchaResponse": { + "uniqueName": "RecaptchaByCaptchaResponse", + "name": "Recaptcha", + "httpMethod": "GET", + "url": "api/account/recaptcha-validate", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "captchaResponse", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "captchaResponse", + "name": "captchaResponse", + "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.Account.AccountController" + } + } + }, + "Volo.Abp.Account.AccountExternalLoginController": { + "controllerName": "AccountExternalLogin", + "controllerGroupName": "ExternalLogin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Account.AccountExternalLoginController", + "interfaces": [ + { + "type": "Volo.Abp.Account.IAccountExternalLoginAppService", + "name": "IAccountExternalLoginAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Account.AccountExternalLoginDto]" + } + }, + { + "name": "DeleteAsync", + "parametersOnMethod": [ + { + "name": "loginProvider", + "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" + } + }, + { + "name": "HasPasswordVerifiedAsync", + "parametersOnMethod": [ + { + "name": "userId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "loginProvider", + "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.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "SetPasswordVerifiedAsync", + "parametersOnMethod": [ + { + "name": "loginProvider", + "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" + } + }, + { + "name": "RemovePasswordVerifiedAsync", + "parametersOnMethod": [ + { + "name": "loginProvider", + "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": { + "GetListAsync": { + "uniqueName": "GetListAsync", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/account/externallogin", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Account.AccountExternalLoginDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountExternalLoginAppService" + }, + "DeleteAsyncByLoginProviderAndProviderKey": { + "uniqueName": "DeleteAsyncByLoginProviderAndProviderKey", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/account/externallogin/{loginProvider}/{providerKey}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "loginProvider", + "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": "loginProvider", + "name": "loginProvider", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountExternalLoginAppService" + }, + "HasPasswordVerifiedAsyncByUserIdAndLoginProviderAndProviderKey": { + "uniqueName": "HasPasswordVerifiedAsyncByUserIdAndLoginProviderAndProviderKey", + "name": "HasPasswordVerifiedAsync", + "httpMethod": "GET", + "url": "api/account/externallogin/password-verified/{userId}/{loginProvider}/{providerKey}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "userId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "loginProvider", + "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": "userId", + "name": "userId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "loginProvider", + "name": "loginProvider", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountExternalLoginAppService" + }, + "SetPasswordVerifiedAsyncByLoginProviderAndProviderKey": { + "uniqueName": "SetPasswordVerifiedAsyncByLoginProviderAndProviderKey", + "name": "SetPasswordVerifiedAsync", + "httpMethod": "POST", + "url": "api/account/externallogin/password-verified/{loginProvider}/{providerKey}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "loginProvider", + "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": "loginProvider", + "name": "loginProvider", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountExternalLoginAppService" + }, + "RemovePasswordVerifiedAsyncByLoginProviderAndProviderKey": { + "uniqueName": "RemovePasswordVerifiedAsyncByLoginProviderAndProviderKey", + "name": "RemovePasswordVerifiedAsync", + "httpMethod": "DELETE", + "url": "api/account/externallogin/{loginProvider}/{providerKey}/password-verified", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "loginProvider", + "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": "loginProvider", + "name": "loginProvider", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountExternalLoginAppService" + } + } + }, + "Volo.Abp.Account.AccountExternalProviderController": { + "controllerName": "AccountExternalProvider", + "controllerGroupName": "AccountExternalProvider", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Account.AccountExternalProviderController", + "interfaces": [ + { + "type": "Volo.Abp.Account.ExternalProviders.IAccountExternalProviderAppService", + "name": "IAccountExternalProviderAppService", + "methods": [ + { + "name": "GetAllAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Account.ExternalProviders.ExternalProviderDto", + "typeSimple": "Volo.Abp.Account.ExternalProviders.ExternalProviderDto" + } + }, + { + "name": "GetByNameAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ExternalProviders.GetByNameInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ExternalProviders.GetByNameInput", + "typeSimple": "Volo.Abp.Account.ExternalProviders.GetByNameInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Account.ExternalProviders.ExternalProviderItemWithSecretDto", + "typeSimple": "Volo.Abp.Account.ExternalProviders.ExternalProviderItemWithSecretDto" + } + } + ] + } + ], + "actions": { + "GetAllAsync": { + "uniqueName": "GetAllAsync", + "name": "GetAllAsync", + "httpMethod": "GET", + "url": "api/account/external-provider", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Account.ExternalProviders.ExternalProviderDto", + "typeSimple": "Volo.Abp.Account.ExternalProviders.ExternalProviderDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.ExternalProviders.IAccountExternalProviderAppService" + }, + "GetByNameAsyncByInput": { + "uniqueName": "GetByNameAsyncByInput", + "name": "GetByNameAsync", + "httpMethod": "GET", + "url": "api/account/external-provider/by-name", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ExternalProviders.GetByNameInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ExternalProviders.GetByNameInput", + "typeSimple": "Volo.Abp.Account.ExternalProviders.GetByNameInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Account.ExternalProviders.ExternalProviderItemWithSecretDto", + "typeSimple": "Volo.Abp.Account.ExternalProviders.ExternalProviderItemWithSecretDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.ExternalProviders.IAccountExternalProviderAppService" + } + } + }, + "Volo.Abp.Account.AccountSessionController": { + "controllerName": "AccountSession", + "controllerGroupName": "Sessions", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Account.AccountSessionController", + "interfaces": [ + { + "type": "Volo.Abp.Account.IAccountSessionAppService", + "name": "IAccountSessionAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.GetAccountIdentitySessionListInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.GetAccountIdentitySessionListInput", + "typeSimple": "Volo.Abp.Account.GetAccountIdentitySessionListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "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.IdentitySessionDto", + "typeSimple": "Volo.Abp.Identity.IdentitySessionDto" + } + }, + { + "name": "RevokeAsync", + "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": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/account/sessions", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.GetAccountIdentitySessionListInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.GetAccountIdentitySessionListInput", + "typeSimple": "Volo.Abp.Account.GetAccountIdentitySessionListInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Device", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ClientId", + "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" + }, + { + "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": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSessionAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/account/sessions/{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.Identity.IdentitySessionDto", + "typeSimple": "Volo.Abp.Identity.IdentitySessionDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSessionAppService" + }, + "RevokeAsyncById": { + "uniqueName": "RevokeAsyncById", + "name": "RevokeAsync", + "httpMethod": "DELETE", + "url": "api/account/sessions/{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.Account.IAccountSessionAppService" + } + } + }, + "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.IdentityLinkUserController": { + "controllerName": "IdentityLinkUser", + "controllerGroupName": "User", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Account.IdentityLinkUserController", + "interfaces": [ + { + "type": "Volo.Abp.Account.IIdentityLinkUserAppService", + "name": "IIdentityLinkUserAppService", + "methods": [ + { + "name": "GetAllListAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "LinkAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.LinkUserInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.LinkUserInput", + "typeSimple": "Volo.Abp.Account.LinkUserInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "UnlinkAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.UnLinkUserInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.UnLinkUserInput", + "typeSimple": "Volo.Abp.Account.UnLinkUserInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "IsLinkedAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.IsLinkedInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.IsLinkedInput", + "typeSimple": "Volo.Abp.Account.IsLinkedInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "GenerateLinkTokenAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + } + }, + { + "name": "VerifyLinkTokenAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyLinkTokenInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyLinkTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyLinkTokenInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "GenerateLinkLoginTokenAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + } + }, + { + "name": "VerifyLinkLoginTokenAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyLinkLoginTokenInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyLinkLoginTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyLinkLoginTokenInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + } + ] + } + ], + "actions": { + "LinkAsyncByInput": { + "uniqueName": "LinkAsyncByInput", + "name": "LinkAsync", + "httpMethod": "POST", + "url": "api/account/link-user/link", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.LinkUserInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.LinkUserInput", + "typeSimple": "Volo.Abp.Account.LinkUserInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.LinkUserInput", + "typeSimple": "Volo.Abp.Account.LinkUserInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityLinkUserAppService" + }, + "UnlinkAsyncByInput": { + "uniqueName": "UnlinkAsyncByInput", + "name": "UnlinkAsync", + "httpMethod": "POST", + "url": "api/account/link-user/unlink", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.UnLinkUserInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.UnLinkUserInput", + "typeSimple": "Volo.Abp.Account.UnLinkUserInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.UnLinkUserInput", + "typeSimple": "Volo.Abp.Account.UnLinkUserInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityLinkUserAppService" + }, + "IsLinkedAsyncByInput": { + "uniqueName": "IsLinkedAsyncByInput", + "name": "IsLinkedAsync", + "httpMethod": "POST", + "url": "api/account/link-user/is-linked", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.IsLinkedInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.IsLinkedInput", + "typeSimple": "Volo.Abp.Account.IsLinkedInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.IsLinkedInput", + "typeSimple": "Volo.Abp.Account.IsLinkedInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityLinkUserAppService" + }, + "GenerateLinkTokenAsync": { + "uniqueName": "GenerateLinkTokenAsync", + "name": "GenerateLinkTokenAsync", + "httpMethod": "POST", + "url": "api/account/link-user/generate-link-token", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityLinkUserAppService" + }, + "VerifyLinkTokenAsyncByInput": { + "uniqueName": "VerifyLinkTokenAsyncByInput", + "name": "VerifyLinkTokenAsync", + "httpMethod": "POST", + "url": "api/account/link-user/verify-link-token", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyLinkTokenInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyLinkTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyLinkTokenInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.VerifyLinkTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyLinkTokenInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityLinkUserAppService" + }, + "GenerateLinkLoginTokenAsync": { + "uniqueName": "GenerateLinkLoginTokenAsync", + "name": "GenerateLinkLoginTokenAsync", + "httpMethod": "POST", + "url": "api/account/link-user/generate-link-login-token", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityLinkUserAppService" + }, + "VerifyLinkLoginTokenAsyncByInput": { + "uniqueName": "VerifyLinkLoginTokenAsyncByInput", + "name": "VerifyLinkLoginTokenAsync", + "httpMethod": "POST", + "url": "api/account/link-user/verify-link-login-token", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.VerifyLinkLoginTokenInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.VerifyLinkLoginTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyLinkLoginTokenInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.VerifyLinkLoginTokenInput", + "typeSimple": "Volo.Abp.Account.VerifyLinkLoginTokenInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityLinkUserAppService" + }, + "GetAllListAsync": { + "uniqueName": "GetAllListAsync", + "name": "GetAllListAsync", + "httpMethod": "GET", + "url": "api/account/link-user", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityLinkUserAppService" + } + } + }, + "Volo.Abp.Account.IdentityUserDelegationController": { + "controllerName": "IdentityUserDelegation", + "controllerGroupName": "User", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Account.IdentityUserDelegationController", + "interfaces": [ + { + "type": "Volo.Abp.Account.IIdentityUserDelegationAppService", + "name": "IIdentityUserDelegationAppService", + "methods": [ + { + "name": "GetDelegatedUsersAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "GetMyDelegatedUsersAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "GetActiveDelegationsAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "GetUserLookupAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.GetUserLookupInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.GetUserLookupInput", + "typeSimple": "Volo.Abp.Account.GetUserLookupInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "DelegateNewUserAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.DelegateNewUserInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.DelegateNewUserInput", + "typeSimple": "Volo.Abp.Account.DelegateNewUserInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "DeleteDelegationAsync", + "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": { + "GetDelegatedUsersAsync": { + "uniqueName": "GetDelegatedUsersAsync", + "name": "GetDelegatedUsersAsync", + "httpMethod": "GET", + "url": "api/account/user-delegation/delegated-users", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityUserDelegationAppService" + }, + "GetMyDelegatedUsersAsync": { + "uniqueName": "GetMyDelegatedUsersAsync", + "name": "GetMyDelegatedUsersAsync", + "httpMethod": "GET", + "url": "api/account/user-delegation/my-delegated-users", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityUserDelegationAppService" + }, + "GetActiveDelegationsAsync": { + "uniqueName": "GetActiveDelegationsAsync", + "name": "GetActiveDelegationsAsync", + "httpMethod": "GET", + "url": "api/account/user-delegation/active-delegations", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityUserDelegationAppService" + }, + "GetUserLookupAsyncByInput": { + "uniqueName": "GetUserLookupAsyncByInput", + "name": "GetUserLookupAsync", + "httpMethod": "GET", + "url": "api/account/user-delegation/user-lookup", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.GetUserLookupInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.GetUserLookupInput", + "typeSimple": "Volo.Abp.Account.GetUserLookupInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityUserDelegationAppService" + }, + "DelegateNewUserAsyncByInput": { + "uniqueName": "DelegateNewUserAsyncByInput", + "name": "DelegateNewUserAsync", + "httpMethod": "POST", + "url": "api/account/user-delegation/delegate-new-user", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.DelegateNewUserInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.DelegateNewUserInput", + "typeSimple": "Volo.Abp.Account.DelegateNewUserInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.DelegateNewUserInput", + "typeSimple": "Volo.Abp.Account.DelegateNewUserInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityUserDelegationAppService" + }, + "DeleteDelegationAsyncById": { + "uniqueName": "DeleteDelegationAsyncById", + "name": "DeleteDelegationAsync", + "httpMethod": "POST", + "url": "api/account/user-delegation/delete-delegation", + "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": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IIdentityUserDelegationAppService" + } + } + }, + "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.Pro.Public.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.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ChangePasswordInput", + "typeSimple": "Volo.Abp.Account.ChangePasswordInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetTwoFactorEnabledAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "SetTwoFactorEnabledAsync", + "parametersOnMethod": [ + { + "name": "enabled", + "typeAsString": "System.Boolean, System.Private.CoreLib", + "type": "System.Boolean", + "typeSimple": "boolean", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "CanEnableTwoFactorAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "GetTimezonesAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.NameValue]" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "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": "input", + "typeAsString": "Volo.Abp.Account.UpdateProfileDto, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.UpdateProfileDto", + "typeSimple": "Volo.Abp.Account.UpdateProfileDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.UpdateProfileDto", + "typeSimple": "Volo.Abp.Account.UpdateProfileDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Account.ProfileDto", + "typeSimple": "Volo.Abp.Account.ProfileDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IProfileAppService" + }, + "ChangePasswordAsyncByInput": { + "uniqueName": "ChangePasswordAsyncByInput", + "name": "ChangePasswordAsync", + "httpMethod": "POST", + "url": "api/account/my-profile/change-password", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.ChangePasswordInput, Volo.Abp.Account.Pro.Public.Application.Contracts", + "type": "Volo.Abp.Account.ChangePasswordInput", + "typeSimple": "Volo.Abp.Account.ChangePasswordInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.ChangePasswordInput", + "typeSimple": "Volo.Abp.Account.ChangePasswordInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IProfileAppService" + }, + "GetTwoFactorEnabledAsync": { + "uniqueName": "GetTwoFactorEnabledAsync", + "name": "GetTwoFactorEnabledAsync", + "httpMethod": "GET", + "url": "api/account/my-profile/two-factor-enabled", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IProfileAppService" + }, + "SetTwoFactorEnabledAsyncByEnabled": { + "uniqueName": "SetTwoFactorEnabledAsyncByEnabled", + "name": "SetTwoFactorEnabledAsync", + "httpMethod": "POST", + "url": "api/account/my-profile/set-two-factor-enabled", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "enabled", + "typeAsString": "System.Boolean, System.Private.CoreLib", + "type": "System.Boolean", + "typeSimple": "boolean", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "enabled", + "name": "enabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IProfileAppService" + }, + "CanEnableTwoFactorAsync": { + "uniqueName": "CanEnableTwoFactorAsync", + "name": "CanEnableTwoFactorAsync", + "httpMethod": "GET", + "url": "api/account/my-profile/can-enable-two-factor", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IProfileAppService" + }, + "GetTimezonesAsync": { + "uniqueName": "GetTimezonesAsync", + "name": "GetTimezonesAsync", + "httpMethod": "GET", + "url": "api/account/my-profile/timezones", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.NameValue]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IProfileAppService" + } + } + }, + "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.AccountController": { + "controllerName": "Account", + "controllerGroupName": "Login", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.AccountController", + "interfaces": [], + "actions": { + "LoginByLogin": { + "uniqueName": "LoginByLogin", + "name": "Login", + "httpMethod": "POST", + "url": "api/account/login", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "login", + "typeAsString": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo, Volo.Abp.Account.Pro.Public.Web", + "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo", + "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "login", + "name": "login", + "jsonName": null, + "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo", + "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult", + "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.AccountController" + }, + "LinkLoginByLogin": { + "uniqueName": "LinkLoginByLogin", + "name": "LinkLogin", + "httpMethod": "POST", + "url": "api/account/linkLogin", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "login", + "typeAsString": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.LinkUserLoginInfo, Volo.Abp.Account.Pro.Public.Web", + "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.LinkUserLoginInfo", + "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.LinkUserLoginInfo", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "login", + "name": "login", + "jsonName": null, + "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.LinkUserLoginInfo", + "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.LinkUserLoginInfo", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult", + "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.AccountController" + }, + "Logout": { + "uniqueName": "Logout", + "name": "Logout", + "httpMethod": "GET", + "url": "api/account/logout", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.AccountController" + }, + "CheckPasswordByLogin": { + "uniqueName": "CheckPasswordByLogin", + "name": "CheckPassword", + "httpMethod": "POST", + "url": "api/account/checkPassword", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "login", + "typeAsString": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo, Volo.Abp.Account.Pro.Public.Web", + "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo", + "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "login", + "name": "login", + "jsonName": null, + "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo", + "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult", + "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.AccountController" + } + } + } + } + }, + "accountAdmin": { + "rootPath": "accountAdmin", + "remoteServiceName": "AbpAccountAdmin", + "controllers": { + "Volo.Abp.Account.AccountSettingsController": { + "controllerName": "AccountSettings", + "controllerGroupName": "AccountSettings", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Account.AccountSettingsController", + "interfaces": [ + { + "type": "Volo.Abp.Account.IAccountSettingsAppService", + "name": "IAccountSettingsAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Account.AccountSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountSettingsDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.AccountSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts", + "type": "Volo.Abp.Account.AccountSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetTwoFactorAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Account.AccountTwoFactorSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountTwoFactorSettingsDto" + } + }, + { + "name": "UpdateTwoFactorAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.AccountTwoFactorSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts", + "type": "Volo.Abp.Account.AccountTwoFactorSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountTwoFactorSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetRecaptchaAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Account.AccountRecaptchaSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountRecaptchaSettingsDto" + } + }, + { + "name": "UpdateRecaptchaAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.AccountRecaptchaSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts", + "type": "Volo.Abp.Account.AccountRecaptchaSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountRecaptchaSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetExternalProviderAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Account.AccountExternalProviderSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountExternalProviderSettingsDto" + } + }, + { + "name": "UpdateExternalProviderAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.AccountExternalProviderSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts", + "type": "Volo.Abp.Account.AccountExternalProviderSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountExternalProviderSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetIdleAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Account.AccountIdleSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountIdleSettingsDto" + } + }, + { + "name": "UpdateIdleAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.AccountIdleSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts", + "type": "Volo.Abp.Account.AccountIdleSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountIdleSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/account-admin/settings", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Account.AccountSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSettingsAppService" + }, + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/account-admin/settings", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.AccountSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts", + "type": "Volo.Abp.Account.AccountSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.AccountSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSettingsAppService" + }, + "GetTwoFactorAsync": { + "uniqueName": "GetTwoFactorAsync", + "name": "GetTwoFactorAsync", + "httpMethod": "GET", + "url": "api/account-admin/settings/two-factor", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Account.AccountTwoFactorSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountTwoFactorSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSettingsAppService" + }, + "UpdateTwoFactorAsyncByInput": { + "uniqueName": "UpdateTwoFactorAsyncByInput", + "name": "UpdateTwoFactorAsync", + "httpMethod": "PUT", + "url": "api/account-admin/settings/two-factor", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.AccountTwoFactorSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts", + "type": "Volo.Abp.Account.AccountTwoFactorSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountTwoFactorSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.AccountTwoFactorSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountTwoFactorSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSettingsAppService" + }, + "GetRecaptchaAsync": { + "uniqueName": "GetRecaptchaAsync", + "name": "GetRecaptchaAsync", + "httpMethod": "GET", + "url": "api/account-admin/settings/recaptcha", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Account.AccountRecaptchaSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountRecaptchaSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSettingsAppService" + }, + "UpdateRecaptchaAsyncByInput": { + "uniqueName": "UpdateRecaptchaAsyncByInput", + "name": "UpdateRecaptchaAsync", + "httpMethod": "PUT", + "url": "api/account-admin/settings/recaptcha", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.AccountRecaptchaSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts", + "type": "Volo.Abp.Account.AccountRecaptchaSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountRecaptchaSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.AccountRecaptchaSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountRecaptchaSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSettingsAppService" + }, + "GetExternalProviderAsync": { + "uniqueName": "GetExternalProviderAsync", + "name": "GetExternalProviderAsync", + "httpMethod": "GET", + "url": "api/account-admin/settings/external-provider", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Account.AccountExternalProviderSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountExternalProviderSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSettingsAppService" + }, + "UpdateExternalProviderAsyncByInput": { + "uniqueName": "UpdateExternalProviderAsyncByInput", + "name": "UpdateExternalProviderAsync", + "httpMethod": "PUT", + "url": "api/account-admin/settings/external-provider", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.AccountExternalProviderSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts", + "type": "Volo.Abp.Account.AccountExternalProviderSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountExternalProviderSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.AccountExternalProviderSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountExternalProviderSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSettingsAppService" + }, + "GetIdleAsync": { + "uniqueName": "GetIdleAsync", + "name": "GetIdleAsync", + "httpMethod": "GET", + "url": "api/account-admin/settings/idle", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Account.AccountIdleSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountIdleSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSettingsAppService" + }, + "UpdateIdleAsyncByInput": { + "uniqueName": "UpdateIdleAsyncByInput", + "name": "UpdateIdleAsync", + "httpMethod": "PUT", + "url": "api/account-admin/settings/idle", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.AccountIdleSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts", + "type": "Volo.Abp.Account.AccountIdleSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountIdleSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.AccountIdleSettingsDto", + "typeSimple": "Volo.Abp.Account.AccountIdleSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountSettingsAppService" + } + } + } + } + }, + "auditLogging": { + "rootPath": "auditLogging", + "remoteServiceName": "AbpAuditLogging", + "controllers": { + "Volo.Abp.AuditLogging.AuditLogsController": { + "controllerName": "AuditLogs", + "controllerGroupName": "AuditLogs", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.AuditLogging.AuditLogsController", + "interfaces": [ + { + "type": "Volo.Abp.AuditLogging.IAuditLogsAppService", + "name": "IAuditLogsAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.GetAuditLogListDto, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.GetAuditLogListDto", + "typeSimple": "Volo.Abp.AuditLogging.GetAuditLogListDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.AuditLogDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogDto" + } + }, + { + "name": "GetErrorRateAsync", + "parametersOnMethod": [ + { + "name": "filter", + "typeAsString": "Volo.Abp.AuditLogging.GetErrorRateFilter, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.GetErrorRateFilter", + "typeSimple": "Volo.Abp.AuditLogging.GetErrorRateFilter", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.GetErrorRateOutput", + "typeSimple": "Volo.Abp.AuditLogging.GetErrorRateOutput" + } + }, + { + "name": "GetAverageExecutionDurationPerDayAsync", + "parametersOnMethod": [ + { + "name": "filter", + "typeAsString": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput", + "typeSimple": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayOutput", + "typeSimple": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayOutput" + } + }, + { + "name": "GetEntityChangesAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.GetEntityChangesDto, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.GetEntityChangesDto", + "typeSimple": "Volo.Abp.AuditLogging.GetEntityChangesDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetEntityChangesWithUsernameAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.EntityChangeFilter, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.EntityChangeFilter", + "typeSimple": "Volo.Abp.AuditLogging.EntityChangeFilter", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.AuditLogging.EntityChangeWithUsernameDto]" + } + }, + { + "name": "GetEntityChangeWithUsernameAsync", + "parametersOnMethod": [ + { + "name": "entityChangeId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.EntityChangeWithUsernameDto", + "typeSimple": "Volo.Abp.AuditLogging.EntityChangeWithUsernameDto" + } + }, + { + "name": "GetEntityChangeAsync", + "parametersOnMethod": [ + { + "name": "entityChangeId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.EntityChangeDto", + "typeSimple": "Volo.Abp.AuditLogging.EntityChangeDto" + } + }, + { + "name": "ExportToExcelAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.ExportAuditLogsInput, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.ExportAuditLogsInput", + "typeSimple": "Volo.Abp.AuditLogging.ExportAuditLogsInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.ExportAuditLogsOutput", + "typeSimple": "Volo.Abp.AuditLogging.ExportAuditLogsOutput" + } + }, + { + "name": "DownloadExcelAsync", + "parametersOnMethod": [ + { + "name": "fileName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "ExportEntityChangesToExcelAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.ExportEntityChangesInput, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.ExportEntityChangesInput", + "typeSimple": "Volo.Abp.AuditLogging.ExportEntityChangesInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.ExportEntityChangesOutput", + "typeSimple": "Volo.Abp.AuditLogging.ExportEntityChangesOutput" + } + } + ] + } + ], + "actions": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.GetAuditLogListDto, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.GetAuditLogListDto", + "typeSimple": "Volo.Abp.AuditLogging.GetAuditLogListDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "StartTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EndTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ApplicationName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ClientIpAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "CorrelationId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "HttpMethod", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "HttpStatusCode", + "jsonName": null, + "type": "System.Net.HttpStatusCode?", + "typeSimple": "enum?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxExecutionDuration", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MinExecutionDuration", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "HasException", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "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.AuditLogging.IAuditLogsAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs/{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.AuditLogging.AuditLogDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogsAppService" + }, + "GetErrorRateAsyncByFilter": { + "uniqueName": "GetErrorRateAsyncByFilter", + "name": "GetErrorRateAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs/statistics/error-rate", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "filter", + "typeAsString": "Volo.Abp.AuditLogging.GetErrorRateFilter, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.GetErrorRateFilter", + "typeSimple": "Volo.Abp.AuditLogging.GetErrorRateFilter", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "filter", + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "filter" + }, + { + "nameOnMethod": "filter", + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "filter" + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.GetErrorRateOutput", + "typeSimple": "Volo.Abp.AuditLogging.GetErrorRateOutput" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogsAppService" + }, + "GetAverageExecutionDurationPerDayAsyncByFilter": { + "uniqueName": "GetAverageExecutionDurationPerDayAsyncByFilter", + "name": "GetAverageExecutionDurationPerDayAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs/statistics/average-execution-duration-per-day", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "filter", + "typeAsString": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput", + "typeSimple": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "filter", + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "filter" + }, + { + "nameOnMethod": "filter", + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "filter" + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayOutput", + "typeSimple": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayOutput" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogsAppService" + }, + "GetEntityChangesAsyncByInput": { + "uniqueName": "GetEntityChangesAsyncByInput", + "name": "GetEntityChangesAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs/entity-changes", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.GetEntityChangesDto, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.GetEntityChangesDto", + "typeSimple": "Volo.Abp.AuditLogging.GetEntityChangesDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "AuditLogId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityChangeType", + "jsonName": null, + "type": "Volo.Abp.Auditing.EntityChangeType?", + "typeSimple": "enum?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityTypeFullName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime?", + "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.AuditLogging.IAuditLogsAppService" + }, + "GetEntityChangesWithUsernameAsyncByInput": { + "uniqueName": "GetEntityChangesWithUsernameAsyncByInput", + "name": "GetEntityChangesWithUsernameAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs/entity-changes-with-username", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.EntityChangeFilter, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.EntityChangeFilter", + "typeSimple": "Volo.Abp.AuditLogging.EntityChangeFilter", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityTypeFullName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.AuditLogging.EntityChangeWithUsernameDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogsAppService" + }, + "GetEntityChangeWithUsernameAsyncByEntityChangeId": { + "uniqueName": "GetEntityChangeWithUsernameAsyncByEntityChangeId", + "name": "GetEntityChangeWithUsernameAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs/entity-change-with-username/{entityChangeId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityChangeId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityChangeId", + "name": "entityChangeId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.EntityChangeWithUsernameDto", + "typeSimple": "Volo.Abp.AuditLogging.EntityChangeWithUsernameDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogsAppService" + }, + "GetEntityChangeAsyncByEntityChangeId": { + "uniqueName": "GetEntityChangeAsyncByEntityChangeId", + "name": "GetEntityChangeAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs/entity-changes/{entityChangeId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityChangeId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityChangeId", + "name": "entityChangeId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.EntityChangeDto", + "typeSimple": "Volo.Abp.AuditLogging.EntityChangeDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogsAppService" + }, + "ExportToExcelAsyncByInput": { + "uniqueName": "ExportToExcelAsyncByInput", + "name": "ExportToExcelAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs/export-to-excel", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.ExportAuditLogsInput, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.ExportAuditLogsInput", + "typeSimple": "Volo.Abp.AuditLogging.ExportAuditLogsInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "StartTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EndTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ApplicationName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ClientIpAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "CorrelationId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "HttpMethod", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "HttpStatusCode", + "jsonName": null, + "type": "System.Net.HttpStatusCode?", + "typeSimple": "enum?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxExecutionDuration", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MinExecutionDuration", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "HasException", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "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" + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.ExportAuditLogsOutput", + "typeSimple": "Volo.Abp.AuditLogging.ExportAuditLogsOutput" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogsAppService" + }, + "DownloadExcelAsyncByFileName": { + "uniqueName": "DownloadExcelAsyncByFileName", + "name": "DownloadExcelAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs/download-excel/{fileName}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "fileName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "fileName", + "name": "fileName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogsAppService" + }, + "ExportEntityChangesToExcelAsyncByInput": { + "uniqueName": "ExportEntityChangesToExcelAsyncByInput", + "name": "ExportEntityChangesToExcelAsync", + "httpMethod": "GET", + "url": "api/audit-logging/audit-logs/export-entity-changes-to-excel", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.ExportEntityChangesInput, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.ExportEntityChangesInput", + "typeSimple": "Volo.Abp.AuditLogging.ExportEntityChangesInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityChangeType", + "jsonName": null, + "type": "Volo.Abp.Auditing.EntityChangeType?", + "typeSimple": "enum?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityTypeFullName", + "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" + } + ], + "returnValue": { + "type": "Volo.Abp.AuditLogging.ExportEntityChangesOutput", + "typeSimple": "Volo.Abp.AuditLogging.ExportEntityChangesOutput" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogsAppService" + } + } + }, + "Volo.Abp.AuditLogging.AuditLogSettingsController": { + "controllerName": "AuditLogSettings", + "controllerGroupName": "Settings", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.AuditLogging.AuditLogSettingsController", + "interfaces": [ + { + "type": "Volo.Abp.AuditLogging.IAuditLogSettingsAppService", + "name": "IAuditLogSettingsAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.AuditLogging.AuditLogSettingsDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogSettingsDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.AuditLogSettingsDto, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.AuditLogSettingsDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetGlobalAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto" + } + }, + { + "name": "UpdateGlobalAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/audit-logging/settings", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.AuditLogging.AuditLogSettingsDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogSettingsAppService" + }, + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/audit-logging/settings", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.AuditLogSettingsDto, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.AuditLogSettingsDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.AuditLogging.AuditLogSettingsDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogSettingsAppService" + }, + "GetGlobalAsync": { + "uniqueName": "GetGlobalAsync", + "name": "GetGlobalAsync", + "httpMethod": "GET", + "url": "api/audit-logging/settings/global", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogSettingsAppService" + }, + "UpdateGlobalAsyncByInput": { + "uniqueName": "UpdateGlobalAsyncByInput", + "name": "UpdateGlobalAsync", + "httpMethod": "PUT", + "url": "api/audit-logging/settings/global", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto, Volo.Abp.AuditLogging.Application.Contracts", + "type": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto", + "typeSimple": "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AuditLogging.IAuditLogSettingsAppService" + } + } + } + } + }, + "cms-kit": { + "rootPath": "cms-kit", + "remoteServiceName": "CmsKitPublic", + "controllers": { + "Volo.CmsKit.Public.Blogs.BlogPostPublicController": { + "controllerName": "BlogPostPublic", + "controllerGroupName": "BlogPostPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Blogs.BlogPostPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService", + "name": "IBlogPostPublicAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "blogSlug", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Blogs.BlogPostGetListInput, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Blogs.BlogPostGetListInput", + "typeSimple": "Volo.CmsKit.Public.Blogs.BlogPostGetListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "blogSlug", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "blogPostSlug", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Contents.BlogPostCommonDto", + "typeSimple": "Volo.CmsKit.Contents.BlogPostCommonDto" + } + }, + { + "name": "GetAuthorsHasBlogPostsAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto", + "typeSimple": "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetAuthorHasBlogPostAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Users.CmsUserDto", + "typeSimple": "Volo.CmsKit.Users.CmsUserDto" + } + }, + { + "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" + } + }, + { + "name": "GetTagNameAsync", + "parametersOnMethod": [ + { + "name": "tagId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + } + } + ] + } + ], + "actions": { + "GetAsyncByBlogSlugAndBlogPostSlug": { + "uniqueName": "GetAsyncByBlogSlugAndBlogPostSlug", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/blog-posts/{blogSlug}/{blogPostSlug}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "blogSlug", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "blogPostSlug", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "blogSlug", + "name": "blogSlug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "blogPostSlug", + "name": "blogPostSlug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Contents.BlogPostCommonDto", + "typeSimple": "Volo.CmsKit.Contents.BlogPostCommonDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" + }, + "GetListAsyncByBlogSlugAndInput": { + "uniqueName": "GetListAsyncByBlogSlugAndInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/blog-posts/{blogSlug}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "blogSlug", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Blogs.BlogPostGetListInput, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Blogs.BlogPostGetListInput", + "typeSimple": "Volo.CmsKit.Public.Blogs.BlogPostGetListInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "blogSlug", + "name": "blogSlug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "input", + "name": "AuthorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "TagId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "FilterOnFavorites", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "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.CmsKit.Public.Blogs.IBlogPostPublicAppService" + }, + "GetAuthorsHasBlogPostsAsyncByInput": { + "uniqueName": "GetAuthorsHasBlogPostsAsyncByInput", + "name": "GetAuthorsHasBlogPostsAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/blog-posts/authors", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto", + "typeSimple": "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto", + "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.CmsKit.Public.Blogs.IBlogPostPublicAppService" + }, + "GetAuthorHasBlogPostAsyncById": { + "uniqueName": "GetAuthorHasBlogPostAsyncById", + "name": "GetAuthorHasBlogPostAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/blog-posts/authors/{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.CmsKit.Users.CmsUserDto", + "typeSimple": "Volo.CmsKit.Users.CmsUserDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-public/blog-posts/{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.CmsKit.Public.Blogs.IBlogPostPublicAppService" + }, + "GetTagNameAsyncByTagId": { + "uniqueName": "GetTagNameAsyncByTagId", + "name": "GetTagNameAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/blog-posts/tags/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "tagId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "tagId", + "name": "tagId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": null, + "typeSimple": null, + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" + } + } + }, + "Volo.CmsKit.Public.Comments.CommentPublicController": { + "controllerName": "CommentPublic", + "controllerGroupName": "CommentPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Comments.CommentPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.Comments.ICommentPublicAppService", + "name": "ICommentPublicAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Comments.CreateCommentInput, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Comments.CreateCommentInput", + "typeSimple": "Volo.CmsKit.Public.Comments.CreateCommentInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Comments.CommentDto", + "typeSimple": "Volo.CmsKit.Public.Comments.CommentDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Comments.UpdateCommentInput, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Comments.UpdateCommentInput", + "typeSimple": "Volo.CmsKit.Public.Comments.UpdateCommentInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Comments.CommentDto", + "typeSimple": "Volo.CmsKit.Public.Comments.CommentDto" + } + }, + { + "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": { + "GetListAsyncByEntityTypeAndEntityId": { + "uniqueName": "GetListAsyncByEntityTypeAndEntityId", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/comments/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Comments.ICommentPublicAppService" + }, + "CreateAsyncByEntityTypeAndEntityIdAndInput": { + "uniqueName": "CreateAsyncByEntityTypeAndEntityIdAndInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-public/comments/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Comments.CreateCommentInput, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Comments.CreateCommentInput", + "typeSimple": "Volo.CmsKit.Public.Comments.CreateCommentInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Public.Comments.CreateCommentInput", + "typeSimple": "Volo.CmsKit.Public.Comments.CreateCommentInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Comments.CommentDto", + "typeSimple": "Volo.CmsKit.Public.Comments.CommentDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Comments.ICommentPublicAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-public/comments/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Comments.UpdateCommentInput, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Comments.UpdateCommentInput", + "typeSimple": "Volo.CmsKit.Public.Comments.UpdateCommentInput", + "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.CmsKit.Public.Comments.UpdateCommentInput", + "typeSimple": "Volo.CmsKit.Public.Comments.UpdateCommentInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Comments.CommentDto", + "typeSimple": "Volo.CmsKit.Public.Comments.CommentDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Comments.ICommentPublicAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-public/comments/{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.CmsKit.Public.Comments.ICommentPublicAppService" + } + } + }, + "Volo.CmsKit.Public.GlobalResources.GlobalResourcePublicController": { + "controllerName": "GlobalResourcePublic", + "controllerGroupName": "GlobalResourcePublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.GlobalResources.GlobalResourcePublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.GlobalResources.IGlobalResourcePublicAppService", + "name": "IGlobalResourcePublicAppService", + "methods": [ + { + "name": "GetGlobalScriptAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto", + "typeSimple": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto" + } + }, + { + "name": "GetGlobalStyleAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto", + "typeSimple": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto" + } + } + ] + } + ], + "actions": { + "GetGlobalScriptAsync": { + "uniqueName": "GetGlobalScriptAsync", + "name": "GetGlobalScriptAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/global-resources/script", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto", + "typeSimple": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.GlobalResources.IGlobalResourcePublicAppService" + }, + "GetGlobalStyleAsync": { + "uniqueName": "GetGlobalStyleAsync", + "name": "GetGlobalStyleAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/global-resources/style", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto", + "typeSimple": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.GlobalResources.IGlobalResourcePublicAppService" + } + } + }, + "Volo.CmsKit.Public.MarkedItems.MarkedItemPublicController": { + "controllerName": "MarkedItemPublic", + "controllerGroupName": "MarkedItemPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.MarkedItems.MarkedItemPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.MarkedItems.IMarkedItemPublicAppService", + "name": "IMarkedItemPublicAppService", + "methods": [ + { + "name": "GetForUserAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.MarkedItems.MarkedItemWithToggleDto", + "typeSimple": "Volo.CmsKit.Public.MarkedItems.MarkedItemWithToggleDto" + } + }, + { + "name": "ToggleAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + } + ] + } + ], + "actions": { + "GetForUserAsyncByEntityTypeAndEntityId": { + "uniqueName": "GetForUserAsyncByEntityTypeAndEntityId", + "name": "GetForUserAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/marked-items/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.MarkedItems.MarkedItemWithToggleDto", + "typeSimple": "Volo.CmsKit.Public.MarkedItems.MarkedItemWithToggleDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.MarkedItems.IMarkedItemPublicAppService" + }, + "ToggleAsyncByEntityTypeAndEntityId": { + "uniqueName": "ToggleAsyncByEntityTypeAndEntityId", + "name": "ToggleAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-public/marked-items/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.MarkedItems.IMarkedItemPublicAppService" + } + } + }, + "Volo.CmsKit.Public.Menus.MenuItemPublicController": { + "controllerName": "MenuItemPublic", + "controllerGroupName": "MenuItemPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Menus.MenuItemPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.Menus.IMenuItemPublicAppService", + "name": "IMenuItemPublicAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Menus.MenuItemDto]" + } + } + ] + } + ], + "actions": { + "GetListAsync": { + "uniqueName": "GetListAsync", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/menu-items", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Menus.MenuItemDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Menus.IMenuItemPublicAppService" + } + } + }, + "Volo.CmsKit.Public.Pages.PagesPublicController": { + "controllerName": "PagesPublic", + "controllerGroupName": "PagesPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Pages.PagesPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.Pages.IPagePublicAppService", + "name": "IPagePublicAppService", + "methods": [ + { + "name": "FindBySlugAsync", + "parametersOnMethod": [ + { + "name": "slug", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Contents.PageDto", + "typeSimple": "Volo.CmsKit.Contents.PageDto" + } + }, + { + "name": "DoesSlugExistAsync", + "parametersOnMethod": [ + { + "name": "slug", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "FindDefaultHomePageAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.CmsKit.Contents.PageDto", + "typeSimple": "Volo.CmsKit.Contents.PageDto" + } + } + ] + } + ], + "actions": { + "FindBySlugAsyncBySlug": { + "uniqueName": "FindBySlugAsyncBySlug", + "name": "FindBySlugAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/pages/by-slug", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "slug", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "slug", + "name": "slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Contents.PageDto", + "typeSimple": "Volo.CmsKit.Contents.PageDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Pages.IPagePublicAppService" + }, + "FindDefaultHomePageAsync": { + "uniqueName": "FindDefaultHomePageAsync", + "name": "FindDefaultHomePageAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/pages/home", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Contents.PageDto", + "typeSimple": "Volo.CmsKit.Contents.PageDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Pages.IPagePublicAppService" + }, + "DoesSlugExistAsyncBySlug": { + "uniqueName": "DoesSlugExistAsyncBySlug", + "name": "DoesSlugExistAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/pages/exist", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "slug", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "slug", + "name": "slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Pages.IPagePublicAppService" + } + } + }, + "Volo.CmsKit.Public.Ratings.RatingPublicController": { + "controllerName": "RatingPublic", + "controllerGroupName": "RatingPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Ratings.RatingPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.Ratings.IRatingPublicAppService", + "name": "IRatingPublicAppService", + "methods": [ + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Ratings.CreateUpdateRatingInput, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Ratings.CreateUpdateRatingInput", + "typeSimple": "Volo.CmsKit.Public.Ratings.CreateUpdateRatingInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Ratings.RatingDto", + "typeSimple": "Volo.CmsKit.Public.Ratings.RatingDto" + } + }, + { + "name": "DeleteAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetGroupedStarCountsAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Public.Ratings.RatingWithStarCountDto]" + } + } + ] + } + ], + "actions": { + "CreateAsyncByEntityTypeAndEntityIdAndInput": { + "uniqueName": "CreateAsyncByEntityTypeAndEntityIdAndInput", + "name": "CreateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-public/ratings/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Ratings.CreateUpdateRatingInput, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Ratings.CreateUpdateRatingInput", + "typeSimple": "Volo.CmsKit.Public.Ratings.CreateUpdateRatingInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Public.Ratings.CreateUpdateRatingInput", + "typeSimple": "Volo.CmsKit.Public.Ratings.CreateUpdateRatingInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Ratings.RatingDto", + "typeSimple": "Volo.CmsKit.Public.Ratings.RatingDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Ratings.IRatingPublicAppService" + }, + "DeleteAsyncByEntityTypeAndEntityId": { + "uniqueName": "DeleteAsyncByEntityTypeAndEntityId", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-public/ratings/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Ratings.IRatingPublicAppService" + }, + "GetGroupedStarCountsAsyncByEntityTypeAndEntityId": { + "uniqueName": "GetGroupedStarCountsAsyncByEntityTypeAndEntityId", + "name": "GetGroupedStarCountsAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/ratings/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Public.Ratings.RatingWithStarCountDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Ratings.IRatingPublicAppService" + } + } + }, + "Volo.CmsKit.Public.Reactions.ReactionPublicController": { + "controllerName": "ReactionPublic", + "controllerGroupName": "ReactionPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Reactions.ReactionPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.Reactions.IReactionPublicAppService", + "name": "IReactionPublicAppService", + "methods": [ + { + "name": "GetForSelectionAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "reaction", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "DeleteAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "reaction", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetForSelectionAsyncByEntityTypeAndEntityId": { + "uniqueName": "GetForSelectionAsyncByEntityTypeAndEntityId", + "name": "GetForSelectionAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/reactions/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Reactions.IReactionPublicAppService" + }, + "CreateAsyncByEntityTypeAndEntityIdAndReaction": { + "uniqueName": "CreateAsyncByEntityTypeAndEntityIdAndReaction", + "name": "CreateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-public/reactions/{entityType}/{entityId}/{reaction}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "reaction", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "reaction", + "name": "reaction", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Reactions.IReactionPublicAppService" + }, + "DeleteAsyncByEntityTypeAndEntityIdAndReaction": { + "uniqueName": "DeleteAsyncByEntityTypeAndEntityIdAndReaction", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-public/reactions/{entityType}/{entityId}/{reaction}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "reaction", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "reaction", + "name": "reaction", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Reactions.IReactionPublicAppService" + } + } + }, + "Volo.CmsKit.Public.Tags.TagPublicController": { + "controllerName": "TagPublic", + "controllerGroupName": "TagPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Tags.TagPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Tags.ITagAppService", + "name": "ITagAppService", + "methods": [ + { + "name": "GetAllRelatedTagsAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Tags.TagDto]" + } + }, + { + "name": "GetPopularTagsAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "maxCount", + "typeAsString": "System.Int32, System.Private.CoreLib", + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Tags.PopularTagDto]" + } + } + ] + } + ], + "actions": { + "GetAllRelatedTagsAsyncByEntityTypeAndEntityId": { + "uniqueName": "GetAllRelatedTagsAsyncByEntityTypeAndEntityId", + "name": "GetAllRelatedTagsAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/tags/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Tags.TagDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Tags.ITagAppService" + }, + "GetPopularTagsAsyncByEntityTypeAndMaxCount": { + "uniqueName": "GetPopularTagsAsyncByEntityTypeAndMaxCount", + "name": "GetPopularTagsAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/tags/popular/{entityType}/{maxCount}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "maxCount", + "typeAsString": "System.Int32, System.Private.CoreLib", + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "maxCount", + "name": "maxCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [ + "IntRouteConstraint" + ], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Tags.PopularTagDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Tags.ITagAppService" + } + } + } + } + }, + "cms-kit-admin": { + "rootPath": "cms-kit-admin", + "remoteServiceName": "CmsKitAdmin", + "controllers": { + "Volo.CmsKit.Admin.Blogs.BlogAdminController": { + "controllerName": "BlogAdmin", + "controllerGroupName": "BlogAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Blogs.BlogAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Blogs.IBlogAdminAppService", + "name": "IBlogAdminAppService", + "methods": [ + { + "name": "GetAllListAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "MoveAllBlogPostsAsync", + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "assignToBlogId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib", + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": true, + "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.CmsKit.Admin.Blogs.BlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.BlogGetListInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.BlogGetListInput", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogGetListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.CreateBlogDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.UpdateBlogDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.UpdateBlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.UpdateBlogDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogDto" + } + }, + { + "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/cms-kit-admin/blogs/{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.CmsKit.Admin.Blogs.BlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/blogs", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.BlogGetListInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.BlogGetListInput", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogGetListInput", + "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": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/blogs", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.CreateBlogDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/blogs/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.UpdateBlogDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.UpdateBlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.UpdateBlogDto", + "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.CmsKit.Admin.Blogs.UpdateBlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.UpdateBlogDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/blogs/{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": false, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "GetAllListAsync": { + "uniqueName": "GetAllListAsync", + "name": "GetAllListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/blogs/all", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogAdminAppService" + }, + "MoveAllBlogPostsAsyncByBlogIdAndAssignToBlogId": { + "uniqueName": "MoveAllBlogPostsAsyncByBlogIdAndAssignToBlogId", + "name": "MoveAllBlogPostsAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/blogs/{id}/move-all-blog-posts", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "assignToBlogId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib", + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "blogId", + "name": "blogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "assignToBlogId", + "name": "assignToBlogId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "" + }, + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": null, + "typeSimple": null, + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.Blogs.BlogFeatureAdminController": { + "controllerName": "BlogFeatureAdmin", + "controllerGroupName": "BlogFeatureAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Blogs.BlogFeatureAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Blogs.IBlogFeatureAdminAppService", + "name": "IBlogFeatureAdminAppService", + "methods": [ + { + "name": "SetAsync", + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "dto", + "typeAsString": "Volo.CmsKit.Admin.Blogs.BlogFeatureInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.BlogFeatureInputDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogFeatureInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Blogs.BlogFeatureDto]" + } + } + ] + } + ], + "actions": { + "GetListAsyncByBlogId": { + "uniqueName": "GetListAsyncByBlogId", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/blogs/{blogId}/features", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "blogId", + "name": "blogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Blogs.BlogFeatureDto]" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogFeatureAdminAppService" + }, + "SetAsyncByBlogIdAndDto": { + "uniqueName": "SetAsyncByBlogIdAndDto", + "name": "SetAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/blogs/{blogId}/features", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "dto", + "typeAsString": "Volo.CmsKit.Admin.Blogs.BlogFeatureInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.BlogFeatureInputDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogFeatureInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "blogId", + "name": "blogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "dto", + "name": "dto", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Blogs.BlogFeatureInputDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogFeatureInputDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogFeatureAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.Blogs.BlogPostAdminController": { + "controllerName": "BlogPostAdmin", + "controllerGroupName": "BlogPostAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Blogs.BlogPostAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Blogs.IBlogPostAdminAppService", + "name": "IBlogPostAdminAppService", + "methods": [ + { + "name": "PublishAsync", + "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": "DraftAsync", + "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": "CreateAndPublishAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostDto" + } + }, + { + "name": "SendToReviewAsync", + "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": "CreateAndSendToReviewAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostDto" + } + }, + { + "name": "HasBlogPostWaitingForReviewAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.BlogPostGetListInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.BlogPostGetListInput", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostGetListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostDto" + } + }, + { + "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": { + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/blogs/blog-posts", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/blogs/blog-posts/{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": false, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/blogs/blog-posts/{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": [ + "GuidRouteConstraint" + ], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/blogs/blog-posts", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.BlogPostGetListInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.BlogPostGetListInput", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostGetListInput", + "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": "BlogId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "AuthorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "TagId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Blogs.BlogPostStatus?", + "typeSimple": "enum?", + "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": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/blogs/blog-posts/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto", + "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.CmsKit.Admin.Blogs.UpdateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "PublishAsyncById": { + "uniqueName": "PublishAsyncById", + "name": "PublishAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/blogs/blog-posts/{id}/publish", + "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": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogPostAdminAppService" + }, + "DraftAsyncById": { + "uniqueName": "DraftAsyncById", + "name": "DraftAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/blogs/blog-posts/{id}/draft", + "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": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogPostAdminAppService" + }, + "CreateAndPublishAsyncByInput": { + "uniqueName": "CreateAndPublishAsyncByInput", + "name": "CreateAndPublishAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/blogs/blog-posts/create-and-publish", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogPostAdminAppService" + }, + "SendToReviewAsyncById": { + "uniqueName": "SendToReviewAsyncById", + "name": "SendToReviewAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/blogs/blog-posts/{id}/send-to-review", + "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": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogPostAdminAppService" + }, + "CreateAndSendToReviewAsyncByInput": { + "uniqueName": "CreateAndSendToReviewAsyncByInput", + "name": "CreateAndSendToReviewAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/blogs/blog-posts/create-and-send-to-review", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Blogs.BlogPostDto", + "typeSimple": "Volo.CmsKit.Admin.Blogs.BlogPostDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogPostAdminAppService" + }, + "HasBlogPostWaitingForReviewAsync": { + "uniqueName": "HasBlogPostWaitingForReviewAsync", + "name": "HasBlogPostWaitingForReviewAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/blogs/blog-posts/has-blogpost-waiting-for-review", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogPostAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.Comments.CommentAdminController": { + "controllerName": "CommentAdmin", + "controllerGroupName": "CommentAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Comments.CommentAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Comments.ICommentAdminAppService", + "name": "ICommentAdminAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Comments.CommentGetListInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Comments.CommentGetListInput", + "typeSimple": "Volo.CmsKit.Admin.Comments.CommentGetListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Comments.CommentWithAuthorDto", + "typeSimple": "Volo.CmsKit.Admin.Comments.CommentWithAuthorDto" + } + }, + { + "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" + } + }, + { + "name": "UpdateApprovalStatusAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Comments.CommentApprovalDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Comments.CommentApprovalDto", + "typeSimple": "Volo.CmsKit.Admin.Comments.CommentApprovalDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "UpdateSettingsAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Comments.CommentSettingsDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Comments.CommentSettingsDto", + "typeSimple": "Volo.CmsKit.Admin.Comments.CommentSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetWaitingCountAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Int32", + "typeSimple": "number" + } + } + ] + } + ], + "actions": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/comments", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Comments.CommentGetListInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Comments.CommentGetListInput", + "typeSimple": "Volo.CmsKit.Admin.Comments.CommentGetListInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "RepliedCommentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Author", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "CreationStartDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "CreationEndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "CommentApproveState", + "jsonName": null, + "type": "Volo.CmsKit.Comments.CommentApproveState", + "typeSimple": "enum", + "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": false, + "implementFrom": "Volo.CmsKit.Admin.Comments.ICommentAdminAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/comments/{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.CmsKit.Admin.Comments.CommentWithAuthorDto", + "typeSimple": "Volo.CmsKit.Admin.Comments.CommentWithAuthorDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Comments.ICommentAdminAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/comments/{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": false, + "implementFrom": "Volo.CmsKit.Admin.Comments.ICommentAdminAppService" + }, + "UpdateApprovalStatusAsyncByIdAndInput": { + "uniqueName": "UpdateApprovalStatusAsyncByIdAndInput", + "name": "UpdateApprovalStatusAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/comments/{id}/approval-status", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Comments.CommentApprovalDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Comments.CommentApprovalDto", + "typeSimple": "Volo.CmsKit.Admin.Comments.CommentApprovalDto", + "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.CmsKit.Admin.Comments.CommentApprovalDto", + "typeSimple": "Volo.CmsKit.Admin.Comments.CommentApprovalDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Comments.ICommentAdminAppService" + }, + "UpdateSettingsAsyncByInput": { + "uniqueName": "UpdateSettingsAsyncByInput", + "name": "UpdateSettingsAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/comments/settings", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Comments.CommentSettingsDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Comments.CommentSettingsDto", + "typeSimple": "Volo.CmsKit.Admin.Comments.CommentSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Comments.CommentSettingsDto", + "typeSimple": "Volo.CmsKit.Admin.Comments.CommentSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Comments.ICommentAdminAppService" + }, + "GetWaitingCountAsync": { + "uniqueName": "GetWaitingCountAsync", + "name": "GetWaitingCountAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/comments/waiting-count", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Int32", + "typeSimple": "number" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Comments.ICommentAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.GlobalResources.GlobalResourceAdminController": { + "controllerName": "GlobalResourceAdmin", + "controllerGroupName": "GlobalResourceAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.GlobalResources.GlobalResourceAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.GlobalResources.IGlobalResourceAdminAppService", + "name": "IGlobalResourceAdminAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesDto", + "typeSimple": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesDto" + } + }, + { + "name": "SetGlobalResourcesAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesUpdateDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesUpdateDto", + "typeSimple": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesUpdateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/global-resources", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesDto", + "typeSimple": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.GlobalResources.IGlobalResourceAdminAppService" + }, + "SetGlobalResourcesAsyncByInput": { + "uniqueName": "SetGlobalResourcesAsyncByInput", + "name": "SetGlobalResourcesAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/global-resources", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesUpdateDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesUpdateDto", + "typeSimple": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesUpdateDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesUpdateDto", + "typeSimple": "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesUpdateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.GlobalResources.IGlobalResourceAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.MediaDescriptors.MediaDescriptorAdminController": { + "controllerName": "MediaDescriptorAdmin", + "controllerGroupName": "MediaDescriptorAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.MediaDescriptors.MediaDescriptorAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.MediaDescriptors.IMediaDescriptorAdminAppService", + "name": "IMediaDescriptorAdminAppService", + "methods": [ + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "inputStream", + "typeAsString": "Volo.CmsKit.Admin.MediaDescriptors.CreateMediaInputWithStream, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.MediaDescriptors.CreateMediaInputWithStream", + "typeSimple": "Volo.CmsKit.Admin.MediaDescriptors.CreateMediaInputWithStream", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.MediaDescriptors.MediaDescriptorDto", + "typeSimple": "Volo.CmsKit.Admin.MediaDescriptors.MediaDescriptorDto" + } + }, + { + "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": { + "CreateAsyncByEntityTypeAndInputStream": { + "uniqueName": "CreateAsyncByEntityTypeAndInputStream", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/media/{entityType}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "inputStream", + "typeAsString": "Volo.CmsKit.Admin.MediaDescriptors.CreateMediaInputWithStream, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.MediaDescriptors.CreateMediaInputWithStream", + "typeSimple": "Volo.CmsKit.Admin.MediaDescriptors.CreateMediaInputWithStream", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "inputStream", + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "inputStream" + }, + { + "nameOnMethod": "inputStream", + "name": "File", + "jsonName": null, + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "FormFile", + "descriptorName": "inputStream" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.MediaDescriptors.MediaDescriptorDto", + "typeSimple": "Volo.CmsKit.Admin.MediaDescriptors.MediaDescriptorDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Admin.MediaDescriptors.IMediaDescriptorAdminAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/media/{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.CmsKit.Admin.MediaDescriptors.IMediaDescriptorAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.Menus.MenuItemAdminController": { + "controllerName": "MenuItemAdmin", + "controllerGroupName": "MenuItemAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Menus.MenuItemAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService", + "name": "IMenuItemAdminAppService", + "methods": [ + { + "name": "GetListAsync", + "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.CmsKit.Admin.Menus.MenuItemWithDetailsDto", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemWithDetailsDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Menus.MenuItemCreateInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Menus.MenuItemCreateInput", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemCreateInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Menus.MenuItemDto", + "typeSimple": "Volo.CmsKit.Menus.MenuItemDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Menus.MenuItemUpdateInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Menus.MenuItemUpdateInput", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemUpdateInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Menus.MenuItemDto", + "typeSimple": "Volo.CmsKit.Menus.MenuItemDto" + } + }, + { + "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" + } + }, + { + "name": "MoveMenuItemAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Menus.MenuItemMoveInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Menus.MenuItemMoveInput", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemMoveInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetPageLookupAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Menus.PageLookupInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Menus.PageLookupInputDto", + "typeSimple": "Volo.CmsKit.Admin.Menus.PageLookupInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetPermissionLookupAsync", + "parametersOnMethod": [ + { + "name": "inputDto", + "typeAsString": "Volo.CmsKit.Admin.Menus.PermissionLookupInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Menus.PermissionLookupInputDto", + "typeSimple": "Volo.CmsKit.Admin.Menus.PermissionLookupInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "GetAvailableMenuOrderAsync", + "parametersOnMethod": [ + { + "name": "parentId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib", + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": true, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Int32", + "typeSimple": "number" + } + } + ] + } + ], + "actions": { + "GetListAsync": { + "uniqueName": "GetListAsync", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/menu-items", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/menu-items/{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.CmsKit.Admin.Menus.MenuItemWithDetailsDto", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemWithDetailsDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/menu-items", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Menus.MenuItemCreateInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Menus.MenuItemCreateInput", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemCreateInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Menus.MenuItemCreateInput", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemCreateInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Menus.MenuItemDto", + "typeSimple": "Volo.CmsKit.Menus.MenuItemDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/menu-items/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Menus.MenuItemUpdateInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Menus.MenuItemUpdateInput", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemUpdateInput", + "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.CmsKit.Admin.Menus.MenuItemUpdateInput", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemUpdateInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Menus.MenuItemDto", + "typeSimple": "Volo.CmsKit.Menus.MenuItemDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/menu-items/{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": false, + "implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService" + }, + "MoveMenuItemAsyncByIdAndInput": { + "uniqueName": "MoveMenuItemAsyncByIdAndInput", + "name": "MoveMenuItemAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/menu-items/{id}/move", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Menus.MenuItemMoveInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Menus.MenuItemMoveInput", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemMoveInput", + "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.CmsKit.Admin.Menus.MenuItemMoveInput", + "typeSimple": "Volo.CmsKit.Admin.Menus.MenuItemMoveInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService" + }, + "GetPageLookupAsyncByInput": { + "uniqueName": "GetPageLookupAsyncByInput", + "name": "GetPageLookupAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/menu-items/lookup/pages", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Menus.PageLookupInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Menus.PageLookupInputDto", + "typeSimple": "Volo.CmsKit.Admin.Menus.PageLookupInputDto", + "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": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Pages.PageStatus?", + "typeSimple": "enum?", + "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": false, + "implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService" + }, + "GetPermissionLookupAsyncByInputDto": { + "uniqueName": "GetPermissionLookupAsyncByInputDto", + "name": "GetPermissionLookupAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/menu-items/lookup/permissions", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "inputDto", + "typeAsString": "Volo.CmsKit.Admin.Menus.PermissionLookupInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Menus.PermissionLookupInputDto", + "typeSimple": "Volo.CmsKit.Admin.Menus.PermissionLookupInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "inputDto", + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "inputDto" + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService" + }, + "GetAvailableMenuOrderAsyncByParentId": { + "uniqueName": "GetAvailableMenuOrderAsyncByParentId", + "name": "GetAvailableMenuOrderAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/menu-items/available-order", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "parentId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib", + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": true, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "parentId", + "name": "parentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Int32", + "typeSimple": "number" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.Pages.PageAdminController": { + "controllerName": "PageAdmin", + "controllerGroupName": "PageAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Pages.PageAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Pages.IPageAdminAppService", + "name": "IPageAdminAppService", + "methods": [ + { + "name": "SetAsHomePageAsync", + "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.CmsKit.Admin.Pages.PageDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.PageDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Pages.GetPagesInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Pages.GetPagesInputDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.GetPagesInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Pages.CreatePageInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Pages.CreatePageInputDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.CreatePageInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Pages.PageDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.PageDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Pages.UpdatePageInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Pages.UpdatePageInputDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.UpdatePageInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Pages.PageDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.PageDto" + } + }, + { + "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/cms-kit-admin/pages/{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.CmsKit.Admin.Pages.PageDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.PageDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/pages", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Pages.GetPagesInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Pages.GetPagesInputDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.GetPagesInputDto", + "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": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Pages.PageStatus?", + "typeSimple": "enum?", + "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": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/pages", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Pages.CreatePageInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Pages.CreatePageInputDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.CreatePageInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Pages.CreatePageInputDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.CreatePageInputDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Pages.PageDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.PageDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/pages/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Pages.UpdatePageInputDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Pages.UpdatePageInputDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.UpdatePageInputDto", + "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.CmsKit.Admin.Pages.UpdatePageInputDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.UpdatePageInputDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Pages.PageDto", + "typeSimple": "Volo.CmsKit.Admin.Pages.PageDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/pages/{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": false, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "SetAsHomePageAsyncById": { + "uniqueName": "SetAsHomePageAsyncById", + "name": "SetAsHomePageAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/pages/setashomepage/{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": false, + "implementFrom": "Volo.CmsKit.Admin.Pages.IPageAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.Tags.EntityTagAdminController": { + "controllerName": "EntityTagAdmin", + "controllerGroupName": "EntityTagAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Tags.EntityTagAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Tags.IEntityTagAdminAppService", + "name": "IEntityTagAdminAppService", + "methods": [ + { + "name": "AddTagToEntityAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.EntityTagCreateDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.EntityTagCreateDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.EntityTagCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "RemoveTagFromEntityAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.EntityTagRemoveDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.EntityTagRemoveDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.EntityTagRemoveDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "SetEntityTagsAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.EntityTagSetDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.EntityTagSetDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.EntityTagSetDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "AddTagToEntityAsyncByInput": { + "uniqueName": "AddTagToEntityAsyncByInput", + "name": "AddTagToEntityAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/entity-tags", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.EntityTagCreateDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.EntityTagCreateDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.EntityTagCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Tags.EntityTagCreateDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.EntityTagCreateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Admin.Tags.IEntityTagAdminAppService" + }, + "RemoveTagFromEntityAsyncByInput": { + "uniqueName": "RemoveTagFromEntityAsyncByInput", + "name": "RemoveTagFromEntityAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/entity-tags", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.EntityTagRemoveDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.EntityTagRemoveDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.EntityTagRemoveDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "TagId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Admin.Tags.IEntityTagAdminAppService" + }, + "SetEntityTagsAsyncByInput": { + "uniqueName": "SetEntityTagsAsyncByInput", + "name": "SetEntityTagsAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/entity-tags", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.EntityTagSetDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.EntityTagSetDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.EntityTagSetDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Tags.EntityTagSetDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.EntityTagSetDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Admin.Tags.IEntityTagAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.Tags.TagAdminController": { + "controllerName": "TagAdmin", + "controllerGroupName": "TagAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Tags.TagAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Tags.ITagAdminAppService", + "name": "ITagAdminAppService", + "methods": [ + { + "name": "GetTagDefinitionsAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Admin.Tags.TagDefinitionDto]" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Tags.TagDto", + "typeSimple": "Volo.CmsKit.Tags.TagDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.TagGetListInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.TagGetListInput", + "typeSimple": "Volo.CmsKit.Admin.Tags.TagGetListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.TagCreateDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.TagCreateDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.TagCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Tags.TagDto", + "typeSimple": "Volo.CmsKit.Tags.TagDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.TagUpdateDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.TagUpdateDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.TagUpdateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Tags.TagDto", + "typeSimple": "Volo.CmsKit.Tags.TagDto" + } + }, + { + "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": { + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/tags", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.TagCreateDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.TagCreateDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.TagCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Tags.TagCreateDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.TagCreateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Tags.TagDto", + "typeSimple": "Volo.CmsKit.Tags.TagDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/tags/{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": false, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/tags/{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.CmsKit.Tags.TagDto", + "typeSimple": "Volo.CmsKit.Tags.TagDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/tags", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.TagGetListInput, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.TagGetListInput", + "typeSimple": "Volo.CmsKit.Admin.Tags.TagGetListInput", + "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": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/tags/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Tags.TagUpdateDto, Volo.CmsKit.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Tags.TagUpdateDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.TagUpdateDto", + "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.CmsKit.Admin.Tags.TagUpdateDto", + "typeSimple": "Volo.CmsKit.Admin.Tags.TagUpdateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Tags.TagDto", + "typeSimple": "Volo.CmsKit.Tags.TagDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "GetTagDefinitionsAsync": { + "uniqueName": "GetTagDefinitionsAsync", + "name": "GetTagDefinitionsAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/tags/tag-definitions", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Admin.Tags.TagDefinitionDto]" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Tags.ITagAdminAppService" + } + } + } + } + }, + "cms-kit-common": { + "rootPath": "cms-kit-common", + "remoteServiceName": "CmsKitCommon", + "controllers": { + "Volo.CmsKit.Blogs.BlogFeatureController": { + "controllerName": "BlogFeature", + "controllerGroupName": "BlogFeature", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Blogs.BlogFeatureController", + "interfaces": [ + { + "type": "Volo.CmsKit.Blogs.IBlogFeatureAppService", + "name": "IBlogFeatureAppService", + "methods": [ + { + "name": "GetOrDefaultAsync", + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "featureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Blogs.BlogFeatureDto", + "typeSimple": "Volo.CmsKit.Blogs.BlogFeatureDto" + } + } + ] + } + ], + "actions": { + "GetOrDefaultAsyncByBlogIdAndFeatureName": { + "uniqueName": "GetOrDefaultAsyncByBlogIdAndFeatureName", + "name": "GetOrDefaultAsync", + "httpMethod": "GET", + "url": "api/cms-kit/blogs/{blogId}/features/{featureName}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "featureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "blogId", + "name": "blogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "featureName", + "name": "featureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Blogs.BlogFeatureDto", + "typeSimple": "Volo.CmsKit.Blogs.BlogFeatureDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Blogs.IBlogFeatureAppService" + } + } + }, + "Volo.CmsKit.MediaDescriptors.MediaDescriptorController": { + "controllerName": "MediaDescriptor", + "controllerGroupName": "MediaDescriptor", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.MediaDescriptors.MediaDescriptorController", + "interfaces": [ + { + "type": "Volo.CmsKit.MediaDescriptors.IMediaDescriptorAppService", + "name": "IMediaDescriptorAppService", + "methods": [ + { + "name": "DownloadAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.RemoteStreamContent", + "typeSimple": "Volo.Abp.Content.RemoteStreamContent" + } + } + ] + } + ], + "actions": { + "DownloadAsyncById": { + "uniqueName": "DownloadAsyncById", + "name": "DownloadAsync", + "httpMethod": "GET", + "url": "api/cms-kit/media/{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.Content.RemoteStreamContent", + "typeSimple": "Volo.Abp.Content.RemoteStreamContent" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.MediaDescriptors.IMediaDescriptorAppService" + } + } + } + } + }, + "cms-kit-pro-admin": { + "rootPath": "cms-kit-pro-admin", + "remoteServiceName": "CmsKitAdmin", + "controllers": { + "Volo.CmsKit.Admin.Contact.ContactSettingController": { + "controllerName": "ContactSetting", + "controllerGroupName": "ContactSetting", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Contact.ContactSettingController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Contact.IContactSettingsAppService", + "name": "IContactSettingsAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.CmsKit.Admin.Contact.CmsKitContactSettingDto", + "typeSimple": "Volo.CmsKit.Admin.Contact.CmsKitContactSettingDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Contact.UpdateCmsKitContactSettingDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Contact.UpdateCmsKitContactSettingDto", + "typeSimple": "Volo.CmsKit.Admin.Contact.UpdateCmsKitContactSettingDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/contact/settings", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Admin.Contact.CmsKitContactSettingDto", + "typeSimple": "Volo.CmsKit.Admin.Contact.CmsKitContactSettingDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Contact.IContactSettingsAppService" + }, + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/contact/settings", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Contact.UpdateCmsKitContactSettingDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Contact.UpdateCmsKitContactSettingDto", + "typeSimple": "Volo.CmsKit.Admin.Contact.UpdateCmsKitContactSettingDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Contact.UpdateCmsKitContactSettingDto", + "typeSimple": "Volo.CmsKit.Admin.Contact.UpdateCmsKitContactSettingDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Contact.IContactSettingsAppService" + } + } + }, + "Volo.CmsKit.Admin.Faqs.FaqQuestionAdminController": { + "controllerName": "FaqQuestionAdmin", + "controllerGroupName": "FaqQuestionAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Faqs.FaqQuestionAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Faqs.IFaqQuestionAdminAppService", + "name": "IFaqQuestionAdminAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.FaqQuestionListFilterDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.FaqQuestionListFilterDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqQuestionListFilterDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.CreateFaqQuestionDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.CreateFaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.CreateFaqQuestionDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.UpdateFaqQuestionDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.UpdateFaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.UpdateFaqQuestionDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto" + } + }, + { + "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/cms-kit-admin/faq-question/{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.CmsKit.Admin.Faqs.FaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/faq-question", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.FaqQuestionListFilterDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.FaqQuestionListFilterDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqQuestionListFilterDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "SectionId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "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": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/faq-question", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.CreateFaqQuestionDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.CreateFaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.CreateFaqQuestionDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Faqs.CreateFaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.CreateFaqQuestionDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/faq-question", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.UpdateFaqQuestionDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.UpdateFaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.UpdateFaqQuestionDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Faqs.UpdateFaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.UpdateFaqQuestionDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqQuestionDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/faq-question", + "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": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + } + } + }, + "Volo.CmsKit.Admin.Faqs.FaqSectionAdminController": { + "controllerName": "FaqSectionAdmin", + "controllerGroupName": "FaqSectionAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Faqs.FaqSectionAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Faqs.IFaqSectionAdminAppService", + "name": "IFaqSectionAdminAppService", + "methods": [ + { + "name": "GetGroupsAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.Dictionary", + "typeSimple": "{string:Volo.CmsKit.Admin.Faqs.FaqGroupInfoDto}" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Faqs.FaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqSectionDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.FaqSectionListFilterDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.FaqSectionListFilterDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqSectionListFilterDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.CreateFaqSectionDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.CreateFaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.CreateFaqSectionDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Faqs.FaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqSectionDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.UpdateFaqSectionDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.UpdateFaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.UpdateFaqSectionDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Faqs.FaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqSectionDto" + } + }, + { + "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/cms-kit-admin/faq-section/{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.CmsKit.Admin.Faqs.FaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqSectionDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/faq-section", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.FaqSectionListFilterDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.FaqSectionListFilterDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqSectionListFilterDto", + "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": "GroupName", + "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": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/faq-section", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.CreateFaqSectionDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.CreateFaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.CreateFaqSectionDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Faqs.CreateFaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.CreateFaqSectionDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Faqs.FaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqSectionDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/faq-section", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Faqs.UpdateFaqSectionDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Faqs.UpdateFaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.UpdateFaqSectionDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Faqs.UpdateFaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.UpdateFaqSectionDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Faqs.FaqSectionDto", + "typeSimple": "Volo.CmsKit.Admin.Faqs.FaqSectionDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/faq-section", + "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": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "GetGroupsAsync": { + "uniqueName": "GetGroupsAsync", + "name": "GetGroupsAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/faq-section/groups", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.Dictionary", + "typeSimple": "{string:Volo.CmsKit.Admin.Faqs.FaqGroupInfoDto}" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Faqs.IFaqSectionAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.Newsletters.NewsletterRecordAdminController": { + "controllerName": "NewsletterRecordAdmin", + "controllerGroupName": "NewsletterRecordAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Newsletters.NewsletterRecordAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService", + "name": "INewsletterRecordAdminAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsRequestInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsRequestInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsRequestInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Newsletters.NewsletterRecordWithDetailsDto", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.NewsletterRecordWithDetailsDto" + } + }, + { + "name": "GetNewsletterRecordsCsvDetailAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Admin.Newsletters.NewsletterRecordCsvDto]" + } + }, + { + "name": "GetNewsletterPreferencesAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[string]" + } + }, + { + "name": "GetNewsletterPreferencesAsync", + "parametersOnMethod": [ + { + "name": "emailAddress", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Public.Newsletters.NewsletterPreferenceDetailsDto]" + } + }, + { + "name": "GetCsvResponsesAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "UpdatePreferencesAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.UpdatePreferenceInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.UpdatePreferenceInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.UpdatePreferenceInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetDownloadTokenAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.CmsKit.Admin.Newsletters.DownloadTokenResultDto", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.DownloadTokenResultDto" + } + }, + { + "name": "GetImportNewslettersSampleFileAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.GetImportNewslettersSampleFileInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.GetImportNewslettersSampleFileInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.GetImportNewslettersSampleFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "ImportNewslettersFromFileAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileInputWithStream, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileInputWithStream", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileInputWithStream", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileOutput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileOutput" + } + }, + { + "name": "GetImportInvalidNewslettersFileAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.GetImportInvalidNewslettersFileInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.GetImportInvalidNewslettersFileInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.GetImportInvalidNewslettersFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + } + ] + } + ], + "actions": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/newsletter", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsRequestInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsRequestInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsRequestInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EmailAddress", + "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": false, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/newsletter/{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.CmsKit.Admin.Newsletters.NewsletterRecordWithDetailsDto", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.NewsletterRecordWithDetailsDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + }, + "GetNewsletterRecordsCsvDetailAsyncByInput": { + "uniqueName": "GetNewsletterRecordsCsvDetailAsyncByInput", + "name": "GetNewsletterRecordsCsvDetailAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/newsletter/csv-detail", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Admin.Newsletters.NewsletterRecordCsvDto]" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + }, + "GetNewsletterPreferencesAsync": { + "uniqueName": "GetNewsletterPreferencesAsync", + "name": "GetNewsletterPreferencesAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/newsletter/preferences", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[string]" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + }, + "GetNewsletterPreferencesAsyncByEmailAddress": { + "uniqueName": "GetNewsletterPreferencesAsyncByEmailAddress", + "name": "GetNewsletterPreferencesAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/newsletter/preferences/{emailAddress}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "emailAddress", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "emailAddress", + "name": "emailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Public.Newsletters.NewsletterPreferenceDetailsDto]" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + }, + "GetCsvResponsesAsyncByInput": { + "uniqueName": "GetCsvResponsesAsyncByInput", + "name": "GetCsvResponsesAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/newsletter/export-csv", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": true, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + }, + "UpdatePreferencesAsyncByInput": { + "uniqueName": "UpdatePreferencesAsyncByInput", + "name": "UpdatePreferencesAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/newsletter/preferences", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.UpdatePreferenceInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.UpdatePreferenceInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.UpdatePreferenceInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Newsletters.UpdatePreferenceInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.UpdatePreferenceInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + }, + "GetDownloadTokenAsync": { + "uniqueName": "GetDownloadTokenAsync", + "name": "GetDownloadTokenAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/newsletter/download-token", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Admin.Newsletters.DownloadTokenResultDto", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.DownloadTokenResultDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + }, + "GetImportNewslettersSampleFileAsyncByInput": { + "uniqueName": "GetImportNewslettersSampleFileAsyncByInput", + "name": "GetImportNewslettersSampleFileAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/newsletter/import-newsletters-sample-file", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.GetImportNewslettersSampleFileInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.GetImportNewslettersSampleFileInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.GetImportNewslettersSampleFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": true, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + }, + "ImportNewslettersFromFileAsyncByInput": { + "uniqueName": "ImportNewslettersFromFileAsyncByInput", + "name": "ImportNewslettersFromFileAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/newsletter/import-newsletters-from-file", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileInputWithStream, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileInputWithStream", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileInputWithStream", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "File", + "jsonName": null, + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "FormFile", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileOutput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileOutput" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + }, + "GetImportInvalidNewslettersFileAsyncByInput": { + "uniqueName": "GetImportInvalidNewslettersFileAsyncByInput", + "name": "GetImportInvalidNewslettersFileAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/newsletter/download-import-invalid-newsletters-file", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Newsletters.GetImportInvalidNewslettersFileInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Newsletters.GetImportInvalidNewslettersFileInput", + "typeSimple": "Volo.CmsKit.Admin.Newsletters.GetImportInvalidNewslettersFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": true, + "implementFrom": "Volo.CmsKit.Admin.Newsletters.INewsletterRecordAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackAdminController": { + "controllerName": "PageFeedbackAdmin", + "controllerGroupName": "PageFeedbackAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.PageFeedbacks.IPageFeedbackAdminAppService", + "name": "IPageFeedbackAdminAppService", + "methods": [ + { + "name": "GetEntityTypesAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[string]" + } + }, + { + "name": "GetSettingsAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackSettingDto]" + } + }, + { + "name": "UpdateSettingsAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingsInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingsInput", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingsInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetListAsExcelFileAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListAsFileInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListAsFileInput", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListAsFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListInput", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackDto" + } + }, + { + "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/cms-kit-admin/page-feedback/{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.CmsKit.Admin.PageFeedbacks.PageFeedbackDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/page-feedback", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListInput", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "IsHandled", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "IsUseful", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "HasUserNote", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "HasAdminNote", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "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": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "UpdateAsyncByIdAndDto": { + "uniqueName": "UpdateAsyncByIdAndDto", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/page-feedback/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "dto", + "typeAsString": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackDto", + "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": "dto", + "name": "dto", + "jsonName": null, + "type": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/page-feedback/{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": false, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "GetEntityTypesAsync": { + "uniqueName": "GetEntityTypesAsync", + "name": "GetEntityTypesAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/page-feedback/entity-types", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[string]" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.PageFeedbacks.IPageFeedbackAdminAppService" + }, + "GetSettingsAsync": { + "uniqueName": "GetSettingsAsync", + "name": "GetSettingsAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/page-feedback/settings", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackSettingDto]" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.PageFeedbacks.IPageFeedbackAdminAppService" + }, + "UpdateSettingsAsyncByInput": { + "uniqueName": "UpdateSettingsAsyncByInput", + "name": "UpdateSettingsAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/page-feedback/settings", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingsInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingsInput", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingsInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingsInput", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingsInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.PageFeedbacks.IPageFeedbackAdminAppService" + }, + "GetListAsExcelFileAsyncByInput": { + "uniqueName": "GetListAsExcelFileAsyncByInput", + "name": "GetListAsExcelFileAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/page-feedback/export-as-excel", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListAsFileInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListAsFileInput", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListAsFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "IsHandled", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "IsUseful", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "HasUserNote", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "HasAdminNote", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.PageFeedbacks.IPageFeedbackAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackSettingsController": { + "controllerName": "PageFeedbackSettings", + "controllerGroupName": "PageFeedbackSettings", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackSettingsController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.PageFeedbacks.IPageFeedbackSettingsAppService", + "name": "IPageFeedbackSettingsAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.CmsKit.Admin.PageFeedbacks.CmsKitPageFeedbackSettingDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.CmsKitPageFeedbackSettingDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.PageFeedbacks.UpdateCmsKitPageFeedbackSettingDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.PageFeedbacks.UpdateCmsKitPageFeedbackSettingDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.UpdateCmsKitPageFeedbackSettingDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/page-feedbacks/settings", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Admin.PageFeedbacks.CmsKitPageFeedbackSettingDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.CmsKitPageFeedbackSettingDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.PageFeedbacks.IPageFeedbackSettingsAppService" + }, + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/page-feedbacks/settings", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.PageFeedbacks.UpdateCmsKitPageFeedbackSettingDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.PageFeedbacks.UpdateCmsKitPageFeedbackSettingDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.UpdateCmsKitPageFeedbackSettingDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.PageFeedbacks.UpdateCmsKitPageFeedbackSettingDto", + "typeSimple": "Volo.CmsKit.Admin.PageFeedbacks.UpdateCmsKitPageFeedbackSettingDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.PageFeedbacks.IPageFeedbackSettingsAppService" + } + } + }, + "Volo.CmsKit.Admin.Polls.PollAdminController": { + "controllerName": "PollAdmin", + "controllerGroupName": "PollAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.Polls.PollAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.Polls.IPollAdminAppService", + "name": "IPollAdminAppService", + "methods": [ + { + "name": "GetWidgetsAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "GetResultAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Polls.GetResultDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.GetResultDto" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Polls.GetPollListInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Polls.GetPollListInput", + "typeSimple": "Volo.CmsKit.Admin.Polls.GetPollListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Polls.CreatePollDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Polls.CreatePollDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.CreatePollDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Polls.UpdatePollDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Polls.UpdatePollDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.UpdatePollDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto" + } + }, + { + "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": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/poll", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Polls.GetPollListInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Polls.GetPollListInput", + "typeSimple": "Volo.CmsKit.Admin.Polls.GetPollListInput", + "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": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/poll/{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.CmsKit.Admin.Polls.PollWithDetailsDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/poll", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Polls.CreatePollDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Polls.CreatePollDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.CreatePollDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Polls.CreatePollDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.CreatePollDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/poll/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.Polls.UpdatePollDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.Polls.UpdatePollDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.UpdatePollDto", + "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.CmsKit.Admin.Polls.UpdatePollDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.UpdatePollDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.PollWithDetailsDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/poll/{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": false, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "GetWidgetsAsync": { + "uniqueName": "GetWidgetsAsync", + "name": "GetWidgetsAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/poll/widgets", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Polls.IPollAdminAppService" + }, + "GetResultAsyncById": { + "uniqueName": "GetResultAsyncById", + "name": "GetResultAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/poll/result", + "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": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.Polls.GetResultDto", + "typeSimple": "Volo.CmsKit.Admin.Polls.GetResultDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Polls.IPollAdminAppService" + } + } + }, + "Volo.CmsKit.Admin.UrlShorting.UrlShortingAdminController": { + "controllerName": "UrlShortingAdmin", + "controllerGroupName": "UrlShortingAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Admin.UrlShorting.UrlShortingAdminController", + "interfaces": [ + { + "type": "Volo.CmsKit.Admin.UrlShorting.IUrlShortingAdminAppService", + "name": "IUrlShortingAdminAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.UrlShorting.GetShortenedUrlListInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.UrlShorting.GetShortenedUrlListInput", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.GetShortenedUrlListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.UrlShorting.CreateShortenedUrlDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.UrlShorting.CreateShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.CreateShortenedUrlDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.UrlShorting.UpdateShortenedUrlDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.UrlShorting.UpdateShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.UpdateShortenedUrlDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto" + } + }, + { + "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": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/url-shorting", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.UrlShorting.GetShortenedUrlListInput, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.UrlShorting.GetShortenedUrlListInput", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.GetShortenedUrlListInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "ShortenedUrlFilter", + "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": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/url-shorting/{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.CmsKit.Admin.UrlShorting.ShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-admin/url-shorting", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.UrlShorting.CreateShortenedUrlDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.UrlShorting.CreateShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.CreateShortenedUrlDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Admin.UrlShorting.CreateShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.CreateShortenedUrlDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/url-shorting/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.CmsKit.Admin.UrlShorting.UpdateShortenedUrlDto, Volo.CmsKit.Pro.Admin.Application.Contracts", + "type": "Volo.CmsKit.Admin.UrlShorting.UpdateShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.UpdateShortenedUrlDto", + "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.CmsKit.Admin.UrlShorting.UpdateShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.UpdateShortenedUrlDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/cms-kit-admin/url-shorting/{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": false, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + } + } + } + } + }, + "cms-kit-pro-common": { + "rootPath": "cms-kit-pro-common", + "remoteServiceName": "CmsKitProCommon", + "controllers": { + "Volo.CmsKit.Public.Contact.ContactPublicController": { + "controllerName": "ContactPublic", + "controllerGroupName": "ContactPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Contact.ContactPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.Contact.IContactPublicAppService", + "name": "IContactPublicAppService", + "methods": [ + { + "name": "SendMessageAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Contact.ContactCreateInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.Contact.ContactCreateInput", + "typeSimple": "Volo.CmsKit.Public.Contact.ContactCreateInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "SendMessageAsyncByInput": { + "uniqueName": "SendMessageAsyncByInput", + "name": "SendMessageAsync", + "httpMethod": "POST", + "url": "api/cms-kit-public/contacts", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Contact.ContactCreateInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.Contact.ContactCreateInput", + "typeSimple": "Volo.CmsKit.Public.Contact.ContactCreateInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Public.Contact.ContactCreateInput", + "typeSimple": "Volo.CmsKit.Public.Contact.ContactCreateInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Contact.IContactPublicAppService" + } + } + }, + "Volo.CmsKit.Public.Faqs.FaqSectionPublicController": { + "controllerName": "FaqSectionPublic", + "controllerGroupName": "FaqSectionPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Faqs.FaqSectionPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.Faqs.IFaqSectionPublicAppService", + "name": "IFaqSectionPublicAppService", + "methods": [ + { + "name": "GetListSectionWithQuestionsAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Faqs.FaqSectionListFilterInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.Faqs.FaqSectionListFilterInput", + "typeSimple": "Volo.CmsKit.Public.Faqs.FaqSectionListFilterInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Public.Faqs.FaqSectionWithQuestionsDto]" + } + } + ] + } + ], + "actions": { + "GetListSectionWithQuestionsAsyncByInput": { + "uniqueName": "GetListSectionWithQuestionsAsyncByInput", + "name": "GetListSectionWithQuestionsAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/faq-section", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Faqs.FaqSectionListFilterInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.Faqs.FaqSectionListFilterInput", + "typeSimple": "Volo.CmsKit.Public.Faqs.FaqSectionListFilterInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "GroupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "SectionName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Public.Faqs.FaqSectionWithQuestionsDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Faqs.IFaqSectionPublicAppService" + } + } + }, + "Volo.CmsKit.Public.Newsletters.NewsletterRecordPublicController": { + "controllerName": "NewsletterRecordPublic", + "controllerGroupName": "NewsletterRecordPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Newsletters.NewsletterRecordPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.Newsletters.INewsletterRecordPublicAppService", + "name": "INewsletterRecordPublicAppService", + "methods": [ + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Newsletters.CreateNewsletterRecordInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.Newsletters.CreateNewsletterRecordInput", + "typeSimple": "Volo.CmsKit.Public.Newsletters.CreateNewsletterRecordInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetNewsletterPreferencesAsync", + "parametersOnMethod": [ + { + "name": "emailAddress", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Public.Newsletters.NewsletterPreferenceDetailsDto]" + } + }, + { + "name": "UpdatePreferencesAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Newsletters.UpdatePreferenceRequestInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.Newsletters.UpdatePreferenceRequestInput", + "typeSimple": "Volo.CmsKit.Public.Newsletters.UpdatePreferenceRequestInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetOptionByPreferenceAsync", + "parametersOnMethod": [ + { + "name": "preference", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Newsletters.NewsletterEmailOptionsDto", + "typeSimple": "Volo.CmsKit.Public.Newsletters.NewsletterEmailOptionsDto" + } + } + ] + } + ], + "actions": { + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-public/newsletter", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Newsletters.CreateNewsletterRecordInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.Newsletters.CreateNewsletterRecordInput", + "typeSimple": "Volo.CmsKit.Public.Newsletters.CreateNewsletterRecordInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Public.Newsletters.CreateNewsletterRecordInput", + "typeSimple": "Volo.CmsKit.Public.Newsletters.CreateNewsletterRecordInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Newsletters.INewsletterRecordPublicAppService" + }, + "GetNewsletterPreferencesAsyncByEmailAddress": { + "uniqueName": "GetNewsletterPreferencesAsyncByEmailAddress", + "name": "GetNewsletterPreferencesAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/newsletter/emailAddress", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "emailAddress", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "emailAddress", + "name": "emailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.CmsKit.Public.Newsletters.NewsletterPreferenceDetailsDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Newsletters.INewsletterRecordPublicAppService" + }, + "UpdatePreferencesAsyncByInput": { + "uniqueName": "UpdatePreferencesAsyncByInput", + "name": "UpdatePreferencesAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-public/newsletter", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Newsletters.UpdatePreferenceRequestInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.Newsletters.UpdatePreferenceRequestInput", + "typeSimple": "Volo.CmsKit.Public.Newsletters.UpdatePreferenceRequestInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Public.Newsletters.UpdatePreferenceRequestInput", + "typeSimple": "Volo.CmsKit.Public.Newsletters.UpdatePreferenceRequestInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Newsletters.INewsletterRecordPublicAppService" + }, + "GetOptionByPreferenceAsyncByPreference": { + "uniqueName": "GetOptionByPreferenceAsyncByPreference", + "name": "GetOptionByPreferenceAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/newsletter/preference-options", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "preference", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "preference", + "name": "preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Newsletters.NewsletterEmailOptionsDto", + "typeSimple": "Volo.CmsKit.Public.Newsletters.NewsletterEmailOptionsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Newsletters.INewsletterRecordPublicAppService" + } + } + }, + "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackPublicController": { + "controllerName": "PageFeedbackPublic", + "controllerGroupName": "PageFeedbackPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.PageFeedbacks.IPageFeedbackPublicAppService", + "name": "IPageFeedbackPublicAppService", + "methods": [ + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.PageFeedbacks.CreatePageFeedbackInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.PageFeedbacks.CreatePageFeedbackInput", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.CreatePageFeedbackInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto" + } + }, + { + "name": "InitializeUserNoteAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.PageFeedbacks.InitializeUserNoteInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.PageFeedbacks.InitializeUserNoteInput", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.InitializeUserNoteInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto" + } + }, + { + "name": "ChangeIsUsefulAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.PageFeedbacks.ChangeIsUsefulInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.PageFeedbacks.ChangeIsUsefulInput", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.ChangeIsUsefulInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto" + } + } + ] + } + ], + "actions": { + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/cms-kit-public/page-feedback", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.PageFeedbacks.CreatePageFeedbackInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.PageFeedbacks.CreatePageFeedbackInput", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.CreatePageFeedbackInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Public.PageFeedbacks.CreatePageFeedbackInput", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.CreatePageFeedbackInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.PageFeedbacks.IPageFeedbackPublicAppService" + }, + "InitializeUserNoteAsyncByInput": { + "uniqueName": "InitializeUserNoteAsyncByInput", + "name": "InitializeUserNoteAsync", + "httpMethod": "POST", + "url": "api/cms-kit-public/page-feedback/initialize-user-note", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.PageFeedbacks.InitializeUserNoteInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.PageFeedbacks.InitializeUserNoteInput", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.InitializeUserNoteInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Public.PageFeedbacks.InitializeUserNoteInput", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.InitializeUserNoteInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.PageFeedbacks.IPageFeedbackPublicAppService" + }, + "ChangeIsUsefulAsyncByInput": { + "uniqueName": "ChangeIsUsefulAsyncByInput", + "name": "ChangeIsUsefulAsync", + "httpMethod": "POST", + "url": "api/cms-kit-public/page-feedback/change-is-useful", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.PageFeedbacks.ChangeIsUsefulInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.PageFeedbacks.ChangeIsUsefulInput", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.ChangeIsUsefulInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.CmsKit.Public.PageFeedbacks.ChangeIsUsefulInput", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.ChangeIsUsefulInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto", + "typeSimple": "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.PageFeedbacks.IPageFeedbackPublicAppService" + } + } + }, + "Volo.CmsKit.Public.Polls.PollPublicController": { + "controllerName": "PollPublic", + "controllerGroupName": "PollPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.Polls.PollPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.Polls.IPollPublicAppService", + "name": "IPollPublicAppService", + "methods": [ + { + "name": "IsWidgetNameAvailableAsync", + "parametersOnMethod": [ + { + "name": "widgetName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "FindByAvailableWidgetAsync", + "parametersOnMethod": [ + { + "name": "widgetName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Polls.PollWithDetailsDto", + "typeSimple": "Volo.CmsKit.Public.Polls.PollWithDetailsDto" + } + }, + { + "name": "FindByCodeAsync", + "parametersOnMethod": [ + { + "name": "code", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Polls.PollWithDetailsDto", + "typeSimple": "Volo.CmsKit.Public.Polls.PollWithDetailsDto" + } + }, + { + "name": "GetResultAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Polls.GetResultDto", + "typeSimple": "Volo.CmsKit.Public.Polls.GetResultDto" + } + }, + { + "name": "SubmitVoteAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "submitPollInput", + "typeAsString": "Volo.CmsKit.Public.Polls.SubmitPollInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.Polls.SubmitPollInput", + "typeSimple": "Volo.CmsKit.Public.Polls.SubmitPollInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "IsWidgetNameAvailableAsyncByWidgetName": { + "uniqueName": "IsWidgetNameAvailableAsyncByWidgetName", + "name": "IsWidgetNameAvailableAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/poll/widget-name-available", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "widgetName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "widgetName", + "name": "widgetName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Polls.IPollPublicAppService" + }, + "FindByAvailableWidgetAsyncByWidgetName": { + "uniqueName": "FindByAvailableWidgetAsyncByWidgetName", + "name": "FindByAvailableWidgetAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/poll/by-available-widget-name", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "widgetName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "widgetName", + "name": "widgetName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Polls.PollWithDetailsDto", + "typeSimple": "Volo.CmsKit.Public.Polls.PollWithDetailsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Polls.IPollPublicAppService" + }, + "FindByCodeAsyncByCode": { + "uniqueName": "FindByCodeAsyncByCode", + "name": "FindByCodeAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/poll/by-code", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "code", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "code", + "name": "code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.Polls.PollWithDetailsDto", + "typeSimple": "Volo.CmsKit.Public.Polls.PollWithDetailsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Polls.IPollPublicAppService" + }, + "GetResultAsyncById": { + "uniqueName": "GetResultAsyncById", + "name": "GetResultAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/poll/result/{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.CmsKit.Public.Polls.GetResultDto", + "typeSimple": "Volo.CmsKit.Public.Polls.GetResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Polls.IPollPublicAppService" + }, + "SubmitVoteAsyncByIdAndSubmitPollInput": { + "uniqueName": "SubmitVoteAsyncByIdAndSubmitPollInput", + "name": "SubmitVoteAsync", + "httpMethod": "POST", + "url": "api/cms-kit-public/poll/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "submitPollInput", + "typeAsString": "Volo.CmsKit.Public.Polls.SubmitPollInput, Volo.CmsKit.Pro.Common.Application.Contracts", + "type": "Volo.CmsKit.Public.Polls.SubmitPollInput", + "typeSimple": "Volo.CmsKit.Public.Polls.SubmitPollInput", + "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": "submitPollInput", + "name": "submitPollInput", + "jsonName": null, + "type": "Volo.CmsKit.Public.Polls.SubmitPollInput", + "typeSimple": "Volo.CmsKit.Public.Polls.SubmitPollInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Polls.IPollPublicAppService" + } + } + }, + "Volo.CmsKit.Public.UrlShorting.UrlShortingPublicController": { + "controllerName": "UrlShortingPublic", + "controllerGroupName": "UrlShortingPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.UrlShorting.UrlShortingPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.UrlShorting.IUrlShortingPublicAppService", + "name": "IUrlShortingPublicAppService", + "methods": [ + { + "name": "FindBySourceAsync", + "parametersOnMethod": [ + { + "name": "source", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.UrlShorting.ShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Public.UrlShorting.ShortenedUrlDto" + } + } + ] + } + ], + "actions": { + "FindBySourceAsyncBySource": { + "uniqueName": "FindBySourceAsyncBySource", + "name": "FindBySourceAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/url-shorting", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "source", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "source", + "name": "source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.UrlShorting.ShortenedUrlDto", + "typeSimple": "Volo.CmsKit.Public.UrlShorting.ShortenedUrlDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.UrlShorting.IUrlShortingPublicAppService" + } + } + } + } + }, + "featureManagement": { + "rootPath": "featureManagement", + "remoteServiceName": "AbpFeatureManagement", + "controllers": { + "Volo.Abp.FeatureManagement.FeaturesController": { + "controllerName": "Features", + "controllerGroupName": "Features", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.FeatureManagement.FeaturesController", + "interfaces": [ + { + "type": "Volo.Abp.FeatureManagement.IFeatureAppService", + "name": "IFeatureAppService", + "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.FeatureManagement.GetFeatureListResultDto", + "typeSimple": "Volo.Abp.FeatureManagement.GetFeatureListResultDto" + } + }, + { + "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" + } + } + ] + } + ], + "actions": { + "GetAsyncByProviderNameAndProviderKey": { + "uniqueName": "GetAsyncByProviderNameAndProviderKey", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/feature-management/features", + "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.FeatureManagement.GetFeatureListResultDto", + "typeSimple": "Volo.Abp.FeatureManagement.GetFeatureListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" + }, + "UpdateAsyncByProviderNameAndProviderKeyAndInput": { + "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/feature-management/features", + "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.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", + "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.FeatureManagement.UpdateFeaturesDto", + "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" + }, + "DeleteAsyncByProviderNameAndProviderKey": { + "uniqueName": "DeleteAsyncByProviderNameAndProviderKey", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/feature-management/features", + "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": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" + } + } + } + } + }, + "gdpr": { + "rootPath": "gdpr", + "remoteServiceName": "Gdpr", + "controllers": { + "Volo.Abp.Gdpr.GdprRequestController": { + "controllerName": "GdprRequest", + "controllerGroupName": "GdprRequest", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Gdpr.GdprRequestController", + "interfaces": [ + { + "type": "Volo.Abp.Gdpr.IGdprRequestAppService", + "name": "IGdprRequestAppService", + "methods": [ + { + "name": "PrepareUserDataAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetUserDataAsync", + "parametersOnMethod": [ + { + "name": "requestId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "token", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "GetDownloadTokenAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Gdpr.DownloadTokenResultDto", + "typeSimple": "Volo.Abp.Gdpr.DownloadTokenResultDto" + } + }, + { + "name": "IsNewRequestAllowedAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Gdpr.GdprRequestInput, Volo.Abp.Gdpr.Application.Contracts", + "type": "Volo.Abp.Gdpr.GdprRequestInput", + "typeSimple": "Volo.Abp.Gdpr.GdprRequestInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "DeleteUserDataAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "PrepareUserDataAsync": { + "uniqueName": "PrepareUserDataAsync", + "name": "PrepareUserDataAsync", + "httpMethod": "POST", + "url": "api/gdpr/requests/prepare-data", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Gdpr.IGdprRequestAppService" + }, + "GetDownloadTokenAsyncById": { + "uniqueName": "GetDownloadTokenAsyncById", + "name": "GetDownloadTokenAsync", + "httpMethod": "GET", + "url": "api/gdpr/requests/download-token", + "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": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Gdpr.DownloadTokenResultDto", + "typeSimple": "Volo.Abp.Gdpr.DownloadTokenResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Gdpr.IGdprRequestAppService" + }, + "GetUserDataAsyncByRequestIdAndToken": { + "uniqueName": "GetUserDataAsyncByRequestIdAndToken", + "name": "GetUserDataAsync", + "httpMethod": "GET", + "url": "api/gdpr/requests/data/{requestId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "requestId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "token", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "requestId", + "name": "requestId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "token", + "name": "token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Gdpr.IGdprRequestAppService" + }, + "IsNewRequestAllowedAsync": { + "uniqueName": "IsNewRequestAllowedAsync", + "name": "IsNewRequestAllowedAsync", + "httpMethod": "GET", + "url": "api/gdpr/requests/is-request-allowed", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Gdpr.IGdprRequestAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/gdpr/requests/list", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Gdpr.GdprRequestInput, Volo.Abp.Gdpr.Application.Contracts", + "type": "Volo.Abp.Gdpr.GdprRequestInput", + "typeSimple": "Volo.Abp.Gdpr.GdprRequestInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "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.Gdpr.IGdprRequestAppService" + }, + "DeleteUserDataAsync": { + "uniqueName": "DeleteUserDataAsync", + "name": "DeleteUserDataAsync", + "httpMethod": "DELETE", + "url": "api/gdpr/requests", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Gdpr.IGdprRequestAppService" + } + } + } + } + }, + "identity": { + "rootPath": "identity", + "remoteServiceName": "AbpIdentity", + "controllers": { + "Volo.Abp.Identity.IdentityClaimTypeController": { + "controllerName": "IdentityClaimType", + "controllerGroupName": "ClaimType", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Identity.IdentityClaimTypeController", + "interfaces": [ + { + "type": "Volo.Abp.Identity.IIdentityClaimTypeAppService", + "name": "IIdentityClaimTypeAppService", + "methods": [ + { + "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.ClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.ClaimTypeDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityClaimTypesInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityClaimTypesInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityClaimTypesInput", + "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.CreateClaimTypeDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.CreateClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.CreateClaimTypeDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.ClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.ClaimTypeDto" + } + }, + { + "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.UpdateClaimTypeDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.UpdateClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.UpdateClaimTypeDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.ClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.ClaimTypeDto" + } + }, + { + "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": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/identity/claim-types", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityClaimTypesInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityClaimTypesInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityClaimTypesInput", + "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" + }, + { + "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": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/identity/claim-types/{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.Identity.ClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.ClaimTypeDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/identity/claim-types", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.CreateClaimTypeDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.CreateClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.CreateClaimTypeDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Identity.CreateClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.CreateClaimTypeDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.ClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.ClaimTypeDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/identity/claim-types/{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.UpdateClaimTypeDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.UpdateClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.UpdateClaimTypeDto", + "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.UpdateClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.UpdateClaimTypeDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.ClaimTypeDto", + "typeSimple": "Volo.Abp.Identity.ClaimTypeDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/identity/claim-types/{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.Application.Services.IDeleteAppService" + } + } + }, + "Volo.Abp.Identity.IdentityExternalLoginController": { + "controllerName": "IdentityExternalLogin", + "controllerGroupName": "ExternalLogin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Identity.IdentityExternalLoginController", + "interfaces": [ + { + "type": "Volo.Abp.Identity.IIdentityExternalLoginAppService", + "name": "IIdentityExternalLoginAppService", + "methods": [ + { + "name": "CreateOrUpdateAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "CreateOrUpdateAsync": { + "uniqueName": "CreateOrUpdateAsync", + "name": "CreateOrUpdateAsync", + "httpMethod": "POST", + "url": "api/identity/external-login", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityExternalLoginAppService" + } + } + }, + "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", + "name": "IIdentityRoleAppService", + "methods": [ + { + "name": "GetAllListAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "UpdateClaimsAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "System.Collections.Generic.List`1[[Volo.Abp.Identity.IdentityRoleClaimDto, Volo.Abp.Identity.Pro.Application.Contracts, Version=10.1.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib", + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityRoleClaimDto]", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetAllClaimTypesAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.ClaimTypeDto]" + } + }, + { + "name": "GetClaimsAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityRoleClaimDto]" + } + }, + { + "name": "MoveAllUsersAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "targetRoleId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], 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.Identity.IdentityRoleDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityRoleListInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityRoleListInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityRoleListInput", + "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.Pro.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.Pro.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": { + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/identity/roles/{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.Identity.IdentityRoleDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/identity/roles", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityRoleCreateDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityRoleCreateDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentityRoleCreateDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleCreateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityRoleDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/identity/roles/{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.IdentityRoleUpdateDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityRoleUpdateDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleUpdateDto", + "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.IdentityRoleUpdateDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleUpdateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityRoleDto", + "typeSimple": "Volo.Abp.Identity.IdentityRoleDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/identity/roles/{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.Application.Services.IDeleteAppService" + }, + "GetAllListAsync": { + "uniqueName": "GetAllListAsync", + "name": "GetAllListAsync", + "httpMethod": "GET", + "url": "api/identity/roles/all", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityRoleAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/identity/roles", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityRoleListInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityRoleListInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityRoleListInput", + "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" + }, + { + "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": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "UpdateClaimsAsyncByIdAndInput": { + "uniqueName": "UpdateClaimsAsyncByIdAndInput", + "name": "UpdateClaimsAsync", + "httpMethod": "PUT", + "url": "api/identity/roles/{id}/claims", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "System.Collections.Generic.List`1[[Volo.Abp.Identity.IdentityRoleClaimDto, Volo.Abp.Identity.Pro.Application.Contracts, Version=10.1.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib", + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityRoleClaimDto]", + "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": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityRoleClaimDto]", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityRoleAppService" + }, + "GetClaimsAsyncById": { + "uniqueName": "GetClaimsAsyncById", + "name": "GetClaimsAsync", + "httpMethod": "GET", + "url": "api/identity/roles/{id}/claims", + "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.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityRoleClaimDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityRoleAppService" + }, + "MoveAllUsersAsyncByIdAndRoleId": { + "uniqueName": "MoveAllUsersAsyncByIdAndRoleId", + "name": "MoveAllUsersAsync", + "httpMethod": "PUT", + "url": "api/identity/roles/{id}/move-all-users", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "roleId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], 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": "" + }, + { + "nameOnMethod": "roleId", + "name": "roleId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityRoleAppService" + }, + "GetAllClaimTypesAsync": { + "uniqueName": "GetAllClaimTypesAsync", + "name": "GetAllClaimTypesAsync", + "httpMethod": "GET", + "url": "api/identity/roles/all-claim-types", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.ClaimTypeDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityRoleAppService" + } + } + }, + "Volo.Abp.Identity.IdentitySecurityLogController": { + "controllerName": "IdentitySecurityLog", + "controllerGroupName": "SecurityLog", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Identity.IdentitySecurityLogController", + "interfaces": [ + { + "type": "Volo.Abp.Identity.IIdentitySecurityLogAppService", + "name": "IIdentitySecurityLogAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentitySecurityLogListInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentitySecurityLogListInput", + "typeSimple": "Volo.Abp.Identity.GetIdentitySecurityLogListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "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.IdentitySecurityLogDto", + "typeSimple": "Volo.Abp.Identity.IdentitySecurityLogDto" + } + } + ] + } + ], + "actions": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/identity/security-logs", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentitySecurityLogListInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentitySecurityLogListInput", + "typeSimple": "Volo.Abp.Identity.GetIdentitySecurityLogListInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "StartTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EndTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ApplicationName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Identity", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Action", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "CorrelationId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ClientIpAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "SkipCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ExtraProperties", + "jsonName": null, + "type": "Volo.Abp.Data.ExtraPropertyDictionary", + "typeSimple": "{string:object}", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySecurityLogAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/identity/security-logs/{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.Identity.IdentitySecurityLogDto", + "typeSimple": "Volo.Abp.Identity.IdentitySecurityLogDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySecurityLogAppService" + } + } + }, + "Volo.Abp.Identity.IdentitySessionController": { + "controllerName": "IdentitySession", + "controllerGroupName": "Sessions", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Identity.IdentitySessionController", + "interfaces": [ + { + "type": "Volo.Abp.Identity.IIdentitySessionAppService", + "name": "IIdentitySessionAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentitySessionListInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentitySessionListInput", + "typeSimple": "Volo.Abp.Identity.GetIdentitySessionListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "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.IdentitySessionDto", + "typeSimple": "Volo.Abp.Identity.IdentitySessionDto" + } + }, + { + "name": "RevokeAsync", + "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": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/identity/sessions", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentitySessionListInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentitySessionListInput", + "typeSimple": "Volo.Abp.Identity.GetIdentitySessionListInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Device", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ClientId", + "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" + }, + { + "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": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySessionAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/identity/sessions/{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.Identity.IdentitySessionDto", + "typeSimple": "Volo.Abp.Identity.IdentitySessionDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySessionAppService" + }, + "RevokeAsyncById": { + "uniqueName": "RevokeAsyncById", + "name": "RevokeAsync", + "httpMethod": "DELETE", + "url": "api/identity/sessions/{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.IIdentitySessionAppService" + } + } + }, + "Volo.Abp.Identity.IdentitySettingsController": { + "controllerName": "IdentitySettings", + "controllerGroupName": "Settings", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Identity.IdentitySettingsController", + "interfaces": [ + { + "type": "Volo.Abp.Identity.IIdentitySettingsAppService", + "name": "IIdentitySettingsAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Identity.IdentitySettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySettingsDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentitySettingsDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentitySettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetLdapAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityLdapSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityLdapSettingsDto" + } + }, + { + "name": "UpdateLdapAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityLdapSettingsDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityLdapSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityLdapSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetOAuthAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityOAuthSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityOAuthSettingsDto" + } + }, + { + "name": "UpdateOAuthAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityOAuthSettingsDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityOAuthSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityOAuthSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetSessionAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Identity.IdentitySessionSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySessionSettingsDto" + } + }, + { + "name": "UpdateSessionAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentitySessionSettingsDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentitySessionSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySessionSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/identity/settings", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Identity.IdentitySettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySettingsAppService" + }, + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/identity/settings", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentitySettingsDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentitySettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentitySettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySettingsAppService" + }, + "GetLdapAsync": { + "uniqueName": "GetLdapAsync", + "name": "GetLdapAsync", + "httpMethod": "GET", + "url": "api/identity/settings/ldap", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityLdapSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityLdapSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySettingsAppService" + }, + "UpdateLdapAsyncByInput": { + "uniqueName": "UpdateLdapAsyncByInput", + "name": "UpdateLdapAsync", + "httpMethod": "PUT", + "url": "api/identity/settings/ldap", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityLdapSettingsDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityLdapSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityLdapSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentityLdapSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityLdapSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySettingsAppService" + }, + "GetOAuthAsync": { + "uniqueName": "GetOAuthAsync", + "name": "GetOAuthAsync", + "httpMethod": "GET", + "url": "api/identity/settings/oauth", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityOAuthSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityOAuthSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySettingsAppService" + }, + "UpdateOAuthAsyncByInput": { + "uniqueName": "UpdateOAuthAsyncByInput", + "name": "UpdateOAuthAsync", + "httpMethod": "PUT", + "url": "api/identity/settings/oauth", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityOAuthSettingsDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityOAuthSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityOAuthSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentityOAuthSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityOAuthSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySettingsAppService" + }, + "GetSessionAsync": { + "uniqueName": "GetSessionAsync", + "name": "GetSessionAsync", + "httpMethod": "GET", + "url": "api/identity/settings/session", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Identity.IdentitySessionSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySessionSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySettingsAppService" + }, + "UpdateSessionAsyncByInput": { + "uniqueName": "UpdateSessionAsyncByInput", + "name": "UpdateSessionAsync", + "httpMethod": "PUT", + "url": "api/identity/settings/session", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentitySessionSettingsDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentitySessionSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySessionSettingsDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentitySessionSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySessionSettingsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentitySettingsAppService" + } + } + }, + "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", + "name": "IIdentityUserAppService", + "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.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + } + }, + { + "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": "GetAvailableOrganizationUnitsAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "GetAllClaimTypesAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.ClaimTypeDto]" + } + }, + { + "name": "GetClaimsAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityUserClaimDto]" + } + }, + { + "name": "GetOrganizationUnitsAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.OrganizationUnitDto]" + } + }, + { + "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.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityUserUpdateRolesDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateRolesDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "UpdateClaimsAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "System.Collections.Generic.List`1[[Volo.Abp.Identity.IdentityUserClaimDto, Volo.Abp.Identity.Pro.Application.Contracts, Version=10.1.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib", + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityUserClaimDto]", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "UpdatePasswordAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput", + "typeSimple": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "LockAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "lockoutEnd", + "typeAsString": "System.DateTime, System.Private.CoreLib", + "type": "System.DateTime", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "UnlockAsync", + "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": "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": "GetTwoFactorEnabledAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "SetTwoFactorEnabledAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "enabled", + "typeAsString": "System.Boolean, System.Private.CoreLib", + "type": "System.Boolean", + "typeSimple": "boolean", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetRoleLookupAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityRoleLookupDto]" + } + }, + { + "name": "GetOrganizationUnitLookupAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.OrganizationUnitLookupDto]" + } + }, + { + "name": "GetExternalLoginProvidersAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.ExternalLoginProviderDto]" + } + }, + { + "name": "ImportExternalUserAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.ImportExternalUserInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.ImportExternalUserInput", + "typeSimple": "Volo.Abp.Identity.ImportExternalUserInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + } + }, + { + "name": "GetListAsExcelFileAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityUserListAsFileInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityUserListAsFileInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityUserListAsFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "GetListAsCsvFileAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityUserListAsFileInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityUserListAsFileInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityUserListAsFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "GetDownloadTokenAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Identity.DownloadTokenResultDto", + "typeSimple": "Volo.Abp.Identity.DownloadTokenResultDto" + } + }, + { + "name": "GetImportUsersSampleFileAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetImportUsersSampleFileInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetImportUsersSampleFileInput", + "typeSimple": "Volo.Abp.Identity.GetImportUsersSampleFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "ImportUsersFromFileAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.ImportUsersFromFileInputWithStream, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.ImportUsersFromFileInputWithStream", + "typeSimple": "Volo.Abp.Identity.ImportUsersFromFileInputWithStream", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.ImportUsersFromFileOutput", + "typeSimple": "Volo.Abp.Identity.ImportUsersFromFileOutput" + } + }, + { + "name": "GetImportInvalidUsersFileAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetImportInvalidUsersFileInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetImportInvalidUsersFileInput", + "typeSimple": "Volo.Abp.Identity.GetImportInvalidUsersFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "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.Pro.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.Pro.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.Pro.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": { + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/identity/users/{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.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/identity/users", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityUsersInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityUsersInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityUsersInput", + "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": "RoleId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "OrganizationUnitId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Id", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "IsLockedOut", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "NotActive", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "IsExternal", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxCreationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MinCreationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxModifitionTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MinModifitionTime", + "jsonName": null, + "type": "System.DateTime?", + "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" + }, + { + "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": { + "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/identity/users", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.IdentityUserCreateDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityUserCreateDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentityUserCreateDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserCreateDto", + "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.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/identity/users/{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.IdentityUserUpdateDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityUserUpdateDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateDto", + "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.IdentityUserUpdateDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateDto", + "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.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/identity/users/{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.Application.Services.IDeleteAppService" + }, + "FindByIdAsyncById": { + "uniqueName": "FindByIdAsyncById", + "name": "FindByIdAsync", + "httpMethod": "GET", + "url": "api/identity/users/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", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetRolesAsyncById": { + "uniqueName": "GetRolesAsyncById", + "name": "GetRolesAsync", + "httpMethod": "GET", + "url": "api/identity/users/{id}/roles", + "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.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetAssignableRolesAsync": { + "uniqueName": "GetAssignableRolesAsync", + "name": "GetAssignableRolesAsync", + "httpMethod": "GET", + "url": "api/identity/users/assignable-roles", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetAvailableOrganizationUnitsAsync": { + "uniqueName": "GetAvailableOrganizationUnitsAsync", + "name": "GetAvailableOrganizationUnitsAsync", + "httpMethod": "GET", + "url": "api/identity/users/available-organization-units", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetAllClaimTypesAsync": { + "uniqueName": "GetAllClaimTypesAsync", + "name": "GetAllClaimTypesAsync", + "httpMethod": "GET", + "url": "api/identity/users/all-claim-types", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.ClaimTypeDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetClaimsAsyncById": { + "uniqueName": "GetClaimsAsyncById", + "name": "GetClaimsAsync", + "httpMethod": "GET", + "url": "api/identity/users/{id}/claims", + "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.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityUserClaimDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetOrganizationUnitsAsyncById": { + "uniqueName": "GetOrganizationUnitsAsyncById", + "name": "GetOrganizationUnitsAsync", + "httpMethod": "GET", + "url": "api/identity/users/{id}/organization-units", + "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.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.OrganizationUnitDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "UpdateRolesAsyncByIdAndInput": { + "uniqueName": "UpdateRolesAsyncByIdAndInput", + "name": "UpdateRolesAsync", + "httpMethod": "PUT", + "url": "api/identity/users/{id}/roles", + "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.IdentityUserUpdateRolesDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityUserUpdateRolesDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateRolesDto", + "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.IdentityUserUpdateRolesDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateRolesDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "UpdateClaimsAsyncByIdAndInput": { + "uniqueName": "UpdateClaimsAsyncByIdAndInput", + "name": "UpdateClaimsAsync", + "httpMethod": "PUT", + "url": "api/identity/users/{id}/claims", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "System.Collections.Generic.List`1[[Volo.Abp.Identity.IdentityUserClaimDto, Volo.Abp.Identity.Pro.Application.Contracts, Version=10.1.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib", + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityUserClaimDto]", + "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": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityUserClaimDto]", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "LockAsyncByIdAndLockoutEnd": { + "uniqueName": "LockAsyncByIdAndLockoutEnd", + "name": "LockAsync", + "httpMethod": "PUT", + "url": "api/identity/users/{id}/lock/{lockoutEnd}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "lockoutEnd", + "typeAsString": "System.DateTime, System.Private.CoreLib", + "type": "System.DateTime", + "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": "lockoutEnd", + "name": "lockoutEnd", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "UnlockAsyncById": { + "uniqueName": "UnlockAsyncById", + "name": "UnlockAsync", + "httpMethod": "PUT", + "url": "api/identity/users/{id}/unlock", + "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.IIdentityUserAppService" + }, + "FindByUsernameAsyncByUsername": { + "uniqueName": "FindByUsernameAsyncByUsername", + "name": "FindByUsernameAsync", + "httpMethod": "GET", + "url": "api/identity/users/by-username/{username}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "username", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "username", + "name": "username", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "FindByEmailAsyncByEmail": { + "uniqueName": "FindByEmailAsyncByEmail", + "name": "FindByEmailAsync", + "httpMethod": "GET", + "url": "api/identity/users/by-email/{email}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "email", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "email", + "name": "email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetTwoFactorEnabledAsyncById": { + "uniqueName": "GetTwoFactorEnabledAsyncById", + "name": "GetTwoFactorEnabledAsync", + "httpMethod": "GET", + "url": "api/identity/users/{id}/two-factor-enabled", + "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.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "SetTwoFactorEnabledAsyncByIdAndEnabled": { + "uniqueName": "SetTwoFactorEnabledAsyncByIdAndEnabled", + "name": "SetTwoFactorEnabledAsync", + "httpMethod": "PUT", + "url": "api/identity/users/{id}/two-factor/{enabled}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "enabled", + "typeAsString": "System.Boolean, System.Private.CoreLib", + "type": "System.Boolean", + "typeSimple": "boolean", + "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": "enabled", + "name": "enabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "UpdatePasswordAsyncByIdAndInput": { + "uniqueName": "UpdatePasswordAsyncByIdAndInput", + "name": "UpdatePasswordAsync", + "httpMethod": "PUT", + "url": "api/identity/users/{id}/change-password", + "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.IdentityUserUpdatePasswordInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput", + "typeSimple": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput", + "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.IdentityUserUpdatePasswordInput", + "typeSimple": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetRoleLookupAsync": { + "uniqueName": "GetRoleLookupAsync", + "name": "GetRoleLookupAsync", + "httpMethod": "GET", + "url": "api/identity/users/lookup/roles", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.IdentityRoleLookupDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetOrganizationUnitLookupAsync": { + "uniqueName": "GetOrganizationUnitLookupAsync", + "name": "GetOrganizationUnitLookupAsync", + "httpMethod": "GET", + "url": "api/identity/users/lookup/organization-units", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.OrganizationUnitLookupDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetExternalLoginProvidersAsync": { + "uniqueName": "GetExternalLoginProvidersAsync", + "name": "GetExternalLoginProvidersAsync", + "httpMethod": "GET", + "url": "api/identity/users/external-login-Providers", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.Identity.ExternalLoginProviderDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "ImportExternalUserAsyncByInput": { + "uniqueName": "ImportExternalUserAsyncByInput", + "name": "ImportExternalUserAsync", + "httpMethod": "POST", + "url": "api/identity/users/import-external-user", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.ImportExternalUserInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.ImportExternalUserInput", + "typeSimple": "Volo.Abp.Identity.ImportExternalUserInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Identity.ImportExternalUserInput", + "typeSimple": "Volo.Abp.Identity.ImportExternalUserInput", + "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.Identity.IIdentityUserAppService" + }, + "GetListAsExcelFileAsyncByInput": { + "uniqueName": "GetListAsExcelFileAsyncByInput", + "name": "GetListAsExcelFileAsync", + "httpMethod": "GET", + "url": "api/identity/users/export-as-excel", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityUserListAsFileInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityUserListAsFileInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityUserListAsFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "RoleId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "OrganizationUnitId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Id", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "IsLockedOut", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "NotActive", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "IsExternal", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxCreationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MinCreationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxModifitionTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MinModifitionTime", + "jsonName": null, + "type": "System.DateTime?", + "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" + }, + { + "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": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": true, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetListAsCsvFileAsyncByInput": { + "uniqueName": "GetListAsCsvFileAsyncByInput", + "name": "GetListAsCsvFileAsync", + "httpMethod": "GET", + "url": "api/identity/users/export-as-csv", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetIdentityUserListAsFileInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetIdentityUserListAsFileInput", + "typeSimple": "Volo.Abp.Identity.GetIdentityUserListAsFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "RoleId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "OrganizationUnitId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Id", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "IsLockedOut", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "NotActive", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "IsExternal", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxCreationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MinCreationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxModifitionTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MinModifitionTime", + "jsonName": null, + "type": "System.DateTime?", + "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" + }, + { + "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": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": true, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetDownloadTokenAsync": { + "uniqueName": "GetDownloadTokenAsync", + "name": "GetDownloadTokenAsync", + "httpMethod": "GET", + "url": "api/identity/users/download-token", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Identity.DownloadTokenResultDto", + "typeSimple": "Volo.Abp.Identity.DownloadTokenResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetImportUsersSampleFileAsyncByInput": { + "uniqueName": "GetImportUsersSampleFileAsyncByInput", + "name": "GetImportUsersSampleFileAsync", + "httpMethod": "GET", + "url": "api/identity/users/import-users-sample-file", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetImportUsersSampleFileInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetImportUsersSampleFileInput", + "typeSimple": "Volo.Abp.Identity.GetImportUsersSampleFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "FileType", + "jsonName": null, + "type": "Volo.Abp.Identity.ImportUsersFromFileType", + "typeSimple": "enum", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "ImportUsersFromFileAsyncByInput": { + "uniqueName": "ImportUsersFromFileAsyncByInput", + "name": "ImportUsersFromFileAsync", + "httpMethod": "POST", + "url": "api/identity/users/import-users-from-file", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.ImportUsersFromFileInputWithStream, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.ImportUsersFromFileInputWithStream", + "typeSimple": "Volo.Abp.Identity.ImportUsersFromFileInputWithStream", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "File", + "jsonName": null, + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "FormFile", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "FileType", + "jsonName": null, + "type": "Volo.Abp.Identity.ImportUsersFromFileType", + "typeSimple": "enum", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.ImportUsersFromFileOutput", + "typeSimple": "Volo.Abp.Identity.ImportUsersFromFileOutput" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + }, + "GetImportInvalidUsersFileAsyncByInput": { + "uniqueName": "GetImportInvalidUsersFileAsyncByInput", + "name": "GetImportInvalidUsersFileAsync", + "httpMethod": "GET", + "url": "api/identity/users/download-import-invalid-users-file", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetImportInvalidUsersFileInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetImportInvalidUsersFileInput", + "typeSimple": "Volo.Abp.Identity.GetImportInvalidUsersFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" + } + } + }, + "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", + "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.Pro.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.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.UserLookupCountInputDto", + "typeSimple": "Volo.Abp.Identity.UserLookupCountInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Int64", + "typeSimple": "number" + } + } + ] + } + ], + "actions": { + "FindByIdAsyncById": { + "uniqueName": "FindByIdAsyncById", + "name": "FindByIdAsync", + "httpMethod": "GET", + "url": "api/identity/users/lookup/{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.Users.UserData", + "typeSimple": "Volo.Abp.Users.UserData" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserLookupAppService" + }, + "FindByUserNameAsyncByUserName": { + "uniqueName": "FindByUserNameAsyncByUserName", + "name": "FindByUserNameAsync", + "httpMethod": "GET", + "url": "api/identity/users/lookup/by-username/{userName}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "userName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "userName", + "name": "userName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Users.UserData", + "typeSimple": "Volo.Abp.Users.UserData" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserLookupAppService" + }, + "SearchAsyncByInput": { + "uniqueName": "SearchAsyncByInput", + "name": "SearchAsync", + "httpMethod": "GET", + "url": "api/identity/users/lookup/search", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.UserLookupSearchInputDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.UserLookupSearchInputDto", + "typeSimple": "Volo.Abp.Identity.UserLookupSearchInputDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Filter", + "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" + }, + { + "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": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserLookupAppService" + }, + "GetCountAsyncByInput": { + "uniqueName": "GetCountAsyncByInput", + "name": "GetCountAsync", + "httpMethod": "GET", + "url": "api/identity/users/lookup/count", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.UserLookupCountInputDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.UserLookupCountInputDto", + "typeSimple": "Volo.Abp.Identity.UserLookupCountInputDto", + "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" + } + ], + "returnValue": { + "type": "System.Int64", + "typeSimple": "number" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserLookupAppService" + } + } + }, + "Volo.Abp.Identity.OrganizationUnitController": { + "controllerName": "OrganizationUnit", + "controllerGroupName": "OrganizationUnit", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.Identity.OrganizationUnitController", + "interfaces": [ + { + "type": "Volo.Abp.Identity.IOrganizationUnitAppService", + "name": "IOrganizationUnitAppService", + "methods": [ + { + "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.OrganizationUnitWithDetailsDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetOrganizationUnitInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetOrganizationUnitInput", + "typeSimple": "Volo.Abp.Identity.GetOrganizationUnitInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetListAllAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "GetMembersAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetMembersInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetMembersInput", + "typeSimple": "Volo.Abp.Identity.GetMembersInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "RemoveMemberAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "memberId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetRolesAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto, Volo.Abp.Ddd.Application.Contracts", + "type": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "RemoveRoleAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "roleId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.OrganizationUnitCreateDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.OrganizationUnitCreateDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto" + } + }, + { + "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" + } + }, + { + "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.OrganizationUnitUpdateDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.OrganizationUnitUpdateDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitUpdateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto" + } + }, + { + "name": "AddRolesAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.OrganizationUnitRoleInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.OrganizationUnitRoleInput", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitRoleInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "AddMembersAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.OrganizationUnitUserInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.OrganizationUnitUserInput", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitUserInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "MoveAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.OrganizationUnitMoveInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.OrganizationUnitMoveInput", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitMoveInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetAvailableUsersAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetAvailableUsersInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetAvailableUsersInput", + "typeSimple": "Volo.Abp.Identity.GetAvailableUsersInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetAvailableRolesAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetAvailableRolesInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetAvailableRolesInput", + "typeSimple": "Volo.Abp.Identity.GetAvailableRolesInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "MoveAllUsersAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "targetOrganizationId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib", + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "AddRolesAsyncByIdAndInput": { + "uniqueName": "AddRolesAsyncByIdAndInput", + "name": "AddRolesAsync", + "httpMethod": "PUT", + "url": "api/identity/organization-units/{id}/roles", + "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.OrganizationUnitRoleInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.OrganizationUnitRoleInput", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitRoleInput", + "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.OrganizationUnitRoleInput", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitRoleInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "AddMembersAsyncByIdAndInput": { + "uniqueName": "AddMembersAsyncByIdAndInput", + "name": "AddMembersAsync", + "httpMethod": "PUT", + "url": "api/identity/organization-units/{id}/members", + "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.OrganizationUnitUserInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.OrganizationUnitUserInput", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitUserInput", + "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.OrganizationUnitUserInput", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitUserInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/identity/organization-units", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.OrganizationUnitCreateDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.OrganizationUnitCreateDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Identity.OrganizationUnitCreateDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitCreateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/identity/organization-units", + "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": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/identity/organization-units/{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.Identity.OrganizationUnitWithDetailsDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/identity/organization-units", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetOrganizationUnitInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetOrganizationUnitInput", + "typeSimple": "Volo.Abp.Identity.GetOrganizationUnitInput", + "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" + }, + { + "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": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "GetListAllAsync": { + "uniqueName": "GetListAllAsync", + "name": "GetListAllAsync", + "httpMethod": "GET", + "url": "api/identity/organization-units/all", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "GetRolesAsyncByIdAndInput": { + "uniqueName": "GetRolesAsyncByIdAndInput", + "name": "GetRolesAsync", + "httpMethod": "GET", + "url": "api/identity/organization-units/{id}/roles", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto, Volo.Abp.Ddd.Application.Contracts", + "type": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "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": "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.Identity.IOrganizationUnitAppService" + }, + "GetMembersAsyncByIdAndInput": { + "uniqueName": "GetMembersAsyncByIdAndInput", + "name": "GetMembersAsync", + "httpMethod": "GET", + "url": "api/identity/organization-units/{id}/members", + "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.GetMembersInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetMembersInput", + "typeSimple": "Volo.Abp.Identity.GetMembersInput", + "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": "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.Identity.IOrganizationUnitAppService" + }, + "MoveAsyncByIdAndInput": { + "uniqueName": "MoveAsyncByIdAndInput", + "name": "MoveAsync", + "httpMethod": "PUT", + "url": "api/identity/organization-units/{id}/move", + "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.OrganizationUnitMoveInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.OrganizationUnitMoveInput", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitMoveInput", + "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.OrganizationUnitMoveInput", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitMoveInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "GetAvailableUsersAsyncByInput": { + "uniqueName": "GetAvailableUsersAsyncByInput", + "name": "GetAvailableUsersAsync", + "httpMethod": "GET", + "url": "api/identity/organization-units/available-users", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetAvailableUsersInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetAvailableUsersInput", + "typeSimple": "Volo.Abp.Identity.GetAvailableUsersInput", + "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": "Id", + "jsonName": null, + "type": "System.Guid", + "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" + }, + { + "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": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "GetAvailableRolesAsyncByInput": { + "uniqueName": "GetAvailableRolesAsyncByInput", + "name": "GetAvailableRolesAsync", + "httpMethod": "GET", + "url": "api/identity/organization-units/available-roles", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Identity.GetAvailableRolesInput, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.GetAvailableRolesInput", + "typeSimple": "Volo.Abp.Identity.GetAvailableRolesInput", + "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": "Id", + "jsonName": null, + "type": "System.Guid", + "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" + }, + { + "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": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "MoveAllUsersAsyncByIdAndOrganizationId": { + "uniqueName": "MoveAllUsersAsyncByIdAndOrganizationId", + "name": "MoveAllUsersAsync", + "httpMethod": "PUT", + "url": "api/identity/organization-units/{id}/move-all-users", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "organizationId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], 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": "" + }, + { + "nameOnMethod": "organizationId", + "name": "organizationId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/identity/organization-units/{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.OrganizationUnitUpdateDto, Volo.Abp.Identity.Pro.Application.Contracts", + "type": "Volo.Abp.Identity.OrganizationUnitUpdateDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitUpdateDto", + "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.OrganizationUnitUpdateDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitUpdateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto", + "typeSimple": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IOrganizationUnitAppService" + }, + "RemoveMemberAsyncByIdAndMemberId": { + "uniqueName": "RemoveMemberAsyncByIdAndMemberId", + "name": "RemoveMemberAsync", + "httpMethod": "DELETE", + "url": "api/identity/organization-units/{id}/members/{memberId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "memberId", + "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": "" + }, + { + "nameOnMethod": "memberId", + "name": "memberId", + "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.IOrganizationUnitAppService" + }, + "RemoveRoleAsyncByIdAndRoleId": { + "uniqueName": "RemoveRoleAsyncByIdAndRoleId", + "name": "RemoveRoleAsync", + "httpMethod": "DELETE", + "url": "api/identity/organization-units/{id}/roles/{roleId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "roleId", + "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": "" + }, + { + "nameOnMethod": "roleId", + "name": "roleId", + "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.IOrganizationUnitAppService" + } + } + } + } + }, + "languageManagement": { + "rootPath": "languageManagement", + "remoteServiceName": "LanguageManagement", + "controllers": { + "Volo.Abp.LanguageManagement.LanguageController": { + "controllerName": "Language", + "controllerGroupName": "Languages", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.LanguageManagement.LanguageController", + "interfaces": [ + { + "type": "Volo.Abp.LanguageManagement.ILanguageAppService", + "name": "ILanguageAppService", + "methods": [ + { + "name": "GetAllListAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "SetAsDefaultAsync", + "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": "GetResourcesAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.LanguageManagement.Dto.LanguageResourceDto]" + } + }, + { + "name": "GetCulturelistAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.LanguageManagement.Dto.CultureInfoDto]" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.LanguageManagement.Dto.LanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput, Volo.Abp.LanguageManagement.Application.Contracts", + "type": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput", + "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.LanguageManagement.Dto.CreateLanguageDto, Volo.Abp.LanguageManagement.Application.Contracts", + "type": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.LanguageManagement.Dto.LanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageDto" + } + }, + { + "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.LanguageManagement.Dto.UpdateLanguageDto, Volo.Abp.LanguageManagement.Application.Contracts", + "type": "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.LanguageManagement.Dto.LanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageDto" + } + }, + { + "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": { + "GetAllListAsync": { + "uniqueName": "GetAllListAsync", + "name": "GetAllListAsync", + "httpMethod": "GET", + "url": "api/language-management/languages/all", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.LanguageManagement.ILanguageAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/language-management/languages", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput, Volo.Abp.LanguageManagement.Application.Contracts", + "type": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput", + "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": "ResourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "BaseCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "TargetCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "GetOnlyEmptyValues", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "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" + }, + "GetAsyncById": { + "uniqueName": "GetAsyncById", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/language-management/languages/{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.LanguageManagement.Dto.LanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "CreateAsyncByInput": { + "uniqueName": "CreateAsyncByInput", + "name": "CreateAsync", + "httpMethod": "POST", + "url": "api/language-management/languages", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto, Volo.Abp.LanguageManagement.Application.Contracts", + "type": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.LanguageManagement.Dto.LanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/language-management/languages/{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.LanguageManagement.Dto.UpdateLanguageDto, Volo.Abp.LanguageManagement.Application.Contracts", + "type": "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto", + "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.LanguageManagement.Dto.UpdateLanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.LanguageManagement.Dto.LanguageDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/language-management/languages/{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.Application.Services.IDeleteAppService" + }, + "SetAsDefaultAsyncById": { + "uniqueName": "SetAsDefaultAsyncById", + "name": "SetAsDefaultAsync", + "httpMethod": "PUT", + "url": "api/language-management/languages/{id}/set-as-default", + "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.LanguageManagement.ILanguageAppService" + }, + "GetResourcesAsync": { + "uniqueName": "GetResourcesAsync", + "name": "GetResourcesAsync", + "httpMethod": "GET", + "url": "api/language-management/languages/resources", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.LanguageManagement.Dto.LanguageResourceDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.LanguageManagement.ILanguageAppService" + }, + "GetCulturelistAsync": { + "uniqueName": "GetCulturelistAsync", + "name": "GetCulturelistAsync", + "httpMethod": "GET", + "url": "api/language-management/languages/culture-list", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.LanguageManagement.Dto.CultureInfoDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.LanguageManagement.ILanguageAppService" + } + } + }, + "Volo.Abp.LanguageManagement.LanguageTextController": { + "controllerName": "LanguageText", + "controllerGroupName": "LanguageTexts", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.LanguageManagement.LanguageTextController", + "interfaces": [ + { + "type": "Volo.Abp.LanguageManagement.ILanguageTextAppService", + "name": "ILanguageTextAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput, Volo.Abp.LanguageManagement.Application.Contracts", + "type": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "cultureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "name", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "baseCultureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.LanguageManagement.Dto.LanguageTextDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageTextDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "cultureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "name", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "value", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "RestoreToDefaultAsync", + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "cultureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "name", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/language-management/language-texts", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput, Volo.Abp.LanguageManagement.Application.Contracts", + "type": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput", + "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": "ResourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "BaseCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "TargetCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "GetOnlyEmptyValues", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "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.LanguageManagement.ILanguageTextAppService" + }, + "GetAsyncByResourceNameAndCultureNameAndNameAndBaseCultureName": { + "uniqueName": "GetAsyncByResourceNameAndCultureNameAndNameAndBaseCultureName", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/language-management/language-texts/{resourceName}/{cultureName}/{name}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "cultureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "name", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "baseCultureName", + "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": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "cultureName", + "name": "cultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "name", + "name": "name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "baseCultureName", + "name": "baseCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.LanguageManagement.Dto.LanguageTextDto", + "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageTextDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.LanguageManagement.ILanguageTextAppService" + }, + "UpdateAsyncByResourceNameAndCultureNameAndNameAndValue": { + "uniqueName": "UpdateAsyncByResourceNameAndCultureNameAndNameAndValue", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/language-management/language-texts/{resourceName}/{cultureName}/{name}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "cultureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "name", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "value", + "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": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "cultureName", + "name": "cultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "name", + "name": "name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "value", + "name": "value", + "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.LanguageManagement.ILanguageTextAppService" + }, + "RestoreToDefaultAsyncByResourceNameAndCultureNameAndName": { + "uniqueName": "RestoreToDefaultAsyncByResourceNameAndCultureNameAndName", + "name": "RestoreToDefaultAsync", + "httpMethod": "PUT", + "url": "api/language-management/language-texts/{resourceName}/{cultureName}/{name}/restore", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "resourceName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "cultureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "name", + "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": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "cultureName", + "name": "cultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "name", + "name": "name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.LanguageManagement.ILanguageTextAppService" + } + } + } + } + }, + "openiddictpro": { + "rootPath": "openiddictpro", + "remoteServiceName": "OpenIddictPro", + "controllers": { + "Volo.Abp.OpenIddict.ApplicationController": { + "controllerName": "Application", + "controllerGroupName": "Applications", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.OpenIddict.ApplicationController", + "interfaces": [ + { + "type": "Volo.Abp.OpenIddict.Applications.IApplicationAppService", + "name": "IApplicationAppService", + "methods": [ + { + "name": "GetTokenLifetimeAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto" + } + }, + { + "name": "SetTokenLifetimeAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto", + "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.OpenIddict.Applications.Dtos.ApplicationDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.OpenIddict.Applications.Dtos.GetApplicationListInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Applications.Dtos.GetApplicationListInput", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.GetApplicationListInput", + "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.OpenIddict.Applications.Dtos.CreateApplicationInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Applications.Dtos.CreateApplicationInput", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.CreateApplicationInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto" + } + }, + { + "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.OpenIddict.Applications.Dtos.UpdateApplicationInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Applications.Dtos.UpdateApplicationInput", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.UpdateApplicationInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto" + } + }, + { + "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/openiddict/applications/{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.OpenIddict.Applications.Dtos.ApplicationDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/openiddict/applications", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.OpenIddict.Applications.Dtos.GetApplicationListInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Applications.Dtos.GetApplicationListInput", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.GetApplicationListInput", + "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/openiddict/applications", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.OpenIddict.Applications.Dtos.CreateApplicationInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Applications.Dtos.CreateApplicationInput", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.CreateApplicationInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.OpenIddict.Applications.Dtos.CreateApplicationInput", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.CreateApplicationInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/openiddict/applications/{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.OpenIddict.Applications.Dtos.UpdateApplicationInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Applications.Dtos.UpdateApplicationInput", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.UpdateApplicationInput", + "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.OpenIddict.Applications.Dtos.UpdateApplicationInput", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.UpdateApplicationInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/openiddict/applications", + "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": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "GetTokenLifetimeAsyncById": { + "uniqueName": "GetTokenLifetimeAsyncById", + "name": "GetTokenLifetimeAsync", + "httpMethod": "GET", + "url": "api/openiddict/applications/{id}/token-lifetime", + "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.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.OpenIddict.Applications.IApplicationAppService" + }, + "SetTokenLifetimeAsyncByIdAndInput": { + "uniqueName": "SetTokenLifetimeAsyncByIdAndInput", + "name": "SetTokenLifetimeAsync", + "httpMethod": "PUT", + "url": "api/openiddict/applications/{id}/token-lifetime", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto", + "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.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto", + "typeSimple": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.OpenIddict.Applications.IApplicationAppService" + } + } + }, + "Volo.Abp.OpenIddict.ScopeController": { + "controllerName": "Scope", + "controllerGroupName": "Scopes", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.OpenIddict.ScopeController", + "interfaces": [ + { + "type": "Volo.Abp.OpenIddict.Scopes.IScopeAppService", + "name": "IScopeAppService", + "methods": [ + { + "name": "GetAllScopesAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto]" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.OpenIddict.Scopes.Dtos.GetScopeListInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.GetScopeListInput", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.GetScopeListInput", + "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.OpenIddict.Scopes.Dtos.CreateScopeInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.CreateScopeInput", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.CreateScopeInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto" + } + }, + { + "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.OpenIddict.Scopes.Dtos.UpdateScopeInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.UpdateScopeInput", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.UpdateScopeInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto" + } + }, + { + "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/openiddict/scopes/{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.OpenIddict.Scopes.Dtos.ScopeDto", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/openiddict/scopes", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.OpenIddict.Scopes.Dtos.GetScopeListInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.GetScopeListInput", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.GetScopeListInput", + "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/openiddict/scopes", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.OpenIddict.Scopes.Dtos.CreateScopeInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.CreateScopeInput", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.CreateScopeInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.CreateScopeInput", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.CreateScopeInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/openiddict/scopes/{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.OpenIddict.Scopes.Dtos.UpdateScopeInput, Volo.Abp.OpenIddict.Pro.Application.Contracts", + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.UpdateScopeInput", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.UpdateScopeInput", + "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.OpenIddict.Scopes.Dtos.UpdateScopeInput", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.UpdateScopeInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto", + "typeSimple": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/openiddict/scopes", + "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": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "GetAllScopesAsync": { + "uniqueName": "GetAllScopesAsync", + "name": "GetAllScopesAsync", + "httpMethod": "GET", + "url": "api/openiddict/scopes/all", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.OpenIddict.Scopes.IScopeAppService" + } + } + } + } + }, + "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" + } + } + ] + } + ], + "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" + } + } + } + } + }, + "saas": { + "rootPath": "saas", + "remoteServiceName": "SaasHost", + "controllers": { + "Volo.Saas.Host.EditionController": { + "controllerName": "Edition", + "controllerGroupName": "Edition", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Saas.Host.EditionController", + "interfaces": [ + { + "type": "Volo.Saas.Host.IEditionAppService", + "name": "IEditionAppService", + "methods": [ + { + "name": "GetAllListAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Saas.Host.Dtos.EditionDto]" + } + }, + { + "name": "GetUsageStatisticsAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Saas.Host.GetEditionUsageStatisticsResultDto", + "typeSimple": "Volo.Saas.Host.GetEditionUsageStatisticsResultDto" + } + }, + { + "name": "GetPlanLookupAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Payment.Plans.PlanDto]" + } + }, + { + "name": "MoveAllTenantsAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "targetEditionId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], 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.Saas.Host.Dtos.EditionDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.GetEditionsInput, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.GetEditionsInput", + "typeSimple": "Volo.Saas.Host.Dtos.GetEditionsInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "CreateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.EditionCreateDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.EditionCreateDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.EditionDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.EditionUpdateDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.EditionUpdateDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionUpdateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.EditionDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionDto" + } + }, + { + "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/saas/editions/{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.Saas.Host.Dtos.EditionDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/saas/editions", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.GetEditionsInput, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.GetEditionsInput", + "typeSimple": "Volo.Saas.Host.Dtos.GetEditionsInput", + "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/saas/editions", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.EditionCreateDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.EditionCreateDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Saas.Host.Dtos.EditionCreateDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionCreateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.EditionDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/saas/editions/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.EditionUpdateDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.EditionUpdateDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionUpdateDto", + "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.Saas.Host.Dtos.EditionUpdateDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionUpdateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.EditionDto", + "typeSimple": "Volo.Saas.Host.Dtos.EditionDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/saas/editions/{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.Application.Services.IDeleteAppService" + }, + "MoveAllTenantsAsyncByIdAndEditionId": { + "uniqueName": "MoveAllTenantsAsyncByIdAndEditionId", + "name": "MoveAllTenantsAsync", + "httpMethod": "PUT", + "url": "api/saas/editions/{id}/move-all-tenants", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "editionId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], 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": "" + }, + { + "nameOnMethod": "editionId", + "name": "editionId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.IEditionAppService" + }, + "GetAllListAsync": { + "uniqueName": "GetAllListAsync", + "name": "GetAllListAsync", + "httpMethod": "GET", + "url": "api/saas/editions/all", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Saas.Host.Dtos.EditionDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.IEditionAppService" + }, + "GetUsageStatisticsAsync": { + "uniqueName": "GetUsageStatisticsAsync", + "name": "GetUsageStatisticsAsync", + "httpMethod": "GET", + "url": "api/saas/editions/statistics/usage-statistic", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Saas.Host.GetEditionUsageStatisticsResultDto", + "typeSimple": "Volo.Saas.Host.GetEditionUsageStatisticsResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.IEditionAppService" + }, + "GetPlanLookupAsync": { + "uniqueName": "GetPlanLookupAsync", + "name": "GetPlanLookupAsync", + "httpMethod": "GET", + "url": "api/saas/editions/plan-lookup", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Payment.Plans.PlanDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.IEditionAppService" + } + } + }, + "Volo.Saas.Host.SettingsController": { + "controllerName": "Settings", + "controllerGroupName": "Setting", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Saas.Host.SettingsController", + "interfaces": [ + { + "type": "Volo.Saas.Host.IHostSettingsAppService", + "name": "IHostSettingsAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.SaasHostSettingDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasHostSettingDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.SaasHostSettingDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.SaasHostSettingDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasHostSettingDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + } + ] + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/saas/settings", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.SaasHostSettingDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasHostSettingDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.IHostSettingsAppService" + }, + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/saas/settings", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.SaasHostSettingDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.SaasHostSettingDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasHostSettingDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Saas.Host.Dtos.SaasHostSettingDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasHostSettingDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.IHostSettingsAppService" + } + } + }, + "Volo.Saas.Host.SubscriptionController": { + "controllerName": "Subscription", + "controllerGroupName": "Edition", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Saas.Host.SubscriptionController", + "interfaces": [ + { + "type": "Volo.Saas.Subscription.ISubscriptionAppService", + "name": "ISubscriptionAppService", + "methods": [ + { + "name": "CreateSubscriptionAsync", + "parametersOnMethod": [ + { + "name": "editionId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "tenantId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Payment.Requests.PaymentRequestWithDetailsDto", + "typeSimple": "Volo.Payment.Requests.PaymentRequestWithDetailsDto" + } + } + ] + } + ], + "actions": { + "CreateSubscriptionAsyncByEditionIdAndTenantId": { + "uniqueName": "CreateSubscriptionAsyncByEditionIdAndTenantId", + "name": "CreateSubscriptionAsync", + "httpMethod": "POST", + "url": "api/saas/subscription", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "editionId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "tenantId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "editionId", + "name": "editionId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "tenantId", + "name": "tenantId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Payment.Requests.PaymentRequestWithDetailsDto", + "typeSimple": "Volo.Payment.Requests.PaymentRequestWithDetailsDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Saas.Subscription.ISubscriptionAppService" + } + } + }, + "Volo.Saas.Host.TenantController": { + "controllerName": "Tenant", + "controllerGroupName": "Tenant", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Saas.Host.TenantController", + "interfaces": [ + { + "type": "Volo.Saas.Host.ITenantAppService", + "name": "ITenantAppService", + "methods": [ + { + "name": "GetDatabasesAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.SaasTenantDatabasesDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDatabasesDto" + } + }, + { + "name": "GetConnectionStringsAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto" + } + }, + { + "name": "UpdateConnectionStringsAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "ApplyDatabaseMigrationsAsync", + "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": "GetEditionLookupAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Saas.Host.Dtos.EditionLookupDto]" + } + }, + { + "name": "CheckConnectionStringAsync", + "parametersOnMethod": [ + { + "name": "connectionString", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + }, + { + "name": "SetPasswordAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.SaasTenantSetPasswordDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.SaasTenantSetPasswordDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantSetPasswordDto", + "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.Saas.Host.Dtos.SaasTenantDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDto" + } + }, + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.GetTenantsInput, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.GetTenantsInput", + "typeSimple": "Volo.Saas.Host.Dtos.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.Saas.Host.Dtos.SaasTenantCreateDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.SaasTenantCreateDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.SaasTenantDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDto" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.SaasTenantDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDto" + } + }, + { + "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/saas/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.Saas.Host.Dtos.SaasTenantDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" + }, + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/saas/tenants", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.GetTenantsInput, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.GetTenantsInput", + "typeSimple": "Volo.Saas.Host.Dtos.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": "GetEditionNames", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "EditionId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ExpirationDateMin", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ExpirationDateMax", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ActivationState", + "jsonName": null, + "type": "Volo.Saas.TenantActivationState?", + "typeSimple": "enum?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ActivationEndDateMin", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "ActivationEndDateMax", + "jsonName": null, + "type": "System.DateTime?", + "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/saas/tenants", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.SaasTenantCreateDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.SaasTenantCreateDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantCreateDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Saas.Host.Dtos.SaasTenantCreateDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantCreateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.SaasTenantDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" + }, + "UpdateAsyncByIdAndInput": { + "uniqueName": "UpdateAsyncByIdAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/saas/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.Saas.Host.Dtos.SaasTenantUpdateDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto", + "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.Saas.Host.Dtos.SaasTenantUpdateDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.SaasTenantDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" + }, + "DeleteAsyncById": { + "uniqueName": "DeleteAsyncById", + "name": "DeleteAsync", + "httpMethod": "DELETE", + "url": "api/saas/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.Application.Services.IDeleteAppService" + }, + "GetDatabasesAsync": { + "uniqueName": "GetDatabasesAsync", + "name": "GetDatabasesAsync", + "httpMethod": "GET", + "url": "api/saas/tenants/databases", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Saas.Host.Dtos.SaasTenantDatabasesDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDatabasesDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.ITenantAppService" + }, + "GetConnectionStringsAsyncById": { + "uniqueName": "GetConnectionStringsAsyncById", + "name": "GetConnectionStringsAsync", + "httpMethod": "GET", + "url": "api/saas/tenants/{id}/connection-strings", + "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.Saas.Host.Dtos.SaasTenantConnectionStringsDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.ITenantAppService" + }, + "UpdateConnectionStringsAsyncByIdAndInput": { + "uniqueName": "UpdateConnectionStringsAsyncByIdAndInput", + "name": "UpdateConnectionStringsAsync", + "httpMethod": "PUT", + "url": "api/saas/tenants/{id}/connection-strings", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto", + "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.Saas.Host.Dtos.SaasTenantConnectionStringsDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.ITenantAppService" + }, + "ApplyDatabaseMigrationsAsyncById": { + "uniqueName": "ApplyDatabaseMigrationsAsyncById", + "name": "ApplyDatabaseMigrationsAsync", + "httpMethod": "POST", + "url": "api/saas/tenants/{id}/apply-database-migrations", + "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.Saas.Host.ITenantAppService" + }, + "GetEditionLookupAsync": { + "uniqueName": "GetEditionLookupAsync", + "name": "GetEditionLookupAsync", + "httpMethod": "GET", + "url": "api/saas/tenants/lookup/editions", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Saas.Host.Dtos.EditionLookupDto]" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.ITenantAppService" + }, + "CheckConnectionStringAsyncByConnectionString": { + "uniqueName": "CheckConnectionStringAsyncByConnectionString", + "name": "CheckConnectionStringAsync", + "httpMethod": "GET", + "url": "api/saas/tenants/check-connection-string", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "connectionString", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "connectionString", + "name": "connectionString", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.ITenantAppService" + }, + "SetPasswordAsyncByIdAndInput": { + "uniqueName": "SetPasswordAsyncByIdAndInput", + "name": "SetPasswordAsync", + "httpMethod": "PUT", + "url": "api/saas/tenants/{id}/set-password", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "input", + "typeAsString": "Volo.Saas.Host.Dtos.SaasTenantSetPasswordDto, Volo.Saas.Host.Application.Contracts", + "type": "Volo.Saas.Host.Dtos.SaasTenantSetPasswordDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantSetPasswordDto", + "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.Saas.Host.Dtos.SaasTenantSetPasswordDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantSetPasswordDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Saas.Host.ITenantAppService" + } + } + } + } + }, + "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" + } + } + } + } + }, + "textTemplateManagement": { + "rootPath": "textTemplateManagement", + "remoteServiceName": "TextTemplateManagement", + "controllers": { + "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateContentController": { + "controllerName": "TemplateContent", + "controllerGroupName": "TextTemplateContents", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateContentController", + "interfaces": [ + { + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.ITemplateContentAppService", + "name": "ITemplateContentAppService", + "methods": [ + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput, Volo.Abp.TextTemplateManagement.Application.Contracts", + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto" + } + }, + { + "name": "RestoreToDefaultAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput, Volo.Abp.TextTemplateManagement.Application.Contracts", + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "UpdateAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput, Volo.Abp.TextTemplateManagement.Application.Contracts", + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto" + } + } + ] + } + ], + "actions": { + "GetAsyncByInput": { + "uniqueName": "GetAsyncByInput", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/text-template-management/template-contents", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput, Volo.Abp.TextTemplateManagement.Application.Contracts", + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "TemplateName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.TextTemplateManagement.TextTemplates.ITemplateContentAppService" + }, + "RestoreToDefaultAsyncByInput": { + "uniqueName": "RestoreToDefaultAsyncByInput", + "name": "RestoreToDefaultAsync", + "httpMethod": "PUT", + "url": "api/text-template-management/template-contents/restore-to-default", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput, Volo.Abp.TextTemplateManagement.Application.Contracts", + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.TextTemplateManagement.TextTemplates.ITemplateContentAppService" + }, + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/text-template-management/template-contents", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput, Volo.Abp.TextTemplateManagement.Application.Contracts", + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.TextTemplateManagement.TextTemplates.ITemplateContentAppService" + } + } + }, + "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionController": { + "controllerName": "TemplateDefinition", + "controllerGroupName": "TextTemplateDefinitions", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionController", + "interfaces": [ + { + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.ITemplateDefinitionAppService", + "name": "ITemplateDefinitionAppService", + "methods": [ + { + "name": "GetListAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput, Volo.Abp.TextTemplateManagement.Application.Contracts", + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "GetAsync", + "parametersOnMethod": [ + { + "name": "name", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionDto", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionDto" + } + } + ] + } + ], + "actions": { + "GetListAsyncByInput": { + "uniqueName": "GetListAsyncByInput", + "name": "GetListAsync", + "httpMethod": "GET", + "url": "api/text-template-management/template-definitions", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput, Volo.Abp.TextTemplateManagement.Application.Contracts", + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "FilterText", + "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": false, + "implementFrom": "Volo.Abp.TextTemplateManagement.TextTemplates.ITemplateDefinitionAppService" + }, + "GetAsyncByName": { + "uniqueName": "GetAsyncByName", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/text-template-management/template-definitions/{name}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "name", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "name", + "name": "name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionDto", + "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.Abp.TextTemplateManagement.TextTemplates.ITemplateDefinitionAppService" + } + } + } + } + } + }, + "types": { + "System.Net.HttpStatusCode": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Continue", + "SwitchingProtocols", + "Processing", + "EarlyHints", + "OK", + "Created", + "Accepted", + "NonAuthoritativeInformation", + "NoContent", + "ResetContent", + "PartialContent", + "MultiStatus", + "AlreadyReported", + "IMUsed", + "MultipleChoices", + "Ambiguous", + "MovedPermanently", + "Moved", + "Found", + "Redirect", + "SeeOther", + "RedirectMethod", + "NotModified", + "UseProxy", + "Unused", + "TemporaryRedirect", + "RedirectKeepVerb", + "PermanentRedirect", + "BadRequest", + "Unauthorized", + "PaymentRequired", + "Forbidden", + "NotFound", + "MethodNotAllowed", + "NotAcceptable", + "ProxyAuthenticationRequired", + "RequestTimeout", + "Conflict", + "Gone", + "LengthRequired", + "PreconditionFailed", + "RequestEntityTooLarge", + "RequestUriTooLong", + "UnsupportedMediaType", + "RequestedRangeNotSatisfiable", + "ExpectationFailed", + "MisdirectedRequest", + "UnprocessableEntity", + "UnprocessableContent", + "Locked", + "FailedDependency", + "UpgradeRequired", + "PreconditionRequired", + "TooManyRequests", + "RequestHeaderFieldsTooLarge", + "UnavailableForLegalReasons", + "InternalServerError", + "NotImplemented", + "BadGateway", + "ServiceUnavailable", + "GatewayTimeout", + "HttpVersionNotSupported", + "VariantAlsoNegotiates", + "InsufficientStorage", + "LoopDetected", + "NotExtended", + "NetworkAuthenticationRequired" + ], + "enumValues": [ + 100, + 101, + 102, + 103, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 226, + 300, + 300, + 301, + 301, + 302, + 302, + 303, + 303, + 304, + 305, + 306, + 307, + 307, + 308, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 421, + 422, + 422, + 423, + 424, + 426, + 428, + 429, + 431, + 451, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 510, + 511 + ], + "genericArguments": null, + "properties": null + }, + "System.Nullable": { + "baseType": "System.ValueType", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "T" + ], + "properties": [ + { + "name": "HasValue", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "T", + "typeSimple": "T", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.AccountExternalLoginDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "LoginProvider", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ProviderKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ProviderDisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.AccountExternalProviderSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "VerifyPasswordDuringExternalLogin", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExternalProviders", + "jsonName": null, + "type": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettings]", + "typeSimple": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettings]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.AccountIdleSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Enabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IdleTimeoutMinutes", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.AccountRecaptchaSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UseCaptchaOnLogin", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UseCaptchaOnRegistration", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "VerifyBaseUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SiteKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SiteSecret", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Version", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "2", + "maximum": "3", + "regex": null + }, + { + "name": "Score", + "jsonName": null, + "type": "System.Double", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "0.1", + "maximum": "1", + "regex": null + } + ] + }, + "Volo.Abp.Account.AccountSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsSelfRegistrationEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnableLocalLogin", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PreventEmailEnumeration", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.AccountTwoFactorSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TwoFactorBehaviour", + "jsonName": null, + "type": "Volo.Abp.Identity.Features.IdentityProTwoFactorBehaviour", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRememberBrowserEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UsersCanChange", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.AuthenticatorInfoDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Key", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Uri", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ChangeEmailInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "NewEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + }, + { + "name": "NewPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.CheckEmailConfirmationCodeDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ConfirmEmailInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ConfirmPhoneNumberInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.DelegateNewUserInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TargetUserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "StartTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.EmailConfirmationCodeLimitDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "NextSendTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "NextTryTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ExternalProviders.ExternalProviderDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Providers", + "jsonName": null, + "type": "[Volo.Abp.Account.ExternalProviders.ExternalProviderItemDto]", + "typeSimple": "[Volo.Abp.Account.ExternalProviders.ExternalProviderItemDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ExternalProviders.ExternalProviderItemDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Enabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Properties", + "jsonName": null, + "type": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty]", + "typeSimple": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ExternalProviders.ExternalProviderItemWithSecretDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Success", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Enabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnabledForTenantUser", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Properties", + "jsonName": null, + "type": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty]", + "typeSimple": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SecretProperties", + "jsonName": null, + "type": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty]", + "typeSimple": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ExternalProviders.ExternalProviderSettings": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Enabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnabledForTenantUser", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UseCustomSettings", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Properties", + "jsonName": null, + "type": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty]", + "typeSimple": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SecretProperties", + "jsonName": null, + "type": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty]", + "typeSimple": "[Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ExternalProviders.ExternalProviderSettingsProperty": { + "baseType": "Volo.Abp.NameValue", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.Account.ExternalProviders.GetByNameInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.GetAccountIdentitySessionListInput": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Device", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.GetTwoFactorProvidersInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.GetUserLookupInput": { + "baseType": null, + "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 + } + ] + }, + "Volo.Abp.Account.IdentityUserConfirmationStateDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumberConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.IsLinkedInput": { + "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 + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.LinkUserDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TargetUserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TargetUserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TargetTenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TargetTenantName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DirectlyLinked", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.LinkUserInput": { + "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 + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumberConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsExternal", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HasPassword", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SupportsMultipleTimezone", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Timezone", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ProfilePictureInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Type", + "jsonName": null, + "type": "Volo.Abp.Account.ProfilePictureType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImageContent", + "jsonName": null, + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ProfilePictureSourceDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Type", + "jsonName": null, + "type": "Volo.Abp.Account.ProfilePictureType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FileContent", + "jsonName": null, + "type": "[System.Byte]", + "typeSimple": "[number]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ProfilePictureType": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "None", + "Gravatar", + "Image" + ], + "enumValues": [ + 0, + 1, + 2 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Abp.Account.Public.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.Public.Web.Areas.Account.Controllers.Models.LoginResultType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.LinkUserLoginInfo": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "LinkUserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LinkTenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.LoginResultType": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Success", + "InvalidUserNameOrPassword", + "NotAllowed", + "LockedOut", + "RequiresTwoFactor", + "NotLinked" + ], + "enumValues": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Abp.Account.Public.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 + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RememberMe", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + }, + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AppName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrlHash", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CaptchaResponse", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + }, + { + "name": "ResetToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.SendEmailConfirmationCodeDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CaptchaResponse", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.SendEmailConfirmationTokenDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AppName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrlHash", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + }, + { + "name": "AppName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrlHash", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.SendPhoneNumberConfirmationTokenDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.SendTwoFactorCodeInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Provider", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.UnLinkUserInput": { + "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 + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 16, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Timezone", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AppName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrlHash", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.UserDelegationDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "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 + }, + { + "name": "StartTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.UserLookupDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "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 + } + ] + }, + "Volo.Abp.Account.VerifyAuthenticatorCodeDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "RecoveryCodes", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.VerifyAuthenticatorCodeInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.VerifyChangeEmailTokenInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "NewEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.VerifyEmailConfirmationTokenInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.VerifyLinkLoginTokenInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.VerifyLinkTokenInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + }, + { + "name": "ResetToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.CreationAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.CreationAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "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 + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.EntityDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.Application.Dtos.EntityDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "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 + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "LastModificationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LastModifierId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + }, + { + "name": "LastModifierId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + } + ] + }, + "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 + }, + { + "name": "DeleterId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DeletionTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensiblePagedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleLimitedResultRequestDto", + "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 + } + ] + }, + "Volo.Abp.Application.Dtos.LimitedResultRequestDto": { + "baseType": null, + "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 + } + ] + }, + "Volo.Abp.Application.Dtos.ListResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "T" + ], + "properties": [ + { + "name": "Items", + "jsonName": null, + "type": "[T]", + "typeSimple": "[T]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + } + ] + }, + "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 + } + ] + }, + "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 + } + ] + }, + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "name": "ExtraProperties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IncludeLocalizationResources", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Values", + "jsonName": null, + "type": "{System.String:System.String}", + "typeSimple": "{string:string}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationGlobalFeatureConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EnabledFeatures", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + }, + { + "name": "Resources", + "jsonName": null, + "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 + }, + { + "name": "Languages", + "jsonName": null, + "type": "[Volo.Abp.Localization.LanguageInfo]", + "typeSimple": "[Volo.Abp.Localization.LanguageInfo]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CurrentCulture", + "jsonName": null, + "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 + }, + { + "name": "DefaultResourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LanguagesMap", + "jsonName": null, + "type": "{System.String:[Volo.Abp.NameValue]}", + "typeSimple": "{string:[Volo.Abp.NameValue]}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LanguageFilesMap", + "jsonName": null, + "type": "{System.String:[Volo.Abp.NameValue]}", + "typeSimple": "{string:[Volo.Abp.NameValue]}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Resources", + "jsonName": null, + "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 + }, + { + "name": "CurrentCulture", + "jsonName": null, + "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 + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "OnlyDynamics", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Texts", + "jsonName": null, + "type": "{System.String:System.String}", + "typeSimple": "{string:string}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BaseResources", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Values", + "jsonName": null, + "type": "{System.String:System.String}", + "typeSimple": "{string:string}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Kind", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnglishName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ThreeLetterIsoLanguageName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TwoLetterIsoLanguageName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRightToLeft", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "NativeName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "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 + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsAuthenticated", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Id", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorUserId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorTenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorUserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorTenantName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SurName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailVerified", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumberVerified", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Roles", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SessionId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CalendarAlgorithmType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DateTimeFormatLong", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDatePattern", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FullDateTimePattern", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DateSeparator", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortTimePattern", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LongTimePattern", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TimeZoneName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "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, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Configuration", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Fields", + "jsonName": null, + "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 + }, + { + "name": "LocalizationResource", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsAvailable", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "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, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "OnCreate", + "jsonName": null, + "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 + }, + { + "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 + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsAvailable", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsAvailable", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Config", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "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 + }, + { + "name": "Api", + "jsonName": null, + "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 + }, + { + "name": "Ui", + "jsonName": null, + "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 + }, + { + "name": "Policy", + "jsonName": null, + "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 + }, + { + "name": "Attributes", + "jsonName": null, + "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 + }, + { + "name": "Configuration", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultValue", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyFeaturePolicyDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Features", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequiresAll", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyGlobalFeaturePolicyDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Features", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequiresAll", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyPermissionPolicyDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "PermissionNames", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequiresAll", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyPolicyDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "GlobalFeatures", + "jsonName": null, + "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 + }, + { + "name": "Features", + "jsonName": null, + "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 + }, + { + "name": "Permissions", + "jsonName": null, + "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 + } + ] + }, + "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 + }, + { + "name": "OnCreateForm", + "jsonName": null, + "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 + }, + { + "name": "OnEditForm", + "jsonName": null, + "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 + }, + { + "name": "Lookup", + "jsonName": null, + "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 + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsVisible", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ResultListPropertyName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayPropertyName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ValuePropertyName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FilterParamName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsVisible", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Resource", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Entities", + "jsonName": null, + "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 + }, + { + "name": "Configuration", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Modules", + "jsonName": null, + "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 + }, + { + "name": "Enums", + "jsonName": null, + "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 + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Iana", + "jsonName": null, + "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 + }, + { + "name": "Windows", + "jsonName": null, + "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 + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TimeZone", + "jsonName": null, + "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 + } + ] + }, + "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 + } + ] + }, + "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 + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsAvailable", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Success", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "NormalizedName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Auditing.EntityChangeType": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Created", + "Updated", + "Deleted" + ], + "enumValues": [ + 0, + 1, + 2 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Abp.AuditLogging.AuditLogActionDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AuditLogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ServiceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MethodName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Parameters", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExecutionTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExecutionDuration", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.AuditLogDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "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 + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorUserId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorUserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorTenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorTenantName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExecutionTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExecutionDuration", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientIpAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BrowserInfo", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HttpMethod", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Exceptions", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Comments", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HttpStatusCode", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ApplicationName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CorrelationId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityChanges", + "jsonName": null, + "type": "[Volo.Abp.AuditLogging.EntityChangeDto]", + "typeSimple": "[Volo.Abp.AuditLogging.EntityChangeDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Actions", + "jsonName": null, + "type": "[Volo.Abp.AuditLogging.AuditLogActionDto]", + "typeSimple": "[Volo.Abp.AuditLogging.AuditLogActionDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.AuditLogGlobalSettingsDto": { + "baseType": "Volo.Abp.AuditLogging.AuditLogSettingsDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsPeriodicDeleterEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.AuditLogSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsExpiredDeleterEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExpiredDeleterPeriod", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.EntityChangeDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AuditLogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ChangeTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ChangeType", + "jsonName": null, + "type": "Volo.Abp.Auditing.EntityChangeType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityTypeFullName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PropertyChanges", + "jsonName": null, + "type": "[Volo.Abp.AuditLogging.EntityPropertyChangeDto]", + "typeSimple": "[Volo.Abp.AuditLogging.EntityPropertyChangeDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.EntityChangeFilter": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityTypeFullName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.EntityChangeWithUsernameDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityChange", + "jsonName": null, + "type": "Volo.Abp.AuditLogging.EntityChangeDto", + "typeSimple": "Volo.Abp.AuditLogging.EntityChangeDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.EntityPropertyChangeDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityChangeId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "NewValue", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "OriginalValue", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PropertyName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PropertyTypeFullName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.ExportAuditLogsInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StartTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 512, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ApplicationName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientIpAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CorrelationId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HttpMethod", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 16, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HttpStatusCode", + "jsonName": null, + "type": "System.Net.HttpStatusCode?", + "typeSimple": "enum?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxExecutionDuration", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MinExecutionDuration", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HasException", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.ExportAuditLogsOutput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Message", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FileData", + "jsonName": null, + "type": "[System.Byte]", + "typeSimple": "[number]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FileName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsBackgroundJob", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.ExportEntityChangesInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityChangeType", + "jsonName": null, + "type": "Volo.Abp.Auditing.EntityChangeType?", + "typeSimple": "enum?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityTypeFullName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.ExportEntityChangesOutput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Message", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FileData", + "jsonName": null, + "type": "[System.Byte]", + "typeSimple": "[number]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FileName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsBackgroundJob", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.GetAuditLogListDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StartTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 512, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ApplicationName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientIpAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CorrelationId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HttpMethod", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 16, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HttpStatusCode", + "jsonName": null, + "type": "System.Net.HttpStatusCode?", + "typeSimple": "enum?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxExecutionDuration", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MinExecutionDuration", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HasException", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayOutput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Data", + "jsonName": null, + "type": "{System.String:System.Double}", + "typeSimple": "{string:number}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.GetEntityChangesDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AuditLogId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityChangeType", + "jsonName": null, + "type": "Volo.Abp.Auditing.EntityChangeType?", + "typeSimple": "enum?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityTypeFullName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.GetErrorRateFilter": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AuditLogging.GetErrorRateOutput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Data", + "jsonName": null, + "type": "{System.String:System.Int64}", + "typeSimple": "{string:number}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Content.IRemoteStreamContent": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "FileName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ContentType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ContentLength", + "jsonName": null, + "type": "System.Int64?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Content.RemoteStreamContent": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "FileName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ContentType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ContentLength", + "jsonName": null, + "type": "System.Int64?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.FeatureManagement.FeatureDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Provider", + "jsonName": null, + "type": "Volo.Abp.FeatureManagement.FeatureProviderDto", + "typeSimple": "Volo.Abp.FeatureManagement.FeatureProviderDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ValueType", + "jsonName": null, + "type": "Volo.Abp.Validation.StringValues.IStringValueType", + "typeSimple": "Volo.Abp.Validation.StringValues.IStringValueType", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Depth", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ParentName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "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 + } + ] + }, + "Volo.Abp.FeatureManagement.FeatureProviderDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Key", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.FeatureManagement.GetFeatureListResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Groups", + "jsonName": null, + "type": "[Volo.Abp.FeatureManagement.FeatureGroupDto]", + "typeSimple": "[Volo.Abp.FeatureManagement.FeatureGroupDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.FeatureManagement.UpdateFeatureDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Gdpr.DownloadTokenResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Gdpr.GdprRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReadyTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Gdpr.GdprRequestInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ActionApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UniqueName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HttpMethod", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SupportedVersions", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "name": "AllowAnonymous", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImplementFrom", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Modules", + "jsonName": null, + "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 + }, + { + "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 + } + ] + }, + "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IncludeTypes", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ControllerApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ControllerName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ControllerGroupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRemoteService", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsIntegrationService", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ApiVersion", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Interfaces", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Actions", + "jsonName": null, + "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 + } + ] + }, + "Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "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 + } + ] + }, + "Volo.Abp.Http.Modeling.InterfaceMethodApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "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 + }, + { + "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 + } + ] + }, + "Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeAsString", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsOptional", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultValue", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ModuleApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "RootPath", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RemoteServiceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Controllers", + "jsonName": null, + "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 + } + ] + }, + "Volo.Abp.Http.Modeling.ParameterApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "NameOnMethod", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "JsonName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsOptional", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultValue", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConstraintTypes", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BindingSourceId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DescriptorName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.PropertyApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "JsonName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRequired", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MinLength", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxLength", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Minimum", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Maximum", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Regex", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.TypeApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "BaseType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEnum", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnumNames", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnumValues", + "jsonName": null, + "type": "[System.Object]", + "typeSimple": "[object]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "GenericArguments", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "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 + } + ] + }, + "Volo.Abp.Identity.ClaimTypeDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Required", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsStatic", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Regex", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RegexDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ValueType", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentityClaimValueType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ValueTypeAsString", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.CreateClaimTypeDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Required", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Regex", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RegexDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ValueType", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentityClaimValueType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.DownloadTokenResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.ExternalLoginProviderDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CanObtainUserInfoWithoutPassword", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.Features.IdentityProTwoFactorBehaviour": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Optional", + "Disabled", + "Forced" + ], + "enumValues": [ + 0, + 1, + 2 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Abp.Identity.GetAvailableRolesInput": { + "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, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetAvailableUsersInput": { + "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, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetIdentityClaimTypesInput": { + "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, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetIdentityRoleListInput": { + "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, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetIdentitySecurityLogListInput": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StartTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ApplicationName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Identity", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Action", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CorrelationId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientIpAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetIdentitySessionListInput": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto", + "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 + }, + { + "name": "Device", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetIdentityUserListAsFileInput": { + "baseType": "Volo.Abp.Identity.GetIdentityUsersInput", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetIdentityUsersInput": { + "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, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RoleId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "OrganizationUnitId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Id", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsLockedOut", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "NotActive", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsExternal", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxCreationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MinCreationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxModifitionTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MinModifitionTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetImportInvalidUsersFileInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetImportUsersSampleFileInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "FileType", + "jsonName": null, + "type": "Volo.Abp.Identity.ImportUsersFromFileType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "2", + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetMembersInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetOrganizationUnitInput": { + "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, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityClaimValueType": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "String", + "Int", + "Boolean", + "DateTime" + ], + "enumValues": [ + 0, + 1, + 2, + 3 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Abp.Identity.IdentityLdapSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EnableLdapLogin", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Ldaps", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LdapServerHost", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LdapServerPort", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LdapBaseDc", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LdapDomain", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LdapUserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LdapPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityLockoutSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AllowedForNewUsers", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LockoutDuration", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxFailedAccessAttempts", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityOAuthSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EnableOAuthLogin", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientSecret", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Authority", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Scope", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequireHttpsMetadata", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ValidateEndpoints", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ValidateIssuerName", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityPasswordSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "RequiredLength", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "2", + "maximum": "128", + "regex": null + }, + { + "name": "RequiredUniqueChars", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "128", + "regex": null + }, + { + "name": "RequireNonAlphanumeric", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequireLowercase", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequireUppercase", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequireDigit", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ForceUsersToPeriodicallyChangePassword", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PasswordChangePeriodDays", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnablePreventPasswordReuse", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PreventPasswordReuseCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "128", + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityRoleClaimDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "RoleId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClaimType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClaimValue", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsDefault", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsPublic", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityRoleDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsDefault", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsStatic", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsPublic", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserCount", + "jsonName": null, + "type": "System.Int64", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityRoleLookupDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityRoleUpdateDto": { + "baseType": "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentitySecurityLogDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ApplicationName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Identity", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Action", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CorrelationId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientIpAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BrowserInfo", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExtraProperties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentitySessionDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SessionId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsCurrent", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Device", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DeviceInfo", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IpAddresses", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SignedIn", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LastAccessed", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentitySessionSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "PreventConcurrentLogin", + "jsonName": null, + "type": "Volo.Abp.Identity.Settings.IdentityProPreventConcurrentLoginBehaviour", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentitySettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Password", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentityPasswordSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityPasswordSettingsDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Lockout", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentityLockoutSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityLockoutSettingsDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SignIn", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentitySignInSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentitySignInSettingsDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "User", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentityUserSettingsDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserSettingsDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentitySignInSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "RequireConfirmedEmail", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequireEmailVerificationToRegister", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnablePhoneNumberConfirmation", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequireConfirmedPhoneNumber", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserClaimDto": { + "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 + }, + { + "name": "ClaimType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClaimValue", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserCreateDto": { + "baseType": "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SendConfirmationEmail", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumberConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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 + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 16, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShouldChangePasswordOnNextLogin", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LockoutEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RoleNames", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "OrganizationUnitIds", + "jsonName": null, + "type": "[System.Guid]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "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, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumberConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SupportTwoFactor", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TwoFactorEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LockoutEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsLockedOut", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LockoutEnd", + "jsonName": null, + "type": "System.DateTimeOffset?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShouldChangePasswordOnNextLogin", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RoleNames", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AccessFailedCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LastPasswordChangeTime", + "jsonName": null, + "type": "System.DateTimeOffset?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsExternal", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsUserNameUpdateEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEmailUpdateEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserUpdateDto": { + "baseType": "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumberConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserUpdatePasswordInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "NewPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserUpdateRolesDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "RoleNames", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.ImportExternalUserInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Provider", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserNameOrEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.ImportUsersFromFileInputWithStream": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "File", + "jsonName": null, + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FileType", + "jsonName": null, + "type": "Volo.Abp.Identity.ImportUsersFromFileType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "2", + "regex": null + } + ] + }, + "Volo.Abp.Identity.ImportUsersFromFileOutput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AllCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SucceededCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FailedCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "InvalidUsersDownloadToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsAllSucceeded", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.ImportUsersFromFileType": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Excel", + "Csv" + ], + "enumValues": [ + 1, + 2 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Abp.Identity.OrganizationUnitCreateDto": { + "baseType": "Volo.Abp.Identity.OrganizationUnitCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ParentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.OrganizationUnitCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.OrganizationUnitDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ParentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Roles", + "jsonName": null, + "type": "[Volo.Abp.Identity.OrganizationUnitRoleDto]", + "typeSimple": "[Volo.Abp.Identity.OrganizationUnitRoleDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.OrganizationUnitLookupDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.OrganizationUnitMoveInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "NewParentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.OrganizationUnitRoleDto": { + "baseType": "Volo.Abp.Application.Dtos.CreationAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "OrganizationUnitId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RoleId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.OrganizationUnitRoleInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "RoleIds", + "jsonName": null, + "type": "[System.Guid]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.OrganizationUnitUpdateDto": { + "baseType": "Volo.Abp.Identity.OrganizationUnitCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.OrganizationUnitUserInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserIds", + "jsonName": null, + "type": "[System.Guid]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.OrganizationUnitWithDetailsDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ParentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Roles", + "jsonName": null, + "type": "[Volo.Abp.Identity.IdentityRoleDto]", + "typeSimple": "[Volo.Abp.Identity.IdentityRoleDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserCount", + "jsonName": null, + "type": "System.Int64", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.Settings.IdentityProPreventConcurrentLoginBehaviour": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Disabled", + "LogoutFromSameTypeDevices", + "LogoutFromAllDevices" + ], + "enumValues": [ + 0, + 1, + 2 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Abp.Identity.UpdateClaimTypeDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Required", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Regex", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RegexDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ValueType", + "jsonName": null, + "type": "Volo.Abp.Identity.IdentityClaimValueType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.UserLookupCountInputDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.UserLookupSearchInputDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UiCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.LanguageManagement.Dto.CultureInfoDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ResourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BaseCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TargetCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "GetOnlyEmptyValues", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.LanguageManagement.Dto.LanguageDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UiCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsDefaultLanguage", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.LanguageManagement.Dto.LanguageResourceDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.LanguageManagement.Dto.LanguageTextDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ResourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BaseCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BaseValue", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Localization.LanguageInfo": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UiCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TwoLetterISOLanguageName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": 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": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "T", + "typeSimple": "T", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.ObjectExtending.ExtensibleObject": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ExtraProperties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ApplicationType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientSecret", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConsentType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExtensionGrantTypes", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PostLogoutRedirectUris", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RedirectUris", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FrontChannelLogoutUri", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowPasswordFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowClientCredentialsFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowAuthorizationCodeFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowRefreshTokenFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowHybridFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowImplicitFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowTokenExchangeFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowEndSessionEndpoint", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowDeviceAuthorizationEndpoint", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ForcePkce", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowPushedAuthorizationEndpoint", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ForcePushedAuthorization", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Scopes", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientUri", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LogoUri", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ApplicationType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientSecret", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConsentType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExtensionGrantTypes", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PostLogoutRedirectUris", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RedirectUris", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FrontChannelLogoutUri", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowPasswordFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowClientCredentialsFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowAuthorizationCodeFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowRefreshTokenFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowHybridFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowImplicitFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowTokenExchangeFlow", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowEndSessionEndpoint", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowDeviceAuthorizationEndpoint", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ForcePkce", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowPushedAuthorizationEndpoint", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ForcePushedAuthorization", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Scopes", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ClientUri", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LogoUri", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationTokenLifetimeDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AccessTokenLifetime", + "jsonName": null, + "type": "System.Double?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AuthorizationCodeLifetime", + "jsonName": null, + "type": "System.Double?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DeviceCodeLifetime", + "jsonName": null, + "type": "System.Double?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IdentityTokenLifetime", + "jsonName": null, + "type": "System.Double?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RefreshTokenLifetime", + "jsonName": null, + "type": "System.Double?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserCodeLifetime", + "jsonName": null, + "type": "System.Double?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequestTokenLifetime", + "jsonName": null, + "type": "System.Double?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IssuedTokenLifetime", + "jsonName": null, + "type": "System.Double?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.OpenIddict.Applications.Dtos.CreateApplicationInput": { + "baseType": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.OpenIddict.Applications.Dtos.GetApplicationListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.OpenIddict.Applications.Dtos.UpdateApplicationInput": { + "baseType": "Volo.Abp.OpenIddict.Applications.Dtos.ApplicationCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.OpenIddict.Scopes.Dtos.CreateScopeInput": { + "baseType": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.OpenIddict.Scopes.Dtos.GetScopeListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": "\\w+" + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Resources", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BuildIn", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Resources", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.OpenIddict.Scopes.Dtos.UpdateScopeInput": { + "baseType": "Volo.Abp.OpenIddict.Scopes.Dtos.ScopeCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.PermissionManagement.GetPermissionListResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityDisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Groups", + "jsonName": null, + "type": "[Volo.Abp.PermissionManagement.PermissionGroupDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGroupDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.PermissionManagement.PermissionGrantInfoDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ParentName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsGranted", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowedProviders", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "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 + } + ] + }, + "Volo.Abp.PermissionManagement.PermissionGroupDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayNameKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayNameResource", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "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 + } + ] + }, + "Volo.Abp.PermissionManagement.ProviderInfoDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ProviderName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ProviderKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.PermissionManagement.UpdatePermissionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsGranted", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.PermissionManagement.UpdatePermissionsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "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 + } + ] + }, + "Volo.Abp.SettingManagement.EmailSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SmtpHost", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpPort", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpUserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpDomain", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpEnableSsl", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpUseDefaultCredentials", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultFromAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultFromDisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.SettingManagement.SendTestEmailInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SenderEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TargetEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Subject", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Body", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.SettingManagement.UpdateEmailSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SmtpHost", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpPort", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "65535", + "regex": null + }, + { + "name": "SmtpUserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpDomain", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpEnableSsl", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SmtpUseDefaultCredentials", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultFromAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultFromDisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TemplateName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 10, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "FilterText", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TemplateName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 10, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsLayout", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Layout", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsInlineLocalized", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TemplateName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 10, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Users.UserData": { + "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 + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumberConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExtraProperties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Validation.StringValues.IStringValueType": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Item", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Properties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Validator", + "jsonName": null, + "type": "Volo.Abp.Validation.StringValues.IValueValidator", + "typeSimple": "Volo.Abp.Validation.StringValues.IValueValidator", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Validation.StringValues.IValueValidator": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Item", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Properties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BlogPostCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogFeatureInputDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "FeatureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogGetListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogPostDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "BlogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CoverImageMediaId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LastModificationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Blogs.BlogPostStatus", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogPostGetListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BlogId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AuthorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TagId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Blogs.BlogPostStatus?", + "typeSimple": "enum?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogPostListDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "BlogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BlogName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CoverImageMediaId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LastModificationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Blogs.BlogPostStatus?", + "typeSimple": "enum?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.CreateBlogDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "BlogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 2, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CoverImageMediaId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.UpdateBlogDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 2, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CoverImageMediaId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Comments.CmsUserDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "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 + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Comments.CommentApprovalDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsApproved", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Comments.CommentGetListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RepliedCommentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Author", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationStartDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationEndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CommentApproveState", + "jsonName": null, + "type": "Volo.CmsKit.Comments.CommentApproveState", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Comments.CommentSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CommentRequireApprovement", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Comments.CommentWithAuthorDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "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 + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RepliedCommentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Author", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Comments.CmsUserDto", + "typeSimple": "Volo.CmsKit.Admin.Comments.CmsUserDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsApproved", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Contact.CmsKitContactSettingDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ReceiverEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Contact.UpdateCmsKitContactSettingDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ReceiverEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Faqs.CreateFaqQuestionDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SectionId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 16384, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Faqs.CreateFaqSectionDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "GroupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Faqs.FaqGroupInfoDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Faqs.FaqQuestionDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SectionId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Faqs.FaqQuestionListFilterDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SectionId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Faqs.FaqSectionDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "GroupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Faqs.FaqSectionListFilterDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "GroupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Faqs.FaqSectionWithQuestionCountDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "GroupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "QuestionCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Faqs.UpdateFaqQuestionDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 16384, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Faqs.UpdateFaqSectionDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "GroupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StyleContent", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ScriptContent", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesUpdateDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Style", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Script", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.MediaDescriptors.CreateMediaInputWithStream": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 255, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "File", + "jsonName": null, + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.MediaDescriptors.MediaDescriptorDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MimeType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Size", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.MenuItemCreateInput": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ParentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Icon", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Target", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ElementId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CssClass", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PageId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequiredPermissionName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.MenuItemMoveInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "NewParentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Position", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.MenuItemUpdateInput": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Icon", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Target", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ElementId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CssClass", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PageId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequiredPermissionName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.MenuItemWithDetailsDto": { + "baseType": "Volo.CmsKit.Menus.MenuItemDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "PageTitle", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.PageLookupDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.PageLookupInputDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Pages.PageStatus?", + "typeSimple": "enum?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.PermissionLookupDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.PermissionLookupInputDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.DownloadTokenResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.GetImportInvalidNewslettersFileInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.GetImportNewslettersSampleFileInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsCsvRequestInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Token", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.GetNewsletterRecordsRequestInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileInputWithStream": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "File", + "jsonName": null, + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.ImportNewslettersFromFileOutput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AllCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SucceededCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FailedCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "InvalidNewslettersDownloadToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsAllSucceeded", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.NewsletterPreferenceDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SourceUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.NewsletterRecordCsvDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SecurityCode", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.NewsletterRecordDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Preferences", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.NewsletterRecordWithDetailsDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Preferences", + "jsonName": null, + "type": "[Volo.CmsKit.Admin.Newsletters.NewsletterPreferenceDto]", + "typeSimple": "[Volo.CmsKit.Admin.Newsletters.NewsletterPreferenceDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Newsletters.UpdatePreferenceInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PreferenceDetails", + "jsonName": null, + "type": "[Volo.CmsKit.Public.Newsletters.PreferenceDetailsDto]", + "typeSimple": "[Volo.CmsKit.Public.Newsletters.PreferenceDetailsDto]", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SourceUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.PageFeedbacks.CmsKitPageFeedbackSettingDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsAutoHandled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequireCommentsForNegativeFeedback", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListAsFileInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsHandled", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsUseful", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HasUserNote", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HasAdminNote", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.PageFeedbacks.GetPageFeedbackListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsHandled", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsUseful", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HasUserNote", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HasAdminNote", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsUseful", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserNote", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsHandled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AdminNote", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.PageFeedbacks.PageFeedbackSettingDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailAddresses", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.PageFeedbacks.UpdateCmsKitPageFeedbackSettingDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsAutoHandled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequireCommentsForNegativeFeedback", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsHandled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AdminNote", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingDto": { + "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 + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailAddresses", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingsInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Settings", + "jsonName": null, + "type": "[Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingDto]", + "typeSimple": "[Volo.CmsKit.Admin.PageFeedbacks.UpdatePageFeedbackSettingDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Pages.CreatePageInputDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LayoutName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Script", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Style", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Pages.PageStatus", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Pages.GetPagesInputDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Pages.PageStatus?", + "typeSimple": "enum?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Pages.PageDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LayoutName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Script", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Style", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsHomePage", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Pages.PageStatus", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Pages.UpdatePageInputDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LayoutName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Script", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Style", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Pages.PageStatus", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Polls.CreatePollDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Question", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 8, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Widget", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowMultipleVote", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowVoteCount", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowResultWithoutGivingVote", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowHoursLeft", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ResultShowingEndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PollOptions", + "jsonName": null, + "type": "[Volo.CmsKit.Admin.Polls.PollOptionDto]", + "typeSimple": "[Volo.CmsKit.Admin.Polls.PollOptionDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Polls.GetPollListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Polls.GetResultDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Question", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PollVoteCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PollResultDetails", + "jsonName": null, + "type": "[Volo.CmsKit.Admin.Polls.PollResultDto]", + "typeSimple": "[Volo.CmsKit.Admin.Polls.PollResultDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Polls.PollDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Question", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Widget", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowMultipleVote", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "VoteCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Polls.PollOptionDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "VoteCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Polls.PollResultDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "VoteCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Polls.PollWidgetDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Polls.PollWithDetailsDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Question", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Widget", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowMultipleVote", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "VoteCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowVoteCount", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowResultWithoutGivingVote", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowHoursLeft", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ResultShowingEndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PollOptions", + "jsonName": null, + "type": "[Volo.CmsKit.Admin.Polls.PollOptionDto]", + "typeSimple": "[Volo.CmsKit.Admin.Polls.PollOptionDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Polls.UpdatePollDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Question", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 8, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Widget", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowVoteCount", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowResultWithoutGivingVote", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowHoursLeft", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ResultShowingEndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PollOptions", + "jsonName": null, + "type": "[Volo.CmsKit.Admin.Polls.PollOptionDto]", + "typeSimple": "[Volo.CmsKit.Admin.Polls.PollOptionDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.EntityTagCreateDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TagName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.EntityTagRemoveDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TagId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.EntityTagSetDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Tags", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.TagCreateDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 32, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.TagDefinitionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.TagGetListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.TagUpdateDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 32, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.UrlShorting.CreateShortenedUrlDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 512, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Target", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 2048, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRegex", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.UrlShorting.GetShortenedUrlListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ShortenedUrlFilter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.UrlShorting.ShortenedUrlDto": { + "baseType": "Volo.Abp.Application.Dtos.CreationAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Target", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRegex", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.UrlShorting.UpdateShortenedUrlDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Target", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 2048, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Blogs.BlogFeatureDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "FeatureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Blogs.BlogPostStatus": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Draft", + "Published", + "WaitingForReview" + ], + "enumValues": [ + 0, + 1, + 2 + ], + "genericArguments": null, + "properties": null + }, + "Volo.CmsKit.Comments.CommentApproveState": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "All", + "Approved", + "Disapproved", + "Waiting" + ], + "enumValues": [ + 0, + 1, + 2, + 4 + ], + "genericArguments": null, + "properties": null + }, + "Volo.CmsKit.Contents.BlogPostCommonDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "BlogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CoverImageMediaId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Author", + "jsonName": null, + "type": "Volo.CmsKit.Users.CmsUserDto", + "typeSimple": "Volo.CmsKit.Users.CmsUserDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Contents.PageDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LayoutName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Script", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Style", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Pages.PageStatus", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Menus.MenuItemDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ParentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Icon", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Target", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ElementId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CssClass", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PageId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RequiredPermissionName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Pages.PageStatus": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Draft", + "Publish" + ], + "enumValues": [ + 0, + 1 + ], + "genericArguments": null, + "properties": null + }, + "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Blogs.BlogPostGetListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AuthorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TagId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FilterOnFavorites", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Comments.CmsUserDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "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 + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Comments.CommentDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "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 + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RepliedCommentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Author", + "jsonName": null, + "type": "Volo.CmsKit.Public.Comments.CmsUserDto", + "typeSimple": "Volo.CmsKit.Public.Comments.CmsUserDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Comments.CommentWithDetailsDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "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 + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Replies", + "jsonName": null, + "type": "[Volo.CmsKit.Public.Comments.CommentDto]", + "typeSimple": "[Volo.CmsKit.Public.Comments.CommentDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Author", + "jsonName": null, + "type": "Volo.CmsKit.Public.Comments.CmsUserDto", + "typeSimple": "Volo.CmsKit.Public.Comments.CmsUserDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Comments.CreateCommentInput": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 512, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RepliedCommentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CaptchaToken", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CaptchaAnswer", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IdempotencyToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Comments.UpdateCommentInput": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 512, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CaptchaToken", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CaptchaAnswer", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Contact.ContactCreateInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ContactName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Subject", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Message", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RecaptchaToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Faqs.FaqQuestionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Faqs.FaqSectionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "GroupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Faqs.FaqSectionListFilterInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "GroupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SectionName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Faqs.FaqSectionWithQuestionsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Section", + "jsonName": null, + "type": "Volo.CmsKit.Public.Faqs.FaqSectionDto", + "typeSimple": "Volo.CmsKit.Public.Faqs.FaqSectionDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Questions", + "jsonName": null, + "type": "[Volo.CmsKit.Public.Faqs.FaqQuestionDto]", + "typeSimple": "[Volo.CmsKit.Public.Faqs.FaqQuestionDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.MarkedItems.MarkedItemDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IconName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.MarkedItems.MarkedItemWithToggleDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "MarkedItem", + "jsonName": null, + "type": "Volo.CmsKit.Public.MarkedItems.MarkedItemDto", + "typeSimple": "Volo.CmsKit.Public.MarkedItems.MarkedItemDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsMarkedByCurrentUser", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Newsletters.CreateNewsletterRecordInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SourceUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PrivacyPolicyUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AdditionalPreferences", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Newsletters.NewsletterEmailOptionsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "PrivacyPolicyConfirmation", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "WidgetViewPath", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AdditionalPreferences", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayAdditionalPreferences", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Newsletters.NewsletterPreferenceDetailsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayPreference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Definition", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsSelectedByEmailAddress", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Newsletters.PreferenceDetailsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Preference", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Newsletters.UpdatePreferenceRequestInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PreferenceDetails", + "jsonName": null, + "type": "[Volo.CmsKit.Public.Newsletters.PreferenceDetailsDto]", + "typeSimple": "[Volo.CmsKit.Public.Newsletters.PreferenceDetailsDto]", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SourceUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SecurityCode", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.PageFeedbacks.ChangeIsUsefulInput": { + "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 + }, + { + "name": "IsUseful", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.PageFeedbacks.CreatePageFeedbackInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsUseful", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserNote", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FeedbackUserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.PageFeedbacks.InitializeUserNoteInput": { + "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 + }, + { + "name": "UserNote", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsUseful", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.PageFeedbacks.PageFeedbackDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsUseful", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserNote", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Polls.GetResultDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Question", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PollVoteCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PollResultDetails", + "jsonName": null, + "type": "[Volo.CmsKit.Public.Polls.PollResultDto]", + "typeSimple": "[Volo.CmsKit.Public.Polls.PollResultDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Polls.PollOptionDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Polls.PollResultDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsSelectedForCurrentUser", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "VoteCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Polls.PollWithDetailsDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "PollOptions", + "jsonName": null, + "type": "[Volo.CmsKit.Public.Polls.PollOptionDto]", + "typeSimple": "[Volo.CmsKit.Public.Polls.PollOptionDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Question", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "StartDate", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowMultipleVote", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "VoteCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowVoteCount", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowResultWithoutGivingVote", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShowHoursLeft", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ResultShowingEndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Polls.SubmitPollInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "PollOptionIds", + "jsonName": null, + "type": "[System.Guid]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Ratings.CreateUpdateRatingInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StarCount", + "jsonName": null, + "type": "System.Int16", + "typeSimple": "number", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "5", + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Ratings.RatingDto": { + "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 + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "StarCount", + "jsonName": null, + "type": "System.Int16", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Ratings.RatingWithStarCountDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StarCount", + "jsonName": null, + "type": "System.Int16", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Count", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsSelectedByCurrentUser", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Reactions.ReactionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Reactions.ReactionWithSelectionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Reaction", + "jsonName": null, + "type": "Volo.CmsKit.Public.Reactions.ReactionDto", + "typeSimple": "Volo.CmsKit.Public.Reactions.ReactionDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Count", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsSelectedByCurrentUser", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.UrlShorting.ShortenedUrlDto": { + "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 + }, + { + "name": "Source", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Target", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRegex", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Tags.PopularTagDto": { + "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 + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Count", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Tags.TagDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Users.CmsUserDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Payment.Plans.PlanDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Payment.Requests.PaymentRequestProductDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "PaymentRequestId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Code", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UnitPrice", + "jsonName": null, + "type": "System.Single", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Count", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TotalPrice", + "jsonName": null, + "type": "System.Single", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PaymentType", + "jsonName": null, + "type": "Volo.Payment.Requests.PaymentType", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PlanId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExtraProperties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Payment.Requests.PaymentRequestState": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Waiting", + "Completed", + "Failed", + "Refunded" + ], + "enumValues": [ + 0, + 1, + 2, + 3 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Payment.Requests.PaymentRequestWithDetailsDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Products", + "jsonName": null, + "type": "[Volo.Payment.Requests.PaymentRequestProductDto]", + "typeSimple": "[Volo.Payment.Requests.PaymentRequestProductDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Currency", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "State", + "jsonName": null, + "type": "Volo.Payment.Requests.PaymentRequestState", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FailReason", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailSendDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Gateway", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExternalSubscriptionId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TotalPrice", + "jsonName": null, + "type": "System.Single", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Payment.Requests.PaymentType": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "OneTime", + "Subscription" + ], + "enumValues": [ + 0, + 1 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Saas.Host.Dtos.EditionCreateDto": { + "baseType": "Volo.Saas.Host.Dtos.EditionCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Saas.Host.Dtos.EditionCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PlanId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.EditionDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PlanId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PlanName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantCount", + "jsonName": null, + "type": "System.Int64", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.EditionLookupDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.EditionUpdateDto": { + "baseType": "Volo.Saas.Host.Dtos.EditionCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.GetEditionsInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.GetTenantsInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "GetEditionNames", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EditionId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExpirationDateMin", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExpirationDateMax", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ActivationState", + "jsonName": null, + "type": "Volo.Saas.TenantActivationState?", + "typeSimple": "enum?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ActivationEndDateMin", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ActivationEndDateMax", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.SaasHostSettingDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EnableTenantBasedConnectionStringManagement", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Default", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Databases", + "jsonName": null, + "type": "[Volo.Saas.Host.Dtos.SaasTenantDatabaseConnectionStringsDto]", + "typeSimple": "[Volo.Saas.Host.Dtos.SaasTenantDatabaseConnectionStringsDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.SaasTenantCreateDto": { + "baseType": "Volo.Saas.Host.Dtos.SaasTenantCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AdminEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AdminPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConnectionStrings", + "jsonName": null, + "type": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto", + "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantConnectionStringsDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.SaasTenantCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EditionId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ActivationState", + "jsonName": null, + "type": "Volo.Saas.TenantActivationState", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ActivationEndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EditionEndDateUtc", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.SaasTenantDatabaseConnectionStringsDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DatabaseName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConnectionString", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.SaasTenantDatabasesDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Databases", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.SaasTenantDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EditionId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EditionEndDateUtc", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EditionName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HasDefaultConnectionString", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ActivationState", + "jsonName": null, + "type": "Volo.Saas.TenantActivationState", + "typeSimple": "enum", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ActivationEndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.SaasTenantSetPasswordDto": { + "baseType": null, + "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 + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.Dtos.SaasTenantUpdateDto": { + "baseType": "Volo.Saas.Host.Dtos.SaasTenantCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.Host.GetEditionUsageStatisticsResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Data", + "jsonName": null, + "type": "{System.String:System.Int32}", + "typeSimple": "{string:number}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Saas.TenantActivationState": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Active", + "ActiveWithLimitedTime", + "Passive" + ], + "enumValues": [ + 0, + 1, + 2 + ], + "genericArguments": null, + "properties": null + } + } +} \ No newline at end of file diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/index.ts new file mode 100644 index 0000000000..bf31674ba0 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/index.ts @@ -0,0 +1 @@ +export * from './volo'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/abp/content/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/abp/content/index.ts new file mode 100644 index 0000000000..e9644dae47 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/abp/content/index.ts @@ -0,0 +1 @@ +export * from './models'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/abp/content/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/abp/content/models.ts new file mode 100644 index 0000000000..2f16c16849 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/abp/content/models.ts @@ -0,0 +1,6 @@ + +export interface IRemoteStreamContent { + fileName?: string; + contentType?: string; + contentLength?: number; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/abp/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/abp/index.ts new file mode 100644 index 0000000000..d86d4d35eb --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/abp/index.ts @@ -0,0 +1,2 @@ +import * as Content from './content'; +export { Content }; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/blog-admin.service.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/blog-admin.service.ts new file mode 100644 index 0000000000..431353029a --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/blog-admin.service.ts @@ -0,0 +1,84 @@ +import type { BlogDto, BlogGetListInput, CreateBlogDto, UpdateBlogDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; +import type { ListResultDto, PagedResultDto } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class BlogAdminService { + private restService = inject(RestService); + apiName = 'CmsKitAdmin'; + + create = (input: CreateBlogDto, config?: Partial) => + this.restService.request( + { + method: 'POST', + url: '/api/cms-kit-admin/blogs', + body: input, + }, + { apiName: this.apiName, ...config }, + ); + + delete = (id: string, config?: Partial) => + this.restService.request( + { + method: 'DELETE', + url: `/api/cms-kit-admin/blogs/${id}`, + }, + { apiName: this.apiName, ...config }, + ); + + get = (id: string, config?: Partial) => + this.restService.request( + { + method: 'GET', + url: `/api/cms-kit-admin/blogs/${id}`, + }, + { apiName: this.apiName, ...config }, + ); + + getAllList = (config?: Partial) => + this.restService.request>( + { + method: 'GET', + url: '/api/cms-kit-admin/blogs/all', + }, + { apiName: this.apiName, ...config }, + ); + + getList = (input: BlogGetListInput, config?: Partial) => + this.restService.request>( + { + method: 'GET', + url: '/api/cms-kit-admin/blogs', + params: { + filter: input.filter, + sorting: input.sorting, + skipCount: input.skipCount, + maxResultCount: input.maxResultCount, + }, + }, + { apiName: this.apiName, ...config }, + ); + + moveAllBlogPosts = (blogId: string, assignToBlogId: string, config?: Partial) => + this.restService.request( + { + method: 'PUT', + url: `/api/cms-kit-admin/blogs/${blogId}/move-all-blog-posts`, + params: { blogId, assignToBlogId }, + }, + { apiName: this.apiName, ...config }, + ); + + update = (id: string, input: UpdateBlogDto, config?: Partial) => + this.restService.request( + { + method: 'PUT', + url: `/api/cms-kit-admin/blogs/${id}`, + body: input, + }, + { apiName: this.apiName, ...config }, + ); +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/blog-feature-admin.service.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/blog-feature-admin.service.ts new file mode 100644 index 0000000000..d58bdef055 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/blog-feature-admin.service.ts @@ -0,0 +1,29 @@ +import type { BlogFeatureInputDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; +import type { BlogFeatureDto } from '../../blogs/models'; + +@Injectable({ + providedIn: 'root', +}) +export class BlogFeatureAdminService { + private restService = inject(RestService); + apiName = 'CmsKitAdmin'; + + + getList = (blogId: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: `/api/cms-kit-admin/blogs/${blogId}/features`, + }, + { apiName: this.apiName,...config }); + + + set = (blogId: string, dto: BlogFeatureInputDto, config?: Partial) => + this.restService.request({ + method: 'PUT', + url: `/api/cms-kit-admin/blogs/${blogId}/features`, + body: dto, + }, + { apiName: this.apiName,...config }); +} \ No newline at end of file diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/blog-post-admin.service.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/blog-post-admin.service.ts new file mode 100644 index 0000000000..5afd1bd473 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/blog-post-admin.service.ts @@ -0,0 +1,105 @@ +import type { BlogPostDto, BlogPostGetListInput, BlogPostListDto, CreateBlogPostDto, UpdateBlogPostDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; +import type { PagedResultDto } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class BlogPostAdminService { + private restService = inject(RestService); + apiName = 'CmsKitAdmin'; + + + create = (input: CreateBlogPostDto, config?: Partial) => + this.restService.request({ + method: 'POST', + url: '/api/cms-kit-admin/blogs/blog-posts', + body: input, + }, + { apiName: this.apiName,...config }); + + + createAndPublish = (input: CreateBlogPostDto, config?: Partial) => + this.restService.request({ + method: 'POST', + url: '/api/cms-kit-admin/blogs/blog-posts/create-and-publish', + body: input, + }, + { apiName: this.apiName,...config }); + + + createAndSendToReview = (input: CreateBlogPostDto, config?: Partial) => + this.restService.request({ + method: 'POST', + url: '/api/cms-kit-admin/blogs/blog-posts/create-and-send-to-review', + body: input, + }, + { apiName: this.apiName,...config }); + + + delete = (id: string, config?: Partial) => + this.restService.request({ + method: 'DELETE', + url: `/api/cms-kit-admin/blogs/blog-posts/${id}`, + }, + { apiName: this.apiName,...config }); + + + draft = (id: string, config?: Partial) => + this.restService.request({ + method: 'POST', + url: `/api/cms-kit-admin/blogs/blog-posts/${id}/draft`, + }, + { apiName: this.apiName,...config }); + + + get = (id: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: `/api/cms-kit-admin/blogs/blog-posts/${id}`, + }, + { apiName: this.apiName,...config }); + + + getList = (input: BlogPostGetListInput, config?: Partial) => + this.restService.request>({ + method: 'GET', + url: '/api/cms-kit-admin/blogs/blog-posts', + params: { filter: input.filter, blogId: input.blogId, authorId: input.authorId, tagId: input.tagId, status: input.status, sorting: input.sorting, skipCount: input.skipCount, maxResultCount: input.maxResultCount }, + }, + { apiName: this.apiName,...config }); + + + hasBlogPostWaitingForReview = (config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/cms-kit-admin/blogs/blog-posts/has-blogpost-waiting-for-review', + }, + { apiName: this.apiName,...config }); + + + publish = (id: string, config?: Partial) => + this.restService.request({ + method: 'POST', + url: `/api/cms-kit-admin/blogs/blog-posts/${id}/publish`, + }, + { apiName: this.apiName,...config }); + + + sendToReview = (id: string, config?: Partial) => + this.restService.request({ + method: 'POST', + url: `/api/cms-kit-admin/blogs/blog-posts/${id}/send-to-review`, + }, + { apiName: this.apiName,...config }); + + + update = (id: string, input: UpdateBlogPostDto, config?: Partial) => + this.restService.request({ + method: 'PUT', + url: `/api/cms-kit-admin/blogs/blog-posts/${id}`, + body: input, + }, + { apiName: this.apiName,...config }); +} \ No newline at end of file diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/index.ts new file mode 100644 index 0000000000..f3178cb77b --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/index.ts @@ -0,0 +1,4 @@ +export * from './blog-admin.service'; +export * from './blog-feature-admin.service'; +export * from './blog-post-admin.service'; +export * from './models'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/models.ts new file mode 100644 index 0000000000..5859b082e8 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/blogs/models.ts @@ -0,0 +1,81 @@ +import type { ExtensibleEntityDto, ExtensibleObject, PagedAndSortedResultRequestDto } from '@abp/ng.core'; +import type { BlogPostStatus } from '../../blogs/blog-post-status.enum'; + +export interface BlogDto extends ExtensibleEntityDto { + name?: string; + slug?: string; + concurrencyStamp?: string; + blogPostCount: number; +} + +export interface BlogFeatureInputDto { + featureName: string; + isEnabled: boolean; +} + +export interface BlogGetListInput extends PagedAndSortedResultRequestDto { + filter?: string; +} + +export interface BlogPostDto extends ExtensibleEntityDto { + blogId?: string; + title?: string; + slug?: string; + shortDescription?: string; + content?: string; + coverImageMediaId?: string; + creationTime?: string; + lastModificationTime?: string; + concurrencyStamp?: string; + status?: BlogPostStatus; +} + +export interface BlogPostGetListInput extends PagedAndSortedResultRequestDto { + filter?: string; + blogId?: string; + authorId?: string; + tagId?: string; + status?: BlogPostStatus; +} + +export interface BlogPostListDto extends ExtensibleEntityDto { + blogId?: string; + blogName?: string; + title?: string; + slug?: string; + shortDescription?: string; + content?: string; + coverImageMediaId?: string; + creationTime?: string; + lastModificationTime?: string; + status?: BlogPostStatus; +} + +export interface CreateBlogDto extends ExtensibleObject { + name: string; + slug: string; +} + +export interface CreateBlogPostDto extends ExtensibleObject { + blogId: string; + title: string; + slug: string; + shortDescription?: string; + content?: string; + coverImageMediaId?: string; +} + +export interface UpdateBlogDto extends ExtensibleObject { + name: string; + slug: string; + concurrencyStamp?: string; +} + +export interface UpdateBlogPostDto extends ExtensibleObject { + title: string; + slug: string; + shortDescription?: string; + content?: string; + coverImageMediaId?: string; + concurrencyStamp?: string; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/comments/comment-admin.service.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/comments/comment-admin.service.ts new file mode 100644 index 0000000000..01bdf7beb1 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/comments/comment-admin.service.ts @@ -0,0 +1,63 @@ +import type { CommentApprovalDto, CommentGetListInput, CommentSettingsDto, CommentWithAuthorDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; +import type { PagedResultDto } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class CommentAdminService { + private restService = inject(RestService); + apiName = 'CmsKitAdmin'; + + + delete = (id: string, config?: Partial) => + this.restService.request({ + method: 'DELETE', + url: `/api/cms-kit-admin/comments/${id}`, + }, + { apiName: this.apiName,...config }); + + + get = (id: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: `/api/cms-kit-admin/comments/${id}`, + }, + { apiName: this.apiName,...config }); + + + getList = (input: CommentGetListInput, config?: Partial) => + this.restService.request>({ + method: 'GET', + url: '/api/cms-kit-admin/comments', + params: { entityType: input.entityType, text: input.text, repliedCommentId: input.repliedCommentId, author: input.author, creationStartDate: input.creationStartDate, creationEndDate: input.creationEndDate, commentApproveState: input.commentApproveState, sorting: input.sorting, skipCount: input.skipCount, maxResultCount: input.maxResultCount }, + }, + { apiName: this.apiName,...config }); + + + getWaitingCount = (config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/cms-kit-admin/comments/waiting-count', + }, + { apiName: this.apiName,...config }); + + + updateApprovalStatus = (id: string, input: CommentApprovalDto, config?: Partial) => + this.restService.request({ + method: 'PUT', + url: `/api/cms-kit-admin/comments/${id}/approval-status`, + body: input, + }, + { apiName: this.apiName,...config }); + + + updateSettings = (input: CommentSettingsDto, config?: Partial) => + this.restService.request({ + method: 'POST', + url: '/api/cms-kit-admin/comments/settings', + body: input, + }, + { apiName: this.apiName,...config }); +} \ No newline at end of file diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/comments/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/comments/index.ts new file mode 100644 index 0000000000..5851691d47 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/comments/index.ts @@ -0,0 +1,2 @@ +export * from './comment-admin.service'; +export * from './models'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/comments/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/comments/models.ts new file mode 100644 index 0000000000..3583c30682 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/comments/models.ts @@ -0,0 +1,40 @@ +import type { ExtensibleObject, PagedAndSortedResultRequestDto } from '@abp/ng.core'; +import type { CommentApproveState } from '../../comments/comment-approve-state.enum'; + +export interface CmsUserDto extends ExtensibleObject { + id?: string; + userName?: string; + name?: string; + surname?: string; +} + +export interface CommentApprovalDto { + isApproved: boolean; +} + +export interface CommentGetListInput extends PagedAndSortedResultRequestDto { + entityType?: string; + text?: string; + repliedCommentId?: string; + author?: string; + creationStartDate?: string; + creationEndDate?: string; + commentApproveState?: CommentApproveState; +} + +export interface CommentSettingsDto { + commentRequireApprovement: boolean; +} + +export interface CommentWithAuthorDto extends ExtensibleObject { + id?: string; + entityType?: string; + entityId?: string; + text?: string; + repliedCommentId?: string; + creatorId?: string; + creationTime?: string; + author: CmsUserDto; + url?: string; + isApproved?: boolean; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/global-resources/global-resource-admin.service.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/global-resources/global-resource-admin.service.ts new file mode 100644 index 0000000000..44e33e63a8 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/global-resources/global-resource-admin.service.ts @@ -0,0 +1,28 @@ +import type { GlobalResourcesDto, GlobalResourcesUpdateDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class GlobalResourceAdminService { + private restService = inject(RestService); + apiName = 'CmsKitAdmin'; + + + get = (config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/cms-kit-admin/global-resources', + }, + { apiName: this.apiName,...config }); + + + setGlobalResources = (input: GlobalResourcesUpdateDto, config?: Partial) => + this.restService.request({ + method: 'POST', + url: '/api/cms-kit-admin/global-resources', + body: input, + }, + { apiName: this.apiName,...config }); +} \ No newline at end of file diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/global-resources/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/global-resources/index.ts new file mode 100644 index 0000000000..4a44beb0cf --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/global-resources/index.ts @@ -0,0 +1,2 @@ +export * from './global-resource-admin.service'; +export * from './models'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/global-resources/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/global-resources/models.ts new file mode 100644 index 0000000000..7e583aed7f --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/global-resources/models.ts @@ -0,0 +1,11 @@ +import type { ExtensibleObject } from '@abp/ng.core'; + +export interface GlobalResourcesDto extends ExtensibleObject { + styleContent?: string; + scriptContent?: string; +} + +export interface GlobalResourcesUpdateDto extends ExtensibleObject { + style?: string; + script?: string; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/index.ts new file mode 100644 index 0000000000..e1f1a2c83e --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/index.ts @@ -0,0 +1,7 @@ +export * from './blogs'; +export * from './comments'; +export * from './global-resources'; +export * from './media-descriptors'; +export * from './menus'; +export * from './pages'; +export * from './tags'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/media-descriptors/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/media-descriptors/index.ts new file mode 100644 index 0000000000..d8b7d7bea8 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/media-descriptors/index.ts @@ -0,0 +1,2 @@ +export * from './media-descriptor-admin.service'; +export * from './models'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/media-descriptors/media-descriptor-admin.service.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/media-descriptors/media-descriptor-admin.service.ts new file mode 100644 index 0000000000..9216384ba5 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/media-descriptors/media-descriptor-admin.service.ts @@ -0,0 +1,29 @@ +import type { CreateMediaInputWithStream, MediaDescriptorDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class MediaDescriptorAdminService { + private restService = inject(RestService); + apiName = 'CmsKitAdmin'; + + + create = (entityType: string, inputStream: CreateMediaInputWithStream, config?: Partial) => + this.restService.request({ + method: 'POST', + url: `/api/cms-kit-admin/media/${entityType}`, + params: { name: inputStream.name }, + body: inputStream.file, + }, + { apiName: this.apiName,...config }); + + + delete = (id: string, config?: Partial) => + this.restService.request({ + method: 'DELETE', + url: `/api/cms-kit-admin/media/${id}`, + }, + { apiName: this.apiName,...config }); +} \ No newline at end of file diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/media-descriptors/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/media-descriptors/models.ts new file mode 100644 index 0000000000..f425ce79d2 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/media-descriptors/models.ts @@ -0,0 +1,13 @@ +import type { IRemoteStreamContent } from '../../../abp/content/models'; +import type { ExtensibleEntityDto } from '@abp/ng.core'; + +export interface CreateMediaInputWithStream { + name: string; + file: IRemoteStreamContent; +} + +export interface MediaDescriptorDto extends ExtensibleEntityDto { + name?: string; + mimeType?: string; + size: number; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/menus/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/menus/index.ts new file mode 100644 index 0000000000..31c9c471b3 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/menus/index.ts @@ -0,0 +1,2 @@ +export * from './menu-item-admin.service'; +export * from './models'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/menus/menu-item-admin.service.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/menus/menu-item-admin.service.ts new file mode 100644 index 0000000000..a5e25b4b61 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/menus/menu-item-admin.service.ts @@ -0,0 +1,91 @@ +import type { MenuItemCreateInput, MenuItemMoveInput, MenuItemUpdateInput, MenuItemWithDetailsDto, PageLookupDto, PageLookupInputDto, PermissionLookupDto, PermissionLookupInputDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; +import type { ListResultDto, PagedResultDto } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; +import type { MenuItemDto } from '../../menus/models'; + +@Injectable({ + providedIn: 'root', +}) +export class MenuItemAdminService { + private restService = inject(RestService); + apiName = 'CmsKitAdmin'; + + + create = (input: MenuItemCreateInput, config?: Partial) => + this.restService.request({ + method: 'POST', + url: '/api/cms-kit-admin/menu-items', + body: input, + }, + { apiName: this.apiName,...config }); + + + delete = (id: string, config?: Partial) => + this.restService.request({ + method: 'DELETE', + url: `/api/cms-kit-admin/menu-items/${id}`, + }, + { apiName: this.apiName,...config }); + + + get = (id: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: `/api/cms-kit-admin/menu-items/${id}`, + }, + { apiName: this.apiName,...config }); + + + getAvailableMenuOrder = (parentId?: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/cms-kit-admin/menu-items/available-order', + params: { parentId }, + }, + { apiName: this.apiName,...config }); + + + getList = (config?: Partial) => + this.restService.request>({ + method: 'GET', + url: '/api/cms-kit-admin/menu-items', + }, + { apiName: this.apiName,...config }); + + + getPageLookup = (input: PageLookupInputDto, config?: Partial) => + this.restService.request>({ + method: 'GET', + url: '/api/cms-kit-admin/menu-items/lookup/pages', + params: { filter: input.filter, status: input.status, sorting: input.sorting, skipCount: input.skipCount, maxResultCount: input.maxResultCount }, + }, + { apiName: this.apiName,...config }); + + + getPermissionLookup = (inputDto: PermissionLookupInputDto, config?: Partial) => + this.restService.request>({ + method: 'GET', + url: '/api/cms-kit-admin/menu-items/lookup/permissions', + params: { filter: inputDto.filter }, + }, + { apiName: this.apiName,...config }); + + + moveMenuItem = (id: string, input: MenuItemMoveInput, config?: Partial) => + this.restService.request({ + method: 'PUT', + url: `/api/cms-kit-admin/menu-items/${id}/move`, + body: input, + }, + { apiName: this.apiName,...config }); + + + update = (id: string, input: MenuItemUpdateInput, config?: Partial) => + this.restService.request({ + method: 'PUT', + url: `/api/cms-kit-admin/menu-items/${id}`, + body: input, + }, + { apiName: this.apiName,...config }); +} \ No newline at end of file diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/menus/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/menus/models.ts new file mode 100644 index 0000000000..204f5c0707 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/menus/models.ts @@ -0,0 +1,58 @@ +import type { EntityDto, ExtensibleObject, PagedAndSortedResultRequestDto } from '@abp/ng.core'; +import type { MenuItemDto } from '../../menus/models'; +import type { PageStatus } from '../../pages/page-status.enum'; + +export interface MenuItemCreateInput extends ExtensibleObject { + parentId?: string; + displayName: string; + isActive: boolean; + url?: string; + icon?: string; + order: number; + target?: string; + elementId?: string; + cssClass?: string; + pageId?: string; + requiredPermissionName?: string; +} + +export interface MenuItemMoveInput { + newParentId?: string; + position: number; +} + +export interface MenuItemUpdateInput extends ExtensibleObject { + displayName: string; + isActive: boolean; + url?: string; + icon?: string; + target?: string; + elementId?: string; + cssClass?: string; + pageId?: string; + requiredPermissionName?: string; + concurrencyStamp?: string; +} + +export interface MenuItemWithDetailsDto extends MenuItemDto { + pageTitle?: string; +} + +export interface PageLookupDto extends EntityDto { + title?: string; + slug?: string; +} + +export interface PageLookupInputDto extends PagedAndSortedResultRequestDto { + filter?: string; + status?: PageStatus; +} + +export interface PermissionLookupDto { + name?: string; + displayName?: string; +} + +export interface PermissionLookupInputDto { + filter?: string; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/pages/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/pages/index.ts new file mode 100644 index 0000000000..9aa4ad4884 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/pages/index.ts @@ -0,0 +1,2 @@ +export * from './models'; +export * from './page-admin.service'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/pages/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/pages/models.ts new file mode 100644 index 0000000000..193fd300b9 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/pages/models.ts @@ -0,0 +1,40 @@ +import type { ExtensibleAuditedEntityDto, ExtensibleObject, PagedAndSortedResultRequestDto } from '@abp/ng.core'; +import type { PageStatus } from '../../pages/page-status.enum'; + +export interface CreatePageInputDto extends ExtensibleObject { + title: string; + slug: string; + layoutName?: string; + content?: string; + script?: string; + style?: string; + status?: PageStatus; +} + +export interface GetPagesInputDto extends PagedAndSortedResultRequestDto { + filter?: string; + status?: PageStatus; +} + +export interface PageDto extends ExtensibleAuditedEntityDto { + title?: string; + slug?: string; + layoutName?: string; + content?: string; + script?: string; + style?: string; + isHomePage: boolean; + status?: PageStatus; + concurrencyStamp?: string; +} + +export interface UpdatePageInputDto extends ExtensibleObject { + title: string; + slug: string; + layoutName?: string; + content?: string; + script?: string; + style?: string; + status?: PageStatus; + concurrencyStamp?: string; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/pages/page-admin.service.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/pages/page-admin.service.ts new file mode 100644 index 0000000000..9f200123d7 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/pages/page-admin.service.ts @@ -0,0 +1,63 @@ +import type { CreatePageInputDto, GetPagesInputDto, PageDto, UpdatePageInputDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; +import type { PagedResultDto } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class PageAdminService { + private restService = inject(RestService); + apiName = 'CmsKitAdmin'; + + + create = (input: CreatePageInputDto, config?: Partial) => + this.restService.request({ + method: 'POST', + url: '/api/cms-kit-admin/pages', + body: input, + }, + { apiName: this.apiName,...config }); + + + delete = (id: string, config?: Partial) => + this.restService.request({ + method: 'DELETE', + url: `/api/cms-kit-admin/pages/${id}`, + }, + { apiName: this.apiName,...config }); + + + get = (id: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: `/api/cms-kit-admin/pages/${id}`, + }, + { apiName: this.apiName,...config }); + + + getList = (input: GetPagesInputDto, config?: Partial) => + this.restService.request>({ + method: 'GET', + url: '/api/cms-kit-admin/pages', + params: { filter: input.filter, status: input.status, sorting: input.sorting, skipCount: input.skipCount, maxResultCount: input.maxResultCount }, + }, + { apiName: this.apiName,...config }); + + + setAsHomePage = (id: string, config?: Partial) => + this.restService.request({ + method: 'PUT', + url: `/api/cms-kit-admin/pages/setashomepage/${id}`, + }, + { apiName: this.apiName,...config }); + + + update = (id: string, input: UpdatePageInputDto, config?: Partial) => + this.restService.request({ + method: 'PUT', + url: `/api/cms-kit-admin/pages/${id}`, + body: input, + }, + { apiName: this.apiName,...config }); +} \ No newline at end of file diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/entity-tag-admin.service.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/entity-tag-admin.service.ts new file mode 100644 index 0000000000..94e2502882 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/entity-tag-admin.service.ts @@ -0,0 +1,38 @@ +import type { EntityTagCreateDto, EntityTagRemoveDto, EntityTagSetDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class EntityTagAdminService { + private restService = inject(RestService); + apiName = 'CmsKitAdmin'; + + + addTagToEntity = (input: EntityTagCreateDto, config?: Partial) => + this.restService.request({ + method: 'POST', + url: '/api/cms-kit-admin/entity-tags', + body: input, + }, + { apiName: this.apiName,...config }); + + + removeTagFromEntity = (input: EntityTagRemoveDto, config?: Partial) => + this.restService.request({ + method: 'DELETE', + url: '/api/cms-kit-admin/entity-tags', + params: { tagId: input.tagId, entityType: input.entityType, entityId: input.entityId }, + }, + { apiName: this.apiName,...config }); + + + setEntityTags = (input: EntityTagSetDto, config?: Partial) => + this.restService.request({ + method: 'PUT', + url: '/api/cms-kit-admin/entity-tags', + body: input, + }, + { apiName: this.apiName,...config }); +} \ No newline at end of file diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/index.ts new file mode 100644 index 0000000000..88dd146b02 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/index.ts @@ -0,0 +1,3 @@ +export * from './entity-tag-admin.service'; +export * from './models'; +export * from './tag-admin.service'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/models.ts new file mode 100644 index 0000000000..a45d4623c7 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/models.ts @@ -0,0 +1,38 @@ +import type { ExtensibleObject, PagedAndSortedResultRequestDto } from '@abp/ng.core'; + +export interface EntityTagCreateDto { + tagName: string; + entityType: string; + entityId: string; +} + +export interface EntityTagRemoveDto { + tagId: string; + entityType: string; + entityId: string; +} + +export interface EntityTagSetDto { + entityId?: string; + entityType?: string; + tags: string[]; +} + +export interface TagCreateDto extends ExtensibleObject { + entityType: string; + name: string; +} + +export interface TagDefinitionDto { + entityType?: string; + displayName?: string; +} + +export interface TagGetListInput extends PagedAndSortedResultRequestDto { + filter?: string; +} + +export interface TagUpdateDto extends ExtensibleObject { + name: string; + concurrencyStamp?: string; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/tag-admin.service.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/tag-admin.service.ts new file mode 100644 index 0000000000..e4410ef3ce --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/admin/tags/tag-admin.service.ts @@ -0,0 +1,64 @@ +import type { TagCreateDto, TagDefinitionDto, TagGetListInput, TagUpdateDto } from './models'; +import { RestService, Rest } from '@abp/ng.core'; +import type { PagedResultDto } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; +import type { TagDto } from '../../tags/models'; + +@Injectable({ + providedIn: 'root', +}) +export class TagAdminService { + private restService = inject(RestService); + apiName = 'CmsKitAdmin'; + + + create = (input: TagCreateDto, config?: Partial) => + this.restService.request({ + method: 'POST', + url: '/api/cms-kit-admin/tags', + body: input, + }, + { apiName: this.apiName,...config }); + + + delete = (id: string, config?: Partial) => + this.restService.request({ + method: 'DELETE', + url: `/api/cms-kit-admin/tags/${id}`, + }, + { apiName: this.apiName,...config }); + + + get = (id: string, config?: Partial) => + this.restService.request({ + method: 'GET', + url: `/api/cms-kit-admin/tags/${id}`, + }, + { apiName: this.apiName,...config }); + + + getList = (input: TagGetListInput, config?: Partial) => + this.restService.request>({ + method: 'GET', + url: '/api/cms-kit-admin/tags', + params: { filter: input.filter, sorting: input.sorting, skipCount: input.skipCount, maxResultCount: input.maxResultCount }, + }, + { apiName: this.apiName,...config }); + + + getTagDefinitions = (config?: Partial) => + this.restService.request({ + method: 'GET', + url: '/api/cms-kit-admin/tags/tag-definitions', + }, + { apiName: this.apiName,...config }); + + + update = (id: string, input: TagUpdateDto, config?: Partial) => + this.restService.request({ + method: 'PUT', + url: `/api/cms-kit-admin/tags/${id}`, + body: input, + }, + { apiName: this.apiName,...config }); +} \ No newline at end of file diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/blogs/blog-post-status.enum.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/blogs/blog-post-status.enum.ts new file mode 100644 index 0000000000..47566f5e5b --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/blogs/blog-post-status.enum.ts @@ -0,0 +1,9 @@ +import { mapEnumToOptions } from '@abp/ng.core'; + +export enum BlogPostStatus { + Draft = 0, + Published = 1, + WaitingForReview = 2, +} + +export const blogPostStatusOptions = mapEnumToOptions(BlogPostStatus); diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/blogs/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/blogs/index.ts new file mode 100644 index 0000000000..6f0331ceb4 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/blogs/index.ts @@ -0,0 +1,2 @@ +export * from './blog-post-status.enum'; +export * from './models'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/blogs/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/blogs/models.ts new file mode 100644 index 0000000000..5c7bdf4e0b --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/blogs/models.ts @@ -0,0 +1,6 @@ +import type { ExtensibleEntityDto } from '@abp/ng.core'; + +export interface BlogFeatureDto extends ExtensibleEntityDto { + featureName?: string; + isEnabled: boolean; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/comments/comment-approve-state.enum.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/comments/comment-approve-state.enum.ts new file mode 100644 index 0000000000..74831e8d69 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/comments/comment-approve-state.enum.ts @@ -0,0 +1,10 @@ +import { mapEnumToOptions } from '@abp/ng.core'; + +export enum CommentApproveState { + All = 0, + Approved = 1, + Disapproved = 2, + Waiting = 4, +} + +export const commentApproveStateOptions = mapEnumToOptions(CommentApproveState); diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/comments/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/comments/index.ts new file mode 100644 index 0000000000..6ac520efda --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/comments/index.ts @@ -0,0 +1 @@ +export * from './comment-approve-state.enum'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/index.ts new file mode 100644 index 0000000000..ba49ceda72 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/index.ts @@ -0,0 +1,6 @@ +export * from './admin'; +export * from './blogs'; +export * from './comments'; +export * from './menus'; +export * from './pages'; +export * from './tags'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/menus/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/menus/index.ts new file mode 100644 index 0000000000..e9644dae47 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/menus/index.ts @@ -0,0 +1 @@ +export * from './models'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/menus/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/menus/models.ts new file mode 100644 index 0000000000..e2bc60ec38 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/menus/models.ts @@ -0,0 +1,16 @@ +import type { ExtensibleAuditedEntityDto } from '@abp/ng.core'; + +export interface MenuItemDto extends ExtensibleAuditedEntityDto { + parentId?: string; + displayName?: string; + isActive: boolean; + url?: string; + icon?: string; + order: number; + target?: string; + elementId?: string; + cssClass?: string; + pageId?: string; + requiredPermissionName?: string; + concurrencyStamp?: string; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/pages/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/pages/index.ts new file mode 100644 index 0000000000..c4a3a4a9eb --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/pages/index.ts @@ -0,0 +1 @@ +export * from './page-status.enum'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/pages/page-status.enum.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/pages/page-status.enum.ts new file mode 100644 index 0000000000..4cd4790b98 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/pages/page-status.enum.ts @@ -0,0 +1,8 @@ +import { mapEnumToOptions } from '@abp/ng.core'; + +export enum PageStatus { + Draft = 0, + Publish = 1, +} + +export const pageStatusOptions = mapEnumToOptions(PageStatus); diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/tags/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/tags/index.ts new file mode 100644 index 0000000000..e9644dae47 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/tags/index.ts @@ -0,0 +1 @@ +export * from './models'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/tags/models.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/tags/models.ts new file mode 100644 index 0000000000..58eb79bf18 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/cms-kit/tags/models.ts @@ -0,0 +1,7 @@ +import type { ExtensibleEntityDto } from '@abp/ng.core'; + +export interface TagDto extends ExtensibleEntityDto { + entityType?: string; + name?: string; + concurrencyStamp?: string; +} diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/index.ts b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/index.ts new file mode 100644 index 0000000000..6af7178ded --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/lib/proxy/volo/index.ts @@ -0,0 +1,2 @@ +export * from './cms-kit'; +export * from './abp'; diff --git a/npm/ng-packs/packages/cms-kit/proxy/src/public-api.ts b/npm/ng-packs/packages/cms-kit/proxy/src/public-api.ts new file mode 100644 index 0000000000..11aece60c4 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/proxy/src/public-api.ts @@ -0,0 +1 @@ +export * from './lib/index'; diff --git a/npm/ng-packs/packages/cms-kit/public/config/ng-package.json b/npm/ng-packs/packages/cms-kit/public/config/ng-package.json new file mode 100644 index 0000000000..f55dff93db --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/config/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../node_modules/ng-packagr/ng-entrypoint.schema.json", + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/npm/ng-packs/packages/cms-kit/public/config/src/enums/index.ts b/npm/ng-packs/packages/cms-kit/public/config/src/enums/index.ts new file mode 100644 index 0000000000..4a7a6a0e23 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/config/src/enums/index.ts @@ -0,0 +1,2 @@ +export * from './policy-names'; +export * from './route-names'; diff --git a/npm/ng-packs/packages/cms-kit/public/config/src/enums/policy-names.ts b/npm/ng-packs/packages/cms-kit/public/config/src/enums/policy-names.ts new file mode 100644 index 0000000000..cf2aa04983 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/config/src/enums/policy-names.ts @@ -0,0 +1,5 @@ +export enum eCmsKitPublicPolicyNames { + Pages = 'CmsKit.Pages', + Blogs = 'CmsKit.Blogs', + Comments = 'CmsKit.Comments', +} diff --git a/npm/ng-packs/packages/cms-kit/public/config/src/enums/route-names.ts b/npm/ng-packs/packages/cms-kit/public/config/src/enums/route-names.ts new file mode 100644 index 0000000000..b85fe1716f --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/config/src/enums/route-names.ts @@ -0,0 +1,5 @@ +export enum eCmsKitPublicRouteNames { + Pages = 'CmsKit::Public:Pages', + Blogs = 'CmsKit::Public:Blogs', + BlogPosts = 'CmsKit::Public:BlogPosts', +} diff --git a/npm/ng-packs/packages/cms-kit/public/config/src/providers/cms-kit-public-config.provider.ts b/npm/ng-packs/packages/cms-kit/public/config/src/providers/cms-kit-public-config.provider.ts new file mode 100644 index 0000000000..cd7eaff0cd --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/config/src/providers/cms-kit-public-config.provider.ts @@ -0,0 +1,6 @@ +import { Provider, makeEnvironmentProviders } from '@angular/core'; +import { CMS_KIT_PUBLIC_ROUTE_PROVIDERS } from './route.provider'; + +export function provideCmsKitPublicConfig() { + return makeEnvironmentProviders([CMS_KIT_PUBLIC_ROUTE_PROVIDERS]); +} diff --git a/npm/ng-packs/packages/cms-kit/public/config/src/providers/index.ts b/npm/ng-packs/packages/cms-kit/public/config/src/providers/index.ts new file mode 100644 index 0000000000..eaf80e9bf5 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/config/src/providers/index.ts @@ -0,0 +1,2 @@ +export * from './cms-kit-public-config.provider'; +export * from './route.provider'; diff --git a/npm/ng-packs/packages/cms-kit/public/config/src/providers/route.provider.ts b/npm/ng-packs/packages/cms-kit/public/config/src/providers/route.provider.ts new file mode 100644 index 0000000000..dfb2f1394d --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/config/src/providers/route.provider.ts @@ -0,0 +1,31 @@ +import { RoutesService } from '@abp/ng.core'; +import { inject, provideAppInitializer } from '@angular/core'; +import { eCmsKitPublicPolicyNames } from '../enums/policy-names'; +import { eCmsKitPublicRouteNames } from '../enums/route-names'; + +export const CMS_KIT_PUBLIC_ROUTE_PROVIDERS = [ + provideAppInitializer(() => { + configureRoutes(); + }), +]; + +export function configureRoutes() { + const routesService = inject(RoutesService); + routesService.add([ + { + path: '/cms/pages/:slug', + name: eCmsKitPublicRouteNames.Pages, + requiredPolicy: eCmsKitPublicPolicyNames.Pages, + }, + { + path: '/cms/blogs', + name: eCmsKitPublicRouteNames.Blogs, + requiredPolicy: eCmsKitPublicPolicyNames.Blogs, + }, + { + path: '/cms/blogs/:blogSlug/:blogPostSlug', + name: eCmsKitPublicRouteNames.BlogPosts, + requiredPolicy: eCmsKitPublicPolicyNames.Blogs, + }, + ]); +} diff --git a/npm/ng-packs/packages/cms-kit/public/config/src/public-api.ts b/npm/ng-packs/packages/cms-kit/public/config/src/public-api.ts new file mode 100644 index 0000000000..f02a1bd71c --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/config/src/public-api.ts @@ -0,0 +1,3 @@ +// TODO public configuration will be implemented later +export * from './enums'; +export * from './providers'; diff --git a/npm/ng-packs/packages/cms-kit/public/ng-package.json b/npm/ng-packs/packages/cms-kit/public/ng-package.json new file mode 100644 index 0000000000..e09fb3fd03 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-entrypoint.schema.json", + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/cms-kit-public.routes.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/cms-kit-public.routes.ts new file mode 100644 index 0000000000..d059b27de6 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/cms-kit-public.routes.ts @@ -0,0 +1,26 @@ +import { Routes } from '@angular/router'; +import { Provider } from '@angular/core'; +import { RouterOutletComponent } from '@abp/ng.core'; + +export interface CmsKitPublicConfigOptions { + // Extension point contributors +} + +export function createRoutes(config: CmsKitPublicConfigOptions = {}): Routes { + return [ + { + path: '', + component: RouterOutletComponent, + providers: provideCmsKitPublicContributors(config), + children: [ + // Routes will be added here + ], + }, + ]; +} + +function provideCmsKitPublicContributors(options: CmsKitPublicConfigOptions = {}): Provider[] { + return [ + // Contributors will be added here + ]; +} diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/components/index.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/components/index.ts new file mode 100644 index 0000000000..ee1fdc5abf --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/components/index.ts @@ -0,0 +1 @@ +// Components will be exported here diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/enums/components.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/enums/components.ts new file mode 100644 index 0000000000..7bb11b68d4 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/enums/components.ts @@ -0,0 +1,11 @@ +export enum eCmsKitPublicComponents { + PageView = 'CmsKit.Public.PageView', + BlogList = 'CmsKit.Public.BlogList', + BlogPostView = 'CmsKit.Public.BlogPostView', + Commenting = 'CmsKit.Public.Commenting', + MarkedItemToggle = 'CmsKit.Public.MarkedItemToggle', + PopularTags = 'CmsKit.Public.PopularTags', + Rating = 'CmsKit.Public.Rating', + ReactionSelection = 'CmsKit.Public.ReactionSelection', + Tags = 'CmsKit.Public.Tags', +} diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/enums/index.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/enums/index.ts new file mode 100644 index 0000000000..07635cbbc8 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/enums/index.ts @@ -0,0 +1 @@ +export * from './components'; diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/models/config-options.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/models/config-options.ts new file mode 100644 index 0000000000..b4334fbe81 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/models/config-options.ts @@ -0,0 +1,3 @@ +export interface CmsKitPublicConfigOptions { + // Extension point contributors will be added here +} diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/models/index.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/models/index.ts new file mode 100644 index 0000000000..d474226b19 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/models/index.ts @@ -0,0 +1 @@ +export * from './config-options'; diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/public-api.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/public-api.ts new file mode 100644 index 0000000000..85877964c4 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/public-api.ts @@ -0,0 +1,4 @@ +export * from './enums'; +export * from './models'; +export * from './tokens'; +export * from './resolvers'; diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/resolvers/extensions.resolver.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/resolvers/extensions.resolver.ts new file mode 100644 index 0000000000..44540414cd --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/resolvers/extensions.resolver.ts @@ -0,0 +1,7 @@ +import { ResolveFn } from '@angular/router'; + +// Resolvers will be defined here +// export const cmsKitPublicResolver: ResolveFn = (route, state) => { +// // Resolver implementation +// return null; +// }; diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/resolvers/index.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/resolvers/index.ts new file mode 100644 index 0000000000..1be292f2b0 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/resolvers/index.ts @@ -0,0 +1 @@ +export * from './extensions.resolver'; diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/tokens/extensions.token.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/tokens/extensions.token.ts new file mode 100644 index 0000000000..2887603976 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/tokens/extensions.token.ts @@ -0,0 +1,4 @@ +import { InjectionToken } from '@angular/core'; + +// Extension tokens will be defined here +export const EXTENSIONS_IDENTIFIER = new InjectionToken('EXTENSIONS_IDENTIFIER'); diff --git a/npm/ng-packs/packages/cms-kit/public/src/lib/tokens/index.ts b/npm/ng-packs/packages/cms-kit/public/src/lib/tokens/index.ts new file mode 100644 index 0000000000..33233400a2 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/lib/tokens/index.ts @@ -0,0 +1 @@ +export * from './extensions.token'; diff --git a/npm/ng-packs/packages/cms-kit/public/src/public-api.ts b/npm/ng-packs/packages/cms-kit/public/src/public-api.ts new file mode 100644 index 0000000000..17cae63d98 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/public/src/public-api.ts @@ -0,0 +1,3 @@ +// Main package entry point +// Use @abp/ng.cms-kit/admin or @abp/ng.cms-kit/public for specific functionality +export {}; diff --git a/npm/ng-packs/packages/cms-kit/src/components/code-mirror-editor/code-mirror-editor.component.ts b/npm/ng-packs/packages/cms-kit/src/components/code-mirror-editor/code-mirror-editor.component.ts new file mode 100644 index 0000000000..5792a9971d --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/components/code-mirror-editor/code-mirror-editor.component.ts @@ -0,0 +1,70 @@ +import { Component, ElementRef, AfterViewInit, ViewChild, forwardRef } from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { EditorState } from '@codemirror/state'; +import { EditorView, lineNumbers } from '@codemirror/view'; +import { basicSetup } from 'codemirror'; + +@Component({ + selector: 'abp-codemirror-editor', + template: `
`, + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CodeMirrorEditorComponent), + multi: true, + }, + ], +}) +export class CodeMirrorEditorComponent implements AfterViewInit, ControlValueAccessor { + @ViewChild('cmHost', { static: true }) + host!: ElementRef; + + private view!: EditorView; + private value = ''; + + private onChange = (value: string) => {}; + private onTouched = () => {}; + + writeValue(value: string): void { + this.value = value || ''; + + if (this.view) { + this.view.dispatch({ + changes: { + from: 0, + to: this.view.state.doc.length, + insert: this.value, + }, + }); + } + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouched = fn; + } + + ngAfterViewInit(): void { + const startState = EditorState.create({ + doc: this.value, + extensions: [ + basicSetup, + EditorView.updateListener.of(update => { + if (update.docChanged) { + const text = update.state.doc.toString(); + this.onChange(text); + } + }), + lineNumbers(), + ], + }); + + this.view = new EditorView({ + state: startState, + parent: this.host.nativeElement, + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/src/components/index.ts b/npm/ng-packs/packages/cms-kit/src/components/index.ts new file mode 100644 index 0000000000..3c9eb8b53f --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/components/index.ts @@ -0,0 +1,2 @@ +export * from './code-mirror-editor/code-mirror-editor.component'; +export * from './toast-ui/toastui-editor.component'; diff --git a/npm/ng-packs/packages/cms-kit/src/components/toast-ui/toastui-editor.component.ts b/npm/ng-packs/packages/cms-kit/src/components/toast-ui/toastui-editor.component.ts new file mode 100644 index 0000000000..f9a6aa5469 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/components/toast-ui/toastui-editor.component.ts @@ -0,0 +1,121 @@ +import { isPlatformBrowser } from '@angular/common'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { + Component, + AfterViewInit, + ViewChild, + ElementRef, + forwardRef, + inject, + PLATFORM_ID, + DestroyRef, +} from '@angular/core'; +import Editor from '@toast-ui/editor'; + +import { AbpLocalStorageService } from '@abp/ng.core'; +import { THEME_CHANGE_TOKEN } from '@abp/ng.theme.shared'; + +@Component({ + selector: 'abp-toastui-editor', + template: `
`, + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ToastuiEditorComponent), + multi: true, + }, + ], +}) +export class ToastuiEditorComponent implements AfterViewInit, ControlValueAccessor { + @ViewChild('editorContainer', { static: true }) + editorContainer!: ElementRef; + + private editor!: Editor; + private value = ''; + + private platformId = inject(PLATFORM_ID); + private localStorageService = inject(AbpLocalStorageService); + private destroyRef = inject(DestroyRef); + private themeChange$ = inject(THEME_CHANGE_TOKEN, { optional: true }); + + private onChange: (value: string) => void = () => {}; + private onTouched: () => void = () => {}; + + writeValue(value: string): void { + this.value = value || ''; + if (this.editor) { + this.editor.setMarkdown(this.value); + } + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouched = fn; + } + + ngAfterViewInit(): void { + if (!isPlatformBrowser(this.platformId)) { + return; + } + + this.initializeEditor(); + if (this.themeChange$) { + this.setupThemeListener(); + } + } + + private getTheme(): string { + return this.localStorageService.getItem('LPX_THEME') || 'light'; + } + + private initializeEditor(): void { + const theme = this.getTheme(); + this.editor = new Editor({ + el: this.editorContainer.nativeElement, + previewStyle: 'tab', + height: '500px', + theme: theme, + initialValue: this.value, + }); + + this.editor.addHook('change', () => { + const value = this.editor.getMarkdown(); + this.onChange(value); + }); + } + + private setupThemeListener(): void { + this.themeChange$!.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(style => { + if (!this.editor) { + return; + } + const wrapper = + this.editorContainer.nativeElement.querySelector('.toastui-editor-defaultUI') ?? + this.editorContainer.nativeElement; + + const { styleName } = style; + + switch (styleName) { + case 'dark': + wrapper.classList.add('toastui-editor-dark'); + break; + case 'system': + const isSystemDark = + typeof window !== 'undefined' && + window.matchMedia('(prefers-color-scheme: dark)').matches; + if (!isSystemDark) { + wrapper.classList.remove('toastui-editor-dark'); + } else { + wrapper.classList.add('toastui-editor-dark'); + } + break; + default: + wrapper.classList.remove('toastui-editor-dark'); + } + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/src/public-api.ts b/npm/ng-packs/packages/cms-kit/src/public-api.ts new file mode 100644 index 0000000000..077f2b8e14 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/public-api.ts @@ -0,0 +1,4 @@ +// Main package entry point +// Use @abp/ng.cms-kit/admin or @abp/ng.cms-kit/public for specific functionality +export * from './components'; +export * from './utils'; diff --git a/npm/ng-packs/packages/cms-kit/src/test-setup.ts b/npm/ng-packs/packages/cms-kit/src/test-setup.ts new file mode 100644 index 0000000000..ff49dc4906 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/test-setup.ts @@ -0,0 +1,15 @@ +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv(); + +// Optional: align with core package behavior and provide a stable window.location +Object.defineProperty(window, 'location', { + value: { + href: 'http://localhost:4200', + origin: 'http://localhost:4200', + pathname: '/', + search: '', + hash: '', + }, + writable: true, +}); diff --git a/npm/ng-packs/packages/cms-kit/src/utils/form.utils.ts b/npm/ng-packs/packages/cms-kit/src/utils/form.utils.ts new file mode 100644 index 0000000000..e19adc4a34 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/utils/form.utils.ts @@ -0,0 +1,37 @@ +import { FormGroup } from '@angular/forms'; +import { DestroyRef } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { dasharize } from './text.utils'; + +/** + * Sets up automatic slug generation from a source control (e.g., title, name) to a target control (slug). + * The slug is automatically updated when the source control value changes. + * + * @param form - The form group containing the controls + * @param sourceControlName - Name of the source control (e.g., 'title', 'name') + * @param targetControlName - Name of the target control (e.g., 'slug') + * @param destroyRef - DestroyRef for automatic subscription cleanup + */ +export function prepareSlugFromControl( + form: FormGroup, + sourceControlName: string, + targetControlName: string, + destroyRef: DestroyRef, +): void { + const sourceControl = form.get(sourceControlName); + const targetControl = form.get(targetControlName); + + if (!sourceControl || !targetControl) { + return; + } + + sourceControl.valueChanges.pipe(takeUntilDestroyed(destroyRef)).subscribe(value => { + if (value && typeof value === 'string') { + const dasharized = dasharize(value); + const currentSlug = targetControl.value || ''; + if (dasharized !== currentSlug) { + targetControl.setValue(dasharized, { emitEvent: false }); + } + } + }); +} diff --git a/npm/ng-packs/packages/cms-kit/src/utils/index.ts b/npm/ng-packs/packages/cms-kit/src/utils/index.ts new file mode 100644 index 0000000000..68c64a471a --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './text.utils'; +export * from './form.utils'; diff --git a/npm/ng-packs/packages/cms-kit/src/utils/text.utils.ts b/npm/ng-packs/packages/cms-kit/src/utils/text.utils.ts new file mode 100644 index 0000000000..123666c369 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/utils/text.utils.ts @@ -0,0 +1,11 @@ +export function dasharize(text: string) { + return text + .trim() + .replace(/([a-z])([A-Z])/g, '$1-$2') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2') + .replace(/[\s_]+/g, '-') + .replace(/[^\w\s-]/g, '') + .replace(/-+/g, '-') + .replace(/^-+|-+$/g, '') + .toLowerCase(); +} diff --git a/npm/ng-packs/packages/cms-kit/tsconfig.json b/npm/ng-packs/packages/cms-kit/tsconfig.json new file mode 100644 index 0000000000..a8ee59d91f --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "compilerOptions": { + "target": "es2020", + "skipLibCheck": true + } +} diff --git a/npm/ng-packs/packages/cms-kit/tsconfig.lib.json b/npm/ng-packs/packages/cms-kit/tsconfig.lib.json new file mode 100644 index 0000000000..22d2695db8 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/tsconfig.lib.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "target": "ES2022", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [], + "lib": ["dom", "es2020"], + "useDefineForClassFields": false + }, + "exclude": ["src/test-setup.ts", "**/*.spec.ts", "jest.config.ts"], + "include": ["**/*.ts"] +} diff --git a/npm/ng-packs/packages/cms-kit/tsconfig.lib.prod.json b/npm/ng-packs/packages/cms-kit/tsconfig.lib.prod.json new file mode 100644 index 0000000000..8bfa43c12b --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/tsconfig.lib.prod.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false, + "target": "ES2022", + "useDefineForClassFields": false, + "skipLibCheck": true + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/npm/ng-packs/packages/cms-kit/tsconfig.spec.json b/npm/ng-packs/packages/cms-kit/tsconfig.spec.json new file mode 100644 index 0000000000..f6d8ffcc9f --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] +} diff --git a/npm/ng-packs/packages/components/chart.js/src/chart.component.ts b/npm/ng-packs/packages/components/chart.js/src/chart.component.ts index 9ab84aedcd..c51b01dfe8 100644 --- a/npm/ng-packs/packages/components/chart.js/src/chart.component.ts +++ b/npm/ng-packs/packages/components/chart.js/src/chart.component.ts @@ -1,17 +1,16 @@ -import { - AfterViewInit, - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - ElementRef, - EventEmitter, - Input, - OnChanges, - OnDestroy, - Output, - SimpleChanges, - ViewChild, - inject +import { + AfterViewInit, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ElementRef, + OnDestroy, + ViewChild, + effect, + inject, + input, + output, + untracked, } from '@angular/core'; let Chart: any; @@ -21,13 +20,13 @@ let Chart: any; template: `
@@ -35,36 +34,42 @@ let Chart: any; changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'abpChart', }) -export class ChartComponent implements AfterViewInit, OnDestroy, OnChanges { +export class ChartComponent implements AfterViewInit, OnDestroy { el = inject(ElementRef); private cdr = inject(ChangeDetectorRef); - @Input() type!: string; + readonly type = input.required(); + readonly data = input({}); + readonly options = input({}); + readonly plugins = input([]); + readonly width = input(); + readonly height = input(); + readonly responsive = input(true); - @Input() data: any = {}; - - @Input() options: any = {}; - - @Input() plugins: any[] = []; - - @Input() width?: string; - - @Input() height?: string; - - @Input() responsive = true; - - @Output() dataSelect = new EventEmitter(); - - @Output() initialized = new EventEmitter(); + readonly dataSelect = output(); + readonly initialized = output(); @ViewChild('canvas') canvas!: ElementRef; chart: any; + constructor() { + effect(() => { + const data = this.data(); + const options = this.options(); + + untracked(() => { + if (!this.chart) return; + this.chart.destroy(); + this.initChart(data, options); + }); + }); + } + ngAfterViewInit() { import('chart.js/auto').then(module => { Chart = module.default; - this.initChart(); + this.initChart(this.data(), this.options()); this.initialized.emit(true); }); } @@ -90,20 +95,20 @@ export class ChartComponent implements AfterViewInit, OnDestroy, OnChanges { } } - private initChart = () => { - const opts = this.options || {}; - opts.responsive = this.responsive; + private initChart = (data: any, options: any) => { + const opts = options || {}; + opts.responsive = this.responsive(); // allows chart to resize in responsive mode - if (opts.responsive && (this.height || this.width)) { + if (opts.responsive && (this.height() || this.width())) { opts.maintainAspectRatio = false; } this.chart = new Chart(this.canvas.nativeElement, { - type: this.type as any, - data: this.data, - options: this.options, - plugins: this.plugins, + type: this.type() as any, + data: data, + options: opts, + plugins: this.plugins(), }); }; @@ -131,7 +136,7 @@ export class ChartComponent implements AfterViewInit, OnDestroy, OnChanges { reinit = () => { if (!this.chart) return; this.chart.destroy(); - this.initChart(); + this.initChart(this.data(), this.options()); }; ngOnDestroy() { @@ -140,13 +145,5 @@ export class ChartComponent implements AfterViewInit, OnDestroy, OnChanges { this.chart = null; } } - - ngOnChanges(changes: SimpleChanges) { - if (!this.chart) return; - - if (changes.data?.currentValue || changes.options?.currentValue) { - this.chart.destroy(); - this.initChart(); - } - } } + diff --git a/npm/ng-packs/packages/components/dynamic-form/src/dynamic-form-field/dynamic-form-field-host.component.ts b/npm/ng-packs/packages/components/dynamic-form/src/dynamic-form-field/dynamic-form-field-host.component.ts index 56f32f6e0d..d711b2030a 100644 --- a/npm/ng-packs/packages/components/dynamic-form/src/dynamic-form-field/dynamic-form-field-host.component.ts +++ b/npm/ng-packs/packages/components/dynamic-form/src/dynamic-form-field/dynamic-form-field-host.component.ts @@ -1,6 +1,5 @@ import { Component, - ViewChild, ViewContainerRef, ChangeDetectionStrategy, forwardRef, @@ -9,6 +8,7 @@ import { DestroyRef, inject, input, + viewChild } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR, FormControl, ReactiveFormsModule @@ -34,7 +34,7 @@ export class DynamicFieldHostComponent implements ControlValueAccessor { component = input>(); inputs = input>({}); - @ViewChild('vcRef', { read: ViewContainerRef, static: true }) viewContainerRef!: ViewContainerRef; + readonly viewContainerRef = viewChild.required('vcRef', { read: ViewContainerRef }); private componentRef?: any; private value: any; @@ -55,10 +55,10 @@ export class DynamicFieldHostComponent implements ControlValueAccessor { } private createChild() { - this.viewContainerRef.clear(); + this.viewContainerRef().clear(); if (!this.component()) return; - this.componentRef = this.viewContainerRef.createComponent(this.component()); + this.componentRef = this.viewContainerRef().createComponent(this.component()); this.applyInputs(); const instance: any = this.componentRef.instance as controlValueAccessorLike & acceptsFormControl; diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/abstract-actions/abstract-actions.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/abstract-actions/abstract-actions.component.ts index 465a18b813..e162310044 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/abstract-actions/abstract-actions.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/abstract-actions/abstract-actions.component.ts @@ -1,4 +1,4 @@ -import { Directive, Injector, Input, inject } from '@angular/core'; +import { Directive, Injector, inject, input } from '@angular/core'; import { ActionData, ActionList, InferredAction } from '../../models/actions'; import { ExtensionsService } from '../../services/extensions.service'; import { EXTENSIONS_ACTION_TYPE, EXTENSIONS_IDENTIFIER } from '../../tokens/extensions.token'; @@ -14,7 +14,7 @@ export abstract class AbstractActionsComponent< readonly getInjected: InferredData['getInjected']; - @Input() record!: InferredData['record']; + record = input.required>(); protected constructor() { const injector = inject(Injector); @@ -27,3 +27,4 @@ export abstract class AbstractActionsComponent< this.actionList = extensions[type].get(name).actions as unknown as L; } } + diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts index 907118283e..05fad7a63d 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts @@ -6,7 +6,7 @@ import { input, Optional, SkipSelf, - ViewChild, + viewChild } from '@angular/core'; import { ControlContainer, ReactiveFormsModule } from '@angular/forms'; import { @@ -76,14 +76,14 @@ export class ExtensibleDateTimePickerComponent { meridian = input(false); placement = input('bottom-left'); - @ViewChild(NgbInputDatepicker) date!: NgbInputDatepicker; - @ViewChild(NgbTimepicker) time!: NgbTimepicker; + readonly date = viewChild.required(NgbInputDatepicker); + readonly time = viewChild.required(NgbTimepicker); setDate(dateStr: string) { - this.date.writeValue(dateStr); + this.date().writeValue(dateStr); } setTime(dateStr: string) { - this.time.writeValue(dateStr); + this.time().writeValue(dateStr); } } diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html index 732a81c76b..08a2a8bf0c 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html @@ -1,34 +1,34 @@ - - @switch (getComponent(prop)) { + + @switch (getComponent(prop())) { @case ('template') { - + } } -
- @switch (getComponent(prop)) { +
+ @switch (getComponent(prop())) { @case ('input') { } @case ('hidden') { - + } @case ('checkbox') {
- +
} @case ('date') { - + } @case ('dateTime') { - + } @case ('textarea') {