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 559bdb637e..ec7ba474f0 100644 --- a/.github/workflows/auto-pr.yml +++ b/.github/workflows/auto-pr.yml @@ -1,13 +1,13 @@ -name: Merge branch dev with rel-10.1 +name: Merge branch dev with rel-10.2 on: push: branches: - - rel-10.1 + - rel-10.2 permissions: contents: read jobs: - merge-dev-with-rel-10-1: + merge-dev-with-rel-10-2: permissions: contents: write # for peter-evans/create-pull-request to create branch pull-requests: write # for peter-evans/create-pull-request to create a PR @@ -18,14 +18,14 @@ jobs: ref: dev - name: Reset promotion branch run: | - git fetch origin rel-10.1:rel-10.1 - git reset --hard rel-10.1 + git fetch origin rel-10.2:rel-10.2 + git reset --hard rel-10.2 - name: Create Pull Request uses: peter-evans/create-pull-request@v3 with: - 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. + branch: auto-merge/rel-10-2/${{github.run_number}} + title: Merge branch dev with rel-10.2 + body: This PR generated automatically to merge dev with rel-10.2. Please review the changed files before merging to prevent any errors that may occur. draft: true token: ${{ github.token }} - name: Merge Pull Request @@ -33,5 +33,5 @@ jobs: GH_TOKEN: ${{ secrets.BOT_SECRET }} run: | gh pr ready - gh pr review auto-merge/rel-10-1/${{github.run_number}} --approve - gh pr merge auto-merge/rel-10-1/${{github.run_number}} --merge --auto --delete-branch + gh pr review auto-merge/rel-10-2/${{github.run_number}} --approve + gh pr merge auto-merge/rel-10-2/${{github.run_number}} --merge --auto --delete-branch 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 36d35793d3..f73b4537ad 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -19,10 +19,10 @@ - - - - + + + + @@ -90,8 +90,8 @@ - - + + @@ -184,10 +184,10 @@ - - - - + + + + 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 d95d021836..945c39e78e 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -1435,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/common.props b/common.props index 2b274e5d75..15fafa9120 100644 --- a/common.props +++ b/common.props @@ -1,8 +1,8 @@ latest - 10.2.0-preview - 5.2.0-preview + 10.3.0-preview + 5.3.0-preview $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ 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 index 0e502dd8d7..634657310f 100644 Binary files a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/dotnet-conf-china-2025.png 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/my-passkey.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/my-passkey.png index 31a3b6e362..5137a43633 100644 Binary files a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/my-passkey.png 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 index b1114e4c50..676f06a491 100644 Binary files a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-login.png 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 index a009b746cf..4fd070dbe5 100644 Binary files a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-registration.png 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 index 3c42236f8b..1d017e5f06 100644 Binary files a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/passkey-setting.png 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 index 34ec453cbe..9faefc859d 100644 Binary files a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/password-history-settings.png 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 index 13a5a64753..78cbe8c20f 100644 Binary files a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/password-history-warning.png 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/reset-password-error-modal.png b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/reset-password-error-modal.png index 13a5a64753..78cbe8c20f 100644 Binary files a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/reset-password-error-modal.png 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 index 595d3b12eb..680a840420 100644 Binary files a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/set-password-error-modal.png 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 index 7025b92cce..2174f17746 100644 Binary files a/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/studio-switch-to-preview.png and b/docs/en/Blog-Posts/2026-01-08 v10_1_Preview/studio-switch-to-preview.png differ diff --git a/docs/en/Blog-Posts/2026-02-23 v10_1_Release_Stable/POST.md b/docs/en/Blog-Posts/2026-02-23 v10_1_Release_Stable/POST.md new file mode 100644 index 0000000000..9b3da381f4 --- /dev/null +++ b/docs/en/Blog-Posts/2026-02-23 v10_1_Release_Stable/POST.md @@ -0,0 +1,82 @@ +# ABP.IO Platform 10.1 Final Has Been Released! + +We are glad to announce that [ABP](https://abp.io/) 10.1 stable version has been released. + +## What's New With Version 10.1? + +All the new features were explained in detail in the [10.1 RC Announcement Post](https://abp.io/community/announcements/announcing-abp-10-1-release-candidate-cyqui19d), so there is no need to review them again. You can check it out for more details. + +## Getting Started with 10.1 + +### How to Upgrade an Existing Solution + +You can upgrade your existing solutions with either ABP Studio or ABP CLI. In the following sections, both approaches are explained: + +### Upgrading via ABP Studio + +If you are already using the ABP Studio, you can upgrade it to the latest version. ABP Studio periodically checks for updates in the background, and when a new version of ABP Studio is available, you will be notified through a modal. Then, you can update it by confirming the opened modal. See [the documentation](https://abp.io/docs/latest/studio/installation#upgrading) for more info. + +After upgrading the ABP Studio, then you can open your solution in the application, and simply click the **Upgrade ABP Packages** action button to instantly upgrade your solution: + +![](upgrade-abp-packages.png) + +### Upgrading via ABP CLI + +Alternatively, you can upgrade your existing solution via ABP CLI. First, you need to install the ABP CLI or upgrade it to the latest version. + +If you haven't installed it yet, you can run the following command: + +```bash +dotnet tool install -g Volo.Abp.Studio.Cli +``` + +Or to update the existing CLI, you can run the following command: + +```bash +dotnet tool update -g Volo.Abp.Studio.Cli +``` + +After installing/updating the ABP CLI, you can use the [`update` command](https://abp.io/docs/latest/CLI#update) to update all the ABP related NuGet and NPM packages in your solution as follows: + +```bash +abp update +``` + +You can run this command in the root folder of your solution to update all ABP related packages. + +## Migration Guides + +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 versions: [ABP Version 10.1 Migration Guide](https://abp.io/docs/latest/release-info/migration-guides/abp-10-1) + +## Community News + +### New ABP Community Articles + +As always, exciting articles have been contributed by the ABP community. I will highlight some of them here: + +* [Enis Necipoğlu](https://abp.io/community/members/enisn): + * [ABP Framework's Hidden Magic: Things That Just Work Without You Knowing](https://abp.io/community/articles/hidden-magic-things-that-just-work-without-you-knowing-vw6osmyt) + * [Implementing Multiple Global Query Filters with Entity Framework Core](https://abp.io/community/articles/implementing-multiple-global-query-filters-with-entity-ugnsmf6i) +* [Suhaib Mousa](https://abp.io/community/members/suhaib-mousa): + * [.NET 11 Preview 1 Highlights: Faster Runtime, Smarter JIT, and AI-Ready Improvements](https://abp.io/community/articles/dotnet-11-preview-1-highlights-hspp3o5x) + * [TOON vs JSON for LLM Prompts in ABP: Token-Efficient Structured Context](https://abp.io/community/articles/toon-vs-json-b4rn2avd) +* [Fahri Gedik](https://abp.io/community/members/fahrigedik): + * [Building a Multi-Agent AI System with A2A, MCP, and ADK in .NET](https://abp.io/community/articles/building-a-multiagent-ai-system-with-a2a-mcp-iefdehyx) + * [Async Chain of Persistence Pattern: Designing for Failure in Event-Driven Systems](https://abp.io/community/articles/async-chain-of-persistence-pattern-wzjuy4gl) +* [Alper Ebiçoğlu](https://abp.io/community/members/alper): + * [NDC London 2026: From a Developer's Perspective and My Personal Notes about AI](https://abp.io/community/articles/ndc-london-2026-a-.net-conf-from-a-developers-perspective-07wp50yl) + * [Which Open-Source PDF Libraries Are Recently Popular? A Data-Driven Look At PDF Topic](https://abp.io/community/articles/which-opensource-pdf-libraries-are-recently-popular-a-g68q78it) +* [Engincan Veske](https://abp.io/community/members/EngincanV): + * [Stop Spam and Toxic Users in Your App with AI](https://abp.io/community/articles/stop-spam-and-toxic-users-in-your-app-with-ai-3i0xxh0y) +* [Liming Ma](https://abp.io/community/members/maliming): + * [How AI Is Changing Developers](https://abp.io/community/articles/how-ai-is-changing-developers-e8y4a85f) +* [Tarık Özdemir](https://abp.io/community/members/mtozdemir): + * [JetBrains State of Developer Ecosystem Report 2025 — Key Insights](https://abp.io/community/articles/jetbrains-state-of-developer-ecosystem-report-2025-key-z0638q5e) +* [Adnan Ali](https://abp.io/community/members/adnanaldaim): + * [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) + +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. + +## About the Next Version + +The next feature version will be 10.2. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problems with this version. diff --git a/docs/en/Blog-Posts/2026-02-23 v10_1_Release_Stable/cover-image.png b/docs/en/Blog-Posts/2026-02-23 v10_1_Release_Stable/cover-image.png new file mode 100644 index 0000000000..3e2e01b18c Binary files /dev/null and b/docs/en/Blog-Posts/2026-02-23 v10_1_Release_Stable/cover-image.png differ diff --git a/docs/en/Blog-Posts/2026-02-23 v10_1_Release_Stable/upgrade-abp-packages.png b/docs/en/Blog-Posts/2026-02-23 v10_1_Release_Stable/upgrade-abp-packages.png new file mode 100644 index 0000000000..4ec1d19589 Binary files /dev/null and b/docs/en/Blog-Posts/2026-02-23 v10_1_Release_Stable/upgrade-abp-packages.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-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-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 index ec5e423330..960ad2ec66 100644 --- 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 @@ -1,54 +1,67 @@ -# What NDC London 2026 Looked Like From a Developer’s Perspective +![Cover](0.png) -![](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 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/). I guess this is the best conf for .NET developers around the world (thanks to the NDC team). It was 3 full days started from 28 to 30 January 2026. As 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. -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) -![1](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 developed your skills, you can play with it 🌊 and it's called surfing or you'll die in the 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 news for me! +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 :) -![2](2.png) +![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 made some more networking. +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) + +--- -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 about these. ## Sessions / Talks -### The dangers of probably-working software | Damian Brady +### The Dangers of Probably-Working Software | Damian Brady -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 we don't review well-enough, we're sleepwalkers. And that's correct! and good analogy for that case. This talk centers on a powerful lesson: *“**Don’t ship code you don’t truly understand.**”* +![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. -#### What I learnt from this session +#### Notes From This Session - “It seems to work” is not the same as “I understand it.” -- Code copied from Wikipedia or StackOverflow is inherently risky in production. -- Passing tests on small datasets does not guarantee real-world reliability. +- 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?**” -![3](3.png) - -### Playing the long game | Sheena O'Connell - -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 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. +--- -![4](4.png) +### 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. @@ -56,55 +69,76 @@ AI is creating new roles (like AI security, observability, and operations) and n 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. -![4_1](4_1.png) - - +![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. -![4_2](4_2.png) +![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. -![5](5.png) +--- ### 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** +#### **Notes from the Talk** -- A monolith is not inherently bad; a tangled monolith is. +- 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 (a modern reading of Conway’s Law). +- 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**. -## **Lessons for Developers** +#### **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. -- Optimize for **cognitive load**, not deployment topology. - If your team structure is messy, your architecture will be messy — fix people, not tech. --- ### AI Coding Agents & Skills | Steve Sanderson -![steve-sanderson-talk](D:\github\volosoft\abp\docs\en\Community-Articles\2026-02-03-Impressions-of-NDC-London-2026\steve-sanderson-talk.png) +**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! -In this session, Steve started how Microsoft is excessively using AI tools for PRs, reproducing bug reports etc... He says, we use brains and hands less then anytime. 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 ideas for each of these headings: +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** +#### **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. @@ -112,109 +146,148 @@ In this session, Steve started how Microsoft is excessively using AI tools for P - Reduces hallucination by narrowing context per agent. - Easier to debug: you can inspect each agent’s output separately. + ------ -## **2. Plan Mode** +#### **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. -- Helps align expectations between you and the AI. +- 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** +#### **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 monolithic skill. +- 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** +#### **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** -- Don’t micromanage — delegate well-defined tasks. -- Give clear inputs, constraints, and success criteria. -- Let the AI own the implementation details. -- Review outcomes instead of every intermediate step. -- Use delegation for repetitive or mechanical work. +https://awesomeclaude.ai/ralph-wiggum + +> Who knows how much tokens it uses :) + +![image-20260206010621010](steve-sanderson-talk_5.png) ------ -## **5. Memories** +#### **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. -- Long-term memory should capture decisions, not chat noise. -- Store *why* something was done, not every detail of *how*. -- Keep memory sparse and structured. - Treat memory like documentation that evolves over time. -- Be careful about leaking sensitive data into persistent memory. + +- Copilot Memory is **turned off by default** + +- https://docs.github.com/en/copilot/how-tos/use-copilot-agents/copilot-memory + + ------ -## **6. Hooks** +#### **6. Hooks** -- Hooks connect AI actions to your real workflow. +> 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. -- Best hooks are lightweight and predictable. +- https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/use-hooks ------ -## **7. MCP (Model Context Protocol)** +#### **7. MCP** + +- Talk to external tools. -- Standard way for models to talk to external tools. - Enables safe, controlled access to systems (files, APIs, databases). + - Prevents random tool usage; everything is explicit. -- Encourages ecosystem of interoperable tools. -- Critical for production-grade AI assistants. + + ------ -## **8. Infinite Sessions** +#### **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. -- Works best when combined with structured memory. -- Still requires periodic cleanup to avoid context bloat. +- 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** +#### **9. Plugins** + +![Plugins](steve-sanderson-talk_12.png) - Extend AI capabilities beyond core model features. -- Plugins should solve real workflow problems, not demos. -- Prefer composable plugins over custom hacks. -- Security matters — don’t give plugins unlimited access. -- Treat plugins like dependencies: review and maintain them. +- https://github.com/marketplace?type=apps&copilot_app=true ------ -## **10. Git Workflow** +#### **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: -**Lessons for Developers from Steve's Talk** +![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. -- A skill is fundamentally a structured Markdown file + metadata + optional scripts/tools. -- Load **descriptions first, details later** — this keeps LLM context small and reliable. - 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. -- Prefer small, composable skills over one “god skill.” - Skills reduce hallucination risk by constraining what the agent is allowed to do. --- @@ -223,7 +296,7 @@ In this session, Steve started how Microsoft is excessively using AI tools for P - This is your code tech stack for a basic .NET project: - - Assembly > MSIL > C# > ASP.NET Core > NuGet + NPM > Your Handmade Business Code + - 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. @@ -231,9 +304,22 @@ In this session, Steve started how Microsoft is excessively using AI tools for P - 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/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_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/docs-nav.json b/docs/en/docs-nav.json index fb94db85b2..94e3be6739 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -340,6 +340,10 @@ "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" @@ -697,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" @@ -1619,6 +1627,10 @@ "text": "Localization", "path": "framework/ui/angular/localization.md" }, + { + "text": "Hybrid Localization", + "path": "framework/ui/angular/hybrid-localization.md" + }, { "text": "Form Validation", "path": "framework/ui/angular/form-validation.md" @@ -1973,6 +1985,44 @@ } ] }, + { + "text": "Low-Code System", + "items": [ + { + "text": "Overview", + "path": "low-code", + "isIndex": true + }, + { + "text": "Attributes & Fluent API", + "path": "low-code/fluent-api.md" + }, + { + "text": "model.json Structure", + "path": "low-code/model-json.md" + }, + { + "text": "Reference Entities", + "path": "low-code/reference-entities.md" + }, + { + "text": "Interceptors", + "path": "low-code/interceptors.md" + }, + { + "text": "Scripting API", + "path": "low-code/scripting-api.md" + }, + { + "text": "Custom Endpoints", + "path": "low-code/custom-endpoints.md" + }, + { + "text": "Foreign Access", + "path": "low-code/foreign-access.md" + } + ] + }, { "text": "Solution Templates", "items": [ 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/tickerq.md b/docs/en/framework/infrastructure/background-jobs/tickerq.md index 013a8fde74..de7b3631f2 100644 --- a/docs/en/framework/infrastructure/background-jobs/tickerq.md +++ b/docs/en/framework/infrastructure/background-jobs/tickerq.md @@ -38,16 +38,19 @@ public override void ConfigureServices(ServiceConfigurationContext context) ### UseAbpTickerQ -You need to call the `UseAbpTickerQ` extension method instead of `AddTickerQ` in the `OnApplicationInitialization` method of your module: +You need to call the `UseAbpTickerQ` extension method in the `OnApplicationInitialization` method of your module: ```csharp -// (default: TickerQStartMode.Immediate) -app.UseAbpTickerQ(startMode: ...); +public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context) +{ + // (default: TickerQStartMode.Immediate) + context.GetHost().UseAbpTickerQ(qStartMode: ...); +} ``` ### AbpBackgroundJobsTickerQOptions -You can configure the `TimeTicker` properties for specific jobs. For example, you can change `Priority`, `Retries` and `RetryIntervals` properties as shown below: +You can configure the `TimeTickerEntity` properties for specific jobs. For example, you can change `Priority`, `Retries` and `RetryIntervals` properties as shown below: ```csharp Configure(options => @@ -56,11 +59,10 @@ Configure(options => { Retries = 3, RetryIntervals = new[] {30, 60, 120}, // Retry after 30s, 60s, then 2min - Priority = TickerTaskPriority.High + Priority = TickerTaskPriority.High, - // Optional batching - //BatchParent = Guid.Parse("...."), - //BatchRunCondition = BatchRunCondition.OnSuccess + // Optional: run condition for chained jobs + //RunCondition = RunCondition.OnSuccess }); options.AddJobConfiguration(new AbpBackgroundJobsTimeTickerConfiguration() @@ -74,7 +76,7 @@ Configure(options => ### Add your own TickerQ Background Jobs Definitions -ABP will handle the TickerQ job definitions by `AbpTickerQFunctionProvider` service. You shouldn't use `TickerFunction` to add your own job definitions. You can inject and use the `AbpTickerQFunctionProvider` to add your own definitions and use `ITimeTickerManager` or `ICronTickerManager` to manage the jobs. +ABP will handle the TickerQ job definitions by `AbpTickerQFunctionProvider` service. You shouldn't use `TickerFunction` to add your own job definitions. You can inject and use the `AbpTickerQFunctionProvider` to add your own definitions and use `ITimeTickerManager` or `ICronTickerManager` to manage the jobs. For example, you can add a `CleanupJobs` job definition in the `OnPreApplicationInitializationAsync` method of your module: @@ -96,7 +98,7 @@ public override Task OnPreApplicationInitializationAsync(ApplicationInitializati abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) => { var service = new CleanupJobs(); // Or get it from the serviceProvider - var request = await TickerRequestProvider.GetRequestAsync(serviceProvider, tickerFunctionContext.Id, tickerFunctionContext.Type); + var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); }))); @@ -105,11 +107,11 @@ public override Task OnPreApplicationInitializationAsync(ApplicationInitializati } ``` -And then you can add a job by using the `ITimeTickerManager`: +And then you can add a job by using the `ITimeTickerManager`: ```csharp -var timeTickerManager = context.ServiceProvider.GetRequiredService>(); -await timeTickerManager.AddAsync(new TimeTicker +var timeTickerManager = context.ServiceProvider.GetRequiredService>(); +await timeTickerManager.AddAsync(new TimeTickerEntity { Function = nameof(CleanupJobs), ExecutionTime = DateTime.UtcNow.AddSeconds(5), diff --git a/docs/en/framework/infrastructure/background-workers/tickerq.md b/docs/en/framework/infrastructure/background-workers/tickerq.md index 840b5137cb..d4ddde3cd9 100644 --- a/docs/en/framework/infrastructure/background-workers/tickerq.md +++ b/docs/en/framework/infrastructure/background-workers/tickerq.md @@ -36,11 +36,14 @@ public override void ConfigureServices(ServiceConfigurationContext context) ### UseAbpTickerQ -You need to call the `UseAbpTickerQ` extension method instead of `AddTickerQ` in the `OnApplicationInitialization` method of your module: +You need to call the `UseAbpTickerQ` extension method in the `OnApplicationInitialization` method of your module: ```csharp -// (default: TickerQStartMode.Immediate) -app.UseAbpTickerQ(startMode: ...); +public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context) +{ + // (default: TickerQStartMode.Immediate) + context.GetHost().UseAbpTickerQ(qStartMode: ...); +} ``` ### AbpBackgroundWorkersTickerQOptions @@ -61,7 +64,7 @@ Configure(options => ### Add your own TickerQ Background Worker Definitions -ABP will handle the TickerQ job definitions by `AbpTickerQFunctionProvider` service. You shouldn't use `TickerFunction` to add your own job definitions. You can inject and use the `AbpTickerQFunctionProvider` to add your own definitions and use `ITimeTickerManager` or `ICronTickerManager` to manage the jobs. +ABP will handle the TickerQ job definitions by `AbpTickerQFunctionProvider` service. You shouldn't use `TickerFunction` to add your own job definitions. You can inject and use the `AbpTickerQFunctionProvider` to add your own definitions and use `ITimeTickerManager` or `ICronTickerManager` to manage the jobs. For example, you can add a `CleanupJobs` job definition in the `OnPreApplicationInitializationAsync` method of your module: @@ -83,7 +86,7 @@ public override Task OnPreApplicationInitializationAsync(ApplicationInitializati abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) => { var service = new CleanupJobs(); // Or get it from the serviceProvider - var request = await TickerRequestProvider.GetRequestAsync(serviceProvider, tickerFunctionContext.Id, tickerFunctionContext.Type); + var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); }))); @@ -92,11 +95,11 @@ public override Task OnPreApplicationInitializationAsync(ApplicationInitializati } ``` -And then you can add a job by using the `ICronTickerManager`: +And then you can add a job by using the `ICronTickerManager`: ```csharp -var cronTickerManager = context.ServiceProvider.GetRequiredService>(); -await cronTickerManager.AddAsync(new CronTicker +var cronTickerManager = context.ServiceProvider.GetRequiredService>(); +await cronTickerManager.AddAsync(new CronTickerEntity { Function = nameof(CleanupJobs), Expression = "0 */6 * * *", // Every 6 hours @@ -106,13 +109,13 @@ await cronTickerManager.AddAsync(new CronTicker }); ``` -You can specify a cron expression instead of use `ICronTickerManager` to add a worker: +You can specify a cron expression instead of using `ICronTickerManager` to add a worker: ```csharp abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) => { var service = new CleanupJobs(); - var request = await TickerRequestProvider.GetRequestAsync(serviceProvider, tickerFunctionContext.Id, tickerFunctionContext.Type); + var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); }))); 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/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/hybrid-localization.md b/docs/en/framework/ui/angular/hybrid-localization.md new file mode 100644 index 0000000000..f71025237c --- /dev/null +++ b/docs/en/framework/ui/angular/hybrid-localization.md @@ -0,0 +1,162 @@ +```json +//[doc-seo] +{ + "Description": "Combine backend and UI localizations in Angular: use JSON files to override or extend server-sidtexts with the same key format and abpLocalization pipe." +} +``` + +# Hybrid Localization + +Hybrid localization lets you combine **backend localizations** (from the ABP server) with **UI localizations** (JSON files in your Angular app). UI values take priority over backend values for the same key, so you can override or extend server-side texts without changing the backend. + +## How It Works + +- **Backend localizations**: Loaded from the server (e.g. `ApplicationLocalizationResourceDto`). Keys use the format `ResourceName::Key`. +- **UI localizations**: Loaded from static JSON files under your app's assets (e.g. `/assets/localization/en.json`). The same key format `ResourceName::Key` is used. +- **Priority**: When a key exists in both backend and UI, the **UI value is used** (UI overrides backend). + +The existing `abpLocalization` pipe and localization APIs work unchanged; they resolve keys from the merged set (backend + UI), with UI winning on conflicts. + +## Configuration + +Enable hybrid localization in your app config via `provideAbpCore` and `withOptions`: + +```typescript +// app.config.ts +import { provideAbpCore, withOptions } from "@abp/ng.core"; + +export const appConfig: ApplicationConfig = { + providers: [ + provideAbpCore( + withOptions({ + // ...other options + uiLocalization: { + enabled: true, + basePath: "/assets/localization", // optional; default is '/assets/localization' + }, + }), + ), + // ... + ], +}; +``` + +| Option | Description | Default | +| ---------- | ---------------------------------------------------------------------------- | ------------------------ | +| `enabled` | Turn on UI localization loading from `{basePath}/{culture}.json`. | — | +| `basePath` | Base path for JSON files. Files are loaded from `{basePath}/{culture}.json`. | `'/assets/localization'` | + +When `enabled` is `true`, the app loads a JSON file for the current language (e.g. `en`, `tr`) whenever the user changes language. Loaded data is merged with backend localizations (UI overrides backend for the same key). + +## UI Localization File Format + +Place one JSON file per culture under your `basePath`. File name must be `{culture}.json` (e.g. `en.json`, `tr.json`). + +Structure: **resource name → key → value**. + +```json +{ + "MyProjectName": { + "Welcome": "Welcome from UI (en.json)", + "CustomKey": "This is a UI-only localization", + "TestMessage": "UI localization is working!" + }, + "AbpAccount": { + "Login": "Sign In (UI Override)" + } +} +``` + +- Top-level keys are **resource names** (e.g. `MyProjectName`, `AbpAccount`). +- Nested keys are **localization keys**; values are the display strings for that culture. + +In templates you keep using the same key format: `ResourceName::Key`. + +## Using in Templates + +Use the `abpLocalization` pipe as usual. Keys can come from backend only, UI only, or both (UI wins): + +```html + +

{%{{ 'MyProjectName::Welcome' | abpLocalization }}%}

+ + +

{%{{ 'MyProjectName::CustomKey' | abpLocalization }}%}

+ + +

{%{{ 'AbpAccount::Login' | abpLocalization }}%}

+``` + +No template changes are needed; only the configuration and the JSON files. + +## UILocalizationService + +The `UILocalizationService` (`@abp/ng.core`) manages UI localizations and merges them with backend data. + +### Get loaded UI data + +To inspect what was loaded from the UI JSON files (e.g. for debugging or display): + +```typescript +import { UILocalizationService, SessionStateService } from "@abp/ng.core"; + +export class MyComponent { + private uiLocalizationService = inject(UILocalizationService); + private sessionState = inject(SessionStateService); + + currentLanguage$ = this.sessionState.getLanguage$(); + + ngOnInit() { + // All loaded UI resources for current language + const loaded = this.uiLocalizationService.getLoadedLocalizations(); + // Or for a specific culture + const loadedEn = this.uiLocalizationService.getLoadedLocalizations("en"); + } +} +``` + +`getLoadedLocalizations(culture?: string)` returns an object of the form `{ [resourceName: string]: Record }` for the given culture (or current language if omitted). + +### Add translations at runtime + +You can also add or merge UI translations programmatically (e.g. from another source or lazy-loaded module): + +```typescript +this.uiLocalizationService.addAngularLocalizeLocalization( + 'en', // culture + 'MyProjectName', // resource name + { MyKey: 'My value' }, // key-value map +); +``` + +This merges into the existing UI localizations and is taken into account by the `abpLocalization` pipe with the same UI-over-backend priority. + +## Example: Dev App + +The ABP dev app demonstrates hybrid localization: + +1. **Config** (`app.config.ts`): + +```typescript +uiLocalization: { + enabled: true, + basePath: '/assets/localization', +}, +``` + +2. **Files**: `src/assets/localization/en.json` and `src/assets/localization/tr.json` with the structure shown above. + +3. **Component** (`localization-test.component.ts`): Uses `abpLocalization` for backend keys, UI-only keys, and overrides; and uses `UILocalizationService.getLoadedLocalizations()` to show loaded UI data. + +See `apps/dev-app/src/app/localization-test/localization-test.component.ts` and `apps/dev-app/src/assets/localization/*.json` in the repository for the full example. + +## Summary + +| Topic | Description | +|------------------|-------------| +| **Purpose** | Combine backend and UI localizations; UI overrides backend for the same key. | +| **Config** | `provideAbpCore(withOptions({ uiLocalization: { enabled: true, basePath?: string } }))`. | +| **File location**| `{basePath}/{culture}.json` (e.g. `/assets/localization/en.json`). | +| **JSON format** | `{ "ResourceName": { "Key": "Value", ... }, ... }`. | +| **Template usage** | Same as before: `{%{{ 'ResourceName::Key' \| abpLocalization }}%}`. | +| **API** | `UILocalizationService`: `getLoadedLocalizations(culture?)`, `addAngularLocalizeLocalization(culture, resourceName, translations)`. | 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/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/low-code/custom-endpoints.md b/docs/en/low-code/custom-endpoints.md new file mode 100644 index 0000000000..ad0057df70 --- /dev/null +++ b/docs/en/low-code/custom-endpoints.md @@ -0,0 +1,149 @@ +```json +//[doc-seo] +{ + "Description": "Define custom REST API endpoints with JavaScript handlers in the ABP Low-Code System. Create dynamic APIs without writing C# controllers." +} +``` + +# Custom Endpoints + +Custom Endpoints allow you to define REST API routes with server-side JavaScript handlers directly in `model.json`. Each endpoint is registered as an ASP.NET Core endpoint at startup and supports hot-reload when the model changes. + +## Defining Endpoints + +Add endpoints to the `endpoints` array in `model.json`: + +```json +{ + "endpoints": [ + { + "name": "GetProductStats", + "route": "/api/custom/products/stats", + "method": "GET", + "description": "Get product statistics", + "requireAuthentication": false, + "javascript": "var count = await db.count('LowCodeDemo.Products.Product');\nreturn ok({ totalProducts: count });" + } + ] +} +``` + +### Endpoint Descriptor + +| Field | Type | Default | Description | +|-------|------|---------|-------------| +| `name` | string | **Required** | Unique endpoint name | +| `route` | string | **Required** | URL route pattern (supports `{parameters}`) | +| `method` | string | `"GET"` | HTTP method: `GET`, `POST`, `PUT`, `DELETE` | +| `javascript` | string | **Required** | JavaScript handler code | +| `description` | string | null | Description for documentation | +| `requireAuthentication` | bool | `true` | Require authenticated user | +| `requiredPermissions` | string[] | null | Required permission names | + +## Route Parameters + +Use `{paramName}` syntax in the route. Access values via the `route` object: + +```json +{ + "name": "GetProductById", + "route": "/api/custom/products/{id}", + "method": "GET", + "javascript": "var product = await db.get('LowCodeDemo.Products.Product', route.id);\nif (!product) { return notFound('Product not found'); }\nreturn ok({ id: product.Id, name: product.Name, price: product.Price });" +} +``` + +## JavaScript Context + +Inside custom endpoint scripts, you have access to: + +### Request Context + +| Variable | Description | +|----------|-------------| +| `request` | Full request object | +| `route` | Route parameter values (e.g., `route.id`) | +| `params` | Alias for route parameters | +| `query` | Query string parameters (e.g., `query.q`, `query.page`) | +| `body` | Request body (for POST/PUT) | +| `headers` | Request headers | +| `user` | Current user (same as `context.currentUser` in [Interceptors](interceptors.md)) | +| `email` | Email sender (same as `context.emailSender` in [Interceptors](interceptors.md)) | + +### Response Helpers + +| Function | HTTP Status | Description | +|----------|-------------|-------------| +| `ok(data)` | 200 | Success response with data | +| `created(data)` | 201 | Created response with data | +| `noContent()` | 204 | No content response | +| `badRequest(message)` | 400 | Bad request response | +| `unauthorized(message)` | 401 | Unauthorized response | +| `forbidden(message)` | 403 | Forbidden response | +| `notFound(message)` | 404 | Not found response | +| `error(message)` | 500 | Internal server error response | +| `response(statusCode, data, error)` | Custom | Custom status code response | + +### Logging + +| Function | Description | +|----------|-------------| +| `log(message)` | Log an informational message | +| `logWarning(message)` | Log a warning message | +| `logError(message)` | Log an error message | + +### Database API + +The full [Scripting API](scripting-api.md) (`db` object) is available for querying and mutating data. + +## Examples + +### Get Statistics + +```json +{ + "name": "GetProductStats", + "route": "/api/custom/products/stats", + "method": "GET", + "requireAuthentication": false, + "javascript": "var totalCount = await db.count('LowCodeDemo.Products.Product');\nvar avgPrice = totalCount > 0 ? await db.query('LowCodeDemo.Products.Product').average(p => p.Price) : 0;\nreturn ok({ totalProducts: totalCount, averagePrice: avgPrice });" +} +``` + +### Search with Query Parameters + +```json +{ + "name": "SearchCustomers", + "route": "/api/custom/customers/search", + "method": "GET", + "requireAuthentication": true, + "javascript": "var searchTerm = query.q || '';\nvar customers = await db.query('LowCodeDemo.Customers.Customer')\n .where(c => c.Name.toLowerCase().includes(searchTerm.toLowerCase()))\n .take(10)\n .toList();\nreturn ok(customers.map(c => ({ id: c.Id, name: c.Name, email: c.EmailAddress })));" +} +``` + +### Dashboard Summary + +```json +{ + "name": "GetDashboardSummary", + "route": "/api/custom/dashboard", + "method": "GET", + "requireAuthentication": true, + "javascript": "var productCount = await db.count('LowCodeDemo.Products.Product');\nvar customerCount = await db.count('LowCodeDemo.Customers.Customer');\nvar orderCount = await db.count('LowCodeDemo.Orders.Order');\nreturn ok({ products: productCount, customers: customerCount, orders: orderCount, user: user.isAuthenticated ? user.userName : 'Anonymous' });" +} +``` + +## Authentication and Authorization + +| Setting | Behavior | +|---------|----------| +| `requireAuthentication: false` | Endpoint is publicly accessible | +| `requireAuthentication: true` | User must be authenticated | +| `requiredPermissions: ["MyApp.Products"]` | User must have the specified permissions | + +## See Also + +* [Scripting API](scripting-api.md) +* [Interceptors](interceptors.md) +* [model.json Structure](model-json.md) diff --git a/docs/en/low-code/fluent-api.md b/docs/en/low-code/fluent-api.md new file mode 100644 index 0000000000..5aa38fe66a --- /dev/null +++ b/docs/en/low-code/fluent-api.md @@ -0,0 +1,572 @@ +```json +//[doc-seo] +{ + "Description": "Define dynamic entities using C# attributes and configure them with the Fluent API in the ABP Low-Code System. The primary way to build auto-generated admin panels." +} +``` + +# Attributes & Fluent API + +C# Attributes and the Fluent API are the **recommended way** to define dynamic entities. They provide compile-time checking, IntelliSense, refactoring support, and keep your entity definitions close to your domain code. + +## Quick Start + +### Step 1: Define an Entity + +````csharp +[DynamicEntity] +[DynamicEntityUI(PageTitle = "Products")] +public class Product : DynamicEntityBase +{ + [DynamicPropertyUnique] + public string Name { get; set; } + + [DynamicPropertyUI(DisplayName = "Unit Price")] + public decimal Price { get; set; } + + public int StockCount { get; set; } + + public DateTime? ReleaseDate { get; set; } +} +```` + +### Step 2: Add Migration and Run + +```bash +dotnet ef migrations add Added_Product +dotnet ef database update +``` + +You now have a complete Product management page with data grid, create/edit modals, search, sorting, and pagination. + +### Step 3: Add Relationships + +````csharp +[DynamicEntity] +[DynamicEntityUI(PageTitle = "Orders")] +public class Order : DynamicEntityBase +{ + [DynamicForeignKey("MyApp.Customers.Customer", "Name", ForeignAccess.Edit)] + public Guid CustomerId { get; set; } + + public decimal TotalAmount { get; set; } + public bool IsDelivered { get; set; } +} + +[DynamicEntity(Parent = "MyApp.Orders.Order")] +public class OrderLine : DynamicEntityBase +{ + [DynamicForeignKey("MyApp.Products.Product", "Name")] + public Guid ProductId { get; set; } + + public int Quantity { get; set; } + public decimal Amount { get; set; } +} +```` + +The `Order` page now has a foreign key dropdown for Customer, and `OrderLine` is managed as a nested child inside the Order detail modal. + +## Three-Layer Configuration System + +The Low-Code System uses a layered configuration model. From lowest to highest priority: + +1. **Code Layer** — C# classes with `[DynamicEntity]` and other attributes +2. **JSON Layer** — `model.json` file (see [model.json Structure](model-json.md)) +3. **Fluent Layer** — `AbpDynamicEntityConfig.EntityConfigurations` + +A `DefaultLayer` runs last to fill in any missing values with conventions. + +> When the same entity or property is configured in multiple layers, the higher-priority layer wins. + +## C# Attributes Reference + +### `[DynamicEntity]` + +Marks a class as a dynamic entity. The entity name is derived from the class namespace and name. + +````csharp +[DynamicEntity] +public class Product : DynamicEntityBase +{ + public string Name { get; set; } + public decimal Price { get; set; } +} +```` + +Use the `Parent` property for parent-child (master-detail) relationships: + +````csharp +[DynamicEntity(Parent = "MyApp.Orders.Order")] +public class OrderLine : DynamicEntityBase +{ + public Guid ProductId { get; set; } + public int Quantity { get; set; } +} +```` + +### `[DynamicEntityUI]` + +Configures entity-level UI. Entities with `PageTitle` get a menu item and a dedicated page: + +````csharp +[DynamicEntity] +[DynamicEntityUI(PageTitle = "Product Management")] +public class Product : DynamicEntityBase +{ + // ... +} +```` + +### `[DynamicForeignKey]` + +Defines a foreign key relationship on a `Guid` property: + +````csharp +[DynamicForeignKey("MyApp.Customers.Customer", "Name", ForeignAccess.Edit)] +public Guid CustomerId { get; set; } +```` + +| Parameter | Description | +|-----------|-------------| +| `entityName` | Full name of the target entity — can be a **dynamic entity** (e.g., `"MyApp.Customers.Customer"`) or a **[reference entity](reference-entities.md)** (e.g., `"Volo.Abp.Identity.IdentityUser"`) | +| `displayPropertyName` | Property to show in lookups | +| `access` | `ForeignAccess.None`, `ForeignAccess.View`, or `ForeignAccess.Edit` (see [Foreign Access](foreign-access.md)) | + +### `[DynamicPropertyUI]` + +Controls property visibility and behavior in the UI: + +````csharp +[DynamicPropertyUI( + DisplayName = "Registration Number", + IsAvailableOnListing = true, + IsAvailableOnDataTableFiltering = true, + CreationFormAvailability = EntityPropertyUIFormAvailability.Hidden, + EditingFormAvailability = EntityPropertyUIFormAvailability.NotAvailable, + QuickLookOrder = 100 +)] +public string RegistrationNumber { get; set; } +```` + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `DisplayName` | string | null | Custom label for the property | +| `IsAvailableOnListing` | bool | `true` | Show in data grid | +| `IsAvailableOnDataTableFiltering` | bool | `true` | Show in filter panel | +| `CreationFormAvailability` | enum | `Available` | Visibility on create form | +| `EditingFormAvailability` | enum | `Available` | Visibility on edit form | +| `QuickLookOrder` | int | `-2` | Order in quick-look panel | + +The quick-look panel shows a summary of the selected record: + +![Quick-look panel showing entity details](images/quick-look.png) + +### `[DynamicPropertyServerOnly]` + +Hides a property from API clients entirely. It is stored in the database but never returned to the client: + +````csharp +[DynamicPropertyServerOnly] +public string InternalNotes { get; set; } +```` + +### `[DynamicPropertySetByClients]` + +Controls whether clients can set this property value. Useful for computed or server-assigned fields: + +````csharp +[DynamicPropertySetByClients(false)] +public string RegistrationNumber { get; set; } +```` + +### `[DynamicPropertyUnique]` + +Marks a property as requiring unique values across all records: + +````csharp +[DynamicPropertyUnique] +public string ProductCode { get; set; } +```` + +### `[DynamicEntityCommandInterceptor]` + +Defines JavaScript interceptors on a class for CRUD lifecycle hooks: + +````csharp +[DynamicEntity] +[DynamicEntityCommandInterceptor( + "Create", + InterceptorType.Pre, + "if(!context.commandArgs.data['Name']) { globalError = 'Name is required!'; }" +)] +[DynamicEntityCommandInterceptor( + "Delete", + InterceptorType.Post, + "context.log('Deleted: ' + context.commandArgs.entityId);" +)] +public class Organization : DynamicEntityBase +{ + public string Name { get; set; } +} +```` + +> The `Name` parameter must be one of: `"Create"`, `"Update"`, or `"Delete"`. The `InterceptorType` can be `Pre`, `Post`, or `Replace`. When `Replace` is used, the default DB operation is skipped entirely and only the JavaScript handler runs. **`Replace-Create` must return the new entity's Id** (e.g. `return result.Id;` after `db.insert`). Multiple interceptors can be added to the same class (`AllowMultiple = true`). + +See [Interceptors](interceptors.md) for the full JavaScript context API. + +### `[DynamicEnum]` + +Marks an enum for use in dynamic entity properties: + +````csharp +[DynamicEnum] +public enum OrganizationType +{ + Corporate = 0, + Enterprise = 1, + Startup = 2, + Consulting = 3 +} +```` + +Reference in an entity: + +````csharp +[DynamicEntity] +[DynamicEntityUI(PageTitle = "Organizations")] +public class Organization : DynamicEntityBase +{ + public string Name { get; set; } + public OrganizationType OrganizationType { get; set; } +} +```` + +### Enum Localization + +Enum values can be localized using ABP's localization system. Add localization keys in the format `Enum:{EnumTypeName}.{ValueName}` to your localization JSON files: + +```json +{ + "culture": "en", + "texts": { + "Enum:OrganizationType.Corporate": "Corporate", + "Enum:OrganizationType.Enterprise": "Enterprise", + "Enum:OrganizationType.Startup": "Startup", + "Enum:OrganizationType.Consulting": "Consulting" + } +} +``` + +The Blazor UI automatically uses these localization keys for enum dropdowns and display values. If no localization key is found, the enum member name is used as-is. + +## Fluent API + +The Fluent API has the **highest priority** in the configuration system. Use `AbpDynamicEntityConfig.EntityConfigurations` to override any attribute or JSON setting programmatically. + +### Basic Usage + +Configure in your Low-Code Initializer (e.g. `MyAppLowCodeInitializer`): + +````csharp +public static class MyAppLowCodeInitializer +{ + private static readonly AsyncOneTimeRunner Runner = new(); + + public static async Task InitializeAsync() + { + await Runner.RunAsync(async () => + { + AbpDynamicEntityConfig.EntityConfigurations.Configure( + "MyApp.Products.Product", + entity => + { + entity.DefaultDisplayPropertyName = "Name"; + + var priceProperty = entity.AddOrGetProperty("Price"); + priceProperty.AsRequired(); + priceProperty.UI = new EntityPropertyUIDescriptor + { + DisplayName = "Unit Price", + CreationFormAvailability = EntityPropertyUIFormAvailability.Available + }; + + entity.AddOrGetProperty("InternalNotes").AsServerOnly(); + } + ); + + await DynamicModelManager.Instance.InitializeAsync(); + }); + } +} +```` + +You can also use the generic overload with a type parameter: + +````csharp +AbpDynamicEntityConfig.EntityConfigurations.Configure(entity => +{ + entity.DefaultDisplayPropertyName = "Name"; +}); +```` + +### Entity Configuration + +The `Configure` method provides an `EntityDescriptor` instance. You can set its properties directly: + +| Property / Method | Description | +|--------|-------------| +| `DefaultDisplayPropertyName` | Set the display property for lookups | +| `Parent` | Set parent entity name for nesting | +| `UI` | Set entity-level UI (`EntityUIDescriptor` with `PageTitle`) | +| `AddOrGetProperty(name)` | Get or create a property descriptor for configuration | +| `FindProperty(name)` | Find a property descriptor by name (returns `null` if not found) | +| `GetProperty(name)` | Get a property descriptor by name (throws if not found) | +| `Interceptors` | List of `CommandInterceptorDescriptor` — add interceptors directly | + +### Property Configuration + +`AddOrGetProperty` returns an `EntityPropertyDescriptor`. Configure it using direct property assignment and extension methods: + +| Property / Extension Method | Description | +|--------|-------------| +| `.AsRequired(bool)` | Mark as required (extension method, returns the descriptor for chaining) | +| `.AsServerOnly(bool)` | Hide from clients (extension method, returns the descriptor for chaining) | +| `.MapToDbField(bool)` | Control if property is stored in DB (extension method, returns the descriptor for chaining) | +| `.IsUnique` | Set to `true` to mark as unique | +| `.AllowSetByClients` | Set to `false` to prevent client writes | +| `.ForeignKey` | Set a `ForeignKeyDescriptor` to configure foreign key relationship | +| `.UI` | Set an `EntityPropertyUIDescriptor` to configure property UI | + +### Chaining Extension Methods + +The extension methods `AsRequired()`, `AsServerOnly()`, and `MapToDbField()` return the property descriptor, enabling fluent chaining: + +````csharp +entity.AddOrGetProperty("InternalNotes") + .AsServerOnly() + .AsRequired() + .MapToDbField(); +```` + +### Configuring Foreign Keys + +````csharp +AbpDynamicEntityConfig.EntityConfigurations.Configure( + "MyApp.Orders.Order", + entity => + { + var customerIdProperty = entity.AddOrGetProperty("CustomerId"); + customerIdProperty.ForeignKey = new ForeignKeyDescriptor + { + EntityName = "MyApp.Customers.Customer", + DisplayPropertyName = "Name", + Access = ForeignAccess.Edit + }; + } +); +```` + +### Adding Interceptors + +````csharp +entity.Interceptors.Add(new CommandInterceptorDescriptor("Create") +{ + Type = InterceptorType.Pre, + Javascript = "if(!context.commandArgs.data['Name']) { globalError = 'Name is required!'; }" +}); +```` + +## Assembly Registration + +Register assemblies containing `[DynamicEntity]` classes in your [Low-Code Initializer](index.md#1-create-a-low-code-initializer): + +````csharp +AbpDynamicEntityConfig.SourceAssemblies.Add( + new DynamicEntityAssemblyInfo( + typeof(MyDomainModule).Assembly, + rootNamespace: "MyApp", + projectRootPath: sourcePath // For model.json hot-reload + ) +); +```` + +| Parameter | Description | +|-----------|-------------| +| `assembly` | The assembly containing `[DynamicEntity]` classes and/or `model.json` | +| `rootNamespace` | Root namespace for the assembly (used for embedded resource lookup) | +| `projectRootPath` | Path to the Domain project source folder (enables `model.json` hot-reload in development) | + +You can also register entity types directly: + +````csharp +AbpDynamicEntityConfig.DynamicEntityTypes.Add(typeof(Product)); +AbpDynamicEntityConfig.DynamicEnumTypes.Add(typeof(OrganizationType)); +```` + +## Combining with model.json + +Attributes and model.json work together seamlessly. A common pattern: + +1. **Define core entities** with C# attributes (compile-time safety) +2. **Add additional entities** via model.json (no recompilation needed) +3. **Fine-tune configuration** with Fluent API (overrides everything) + +The three-layer system merges all definitions: + +``` +Fluent API (highest) > JSON (model.json) > Code (Attributes) > Defaults (lowest) +``` + +For example, if an attribute sets `[DynamicPropertyUnique]` and model.json sets `"isUnique": false`, the JSON value wins because JSON layer has higher priority than Code layer. + +## End-to-End Example + +A complete e-commerce-style entity setup: + +````csharp +// Enum +[DynamicEnum] +public enum OrderStatus +{ + Pending = 0, + Processing = 1, + Shipped = 2, + Delivered = 3 +} + +// Customer entity +[DynamicEntity] +[DynamicEntityUI(PageTitle = "Customers")] +public class Customer : DynamicEntityBase +{ + [DynamicPropertyUnique] + public string Name { get; set; } + + [DynamicPropertyUI(DisplayName = "Phone Number", QuickLookOrder = 100)] + public string Telephone { get; set; } + + [DynamicForeignKey("Volo.Abp.Identity.IdentityUser", "UserName")] + public Guid? UserId { get; set; } + + [DynamicPropertyServerOnly] + public string InternalNotes { get; set; } +} + +// Product entity +[DynamicEntity] +[DynamicEntityUI(PageTitle = "Products")] +public class Product : DynamicEntityBase +{ + [DynamicPropertyUnique] + public string Name { get; set; } + + public decimal Price { get; set; } + public int StockCount { get; set; } +} + +// Order entity with child OrderLine +[DynamicEntity] +[DynamicEntityUI(PageTitle = "Orders")] +[DynamicEntityCommandInterceptor( + "Update", + InterceptorType.Pre, + @"if(context.commandArgs.data['IsDelivered']) { + if(!context.currentUser.roles.includes('admin')) { + globalError = 'Only admins can mark as delivered!'; + } + }" +)] +public class Order : DynamicEntityBase +{ + [DynamicForeignKey("MyApp.Customers.Customer", "Name", ForeignAccess.Edit)] + public Guid CustomerId { get; set; } + + public decimal TotalAmount { get; set; } + public bool IsDelivered { get; set; } + public OrderStatus Status { get; set; } +} + +[DynamicEntity(Parent = "MyApp.Orders.Order")] +public class OrderLine : DynamicEntityBase +{ + [DynamicForeignKey("MyApp.Products.Product", "Name")] + public Guid ProductId { get; set; } + + public int Quantity { get; set; } + public decimal Amount { get; set; } +} +```` + +Register everything in your [Low-Code Initializer](index.md#1-create-a-low-code-initializer): + +````csharp +public static class MyAppLowCodeInitializer +{ + private static readonly AsyncOneTimeRunner Runner = new(); + + public static async Task InitializeAsync() + { + await Runner.RunAsync(async () => + { + // Reference existing ABP entities + AbpDynamicEntityConfig.ReferencedEntityList.Add("UserName"); + + // Register assembly + AbpDynamicEntityConfig.SourceAssemblies.Add( + new DynamicEntityAssemblyInfo(typeof(MyDomainModule).Assembly) + ); + + // Initialize + await DynamicModelManager.Instance.InitializeAsync(); + }); + } +} +```` + +Configure your DbContext to implement `IDbContextWithDynamicEntities`: + +````csharp +public class MyAppDbContext : AbpDbContext, IDbContextWithDynamicEntities +{ + // ... constructors and DbSets ... + + protected override void OnModelCreating(ModelBuilder builder) + { + builder.ConfigureDynamicEntities(); + base.OnModelCreating(builder); + } +} +```` + +Configure your DbContextFactory for EF Core CLI commands: + +````csharp +public class MyAppDbContextFactory : IDesignTimeDbContextFactory +{ + public MyAppDbContext CreateDbContext(string[] args) + { + var configuration = BuildConfiguration(); + + MyAppEfCoreEntityExtensionMappings.Configure(); + + // ----- Ensure Low-Code system is initialized before running migrations --- + LowCodeEfCoreTypeBuilderExtensions.Configure(); + AsyncHelper.RunSync(MyAppLowCodeInitializer.InitializeAsync); + // ------------------------------- + + var builder = new DbContextOptionsBuilder() + .UseSqlServer(configuration.GetConnectionString("Default")); + + return new MyAppDbContext(builder.Options); + } + + // ... BuildConfiguration method ... +} + +This gives you four auto-generated pages (Customers, Products, Orders with nested OrderLines), complete with permissions, menu items, foreign key lookups, and interceptor-based business rules. + +## See Also + +* [model.json Structure](model-json.md) +* [Reference Entities](reference-entities.md) +* [Interceptors](interceptors.md) diff --git a/docs/en/low-code/foreign-access.md b/docs/en/low-code/foreign-access.md new file mode 100644 index 0000000000..f7545dad05 --- /dev/null +++ b/docs/en/low-code/foreign-access.md @@ -0,0 +1,148 @@ +```json +//[doc-seo] +{ + "Description": "Control access to related entities through foreign key relationships using Foreign Access in the ABP Low-Code System." +} +``` + +# Foreign Access + +Foreign Access controls how related **dynamic entities** can be accessed through foreign key relationships. It determines whether users can view or manage related data directly from the **target entity's** UI. + +> **Important:** Foreign Access only works between **dynamic entities**. It does not apply to [reference entities](reference-entities.md) because they are read-only and don't have UI pages. + +## Access Levels + +The `ForeignAccess` enum defines three levels: + +| Level | Value | Description | +|-------|-------|-------------| +| `None` | 0 | No access from the target entity side. The relationship exists only for lookups. | +| `View` | 1 | Read-only access. Users can view related records from the target entity's action menu. | +| `Edit` | 2 | Full CRUD access. Users can create, update, and delete related records from the target entity's action menu. | + +## Configuring with Attributes + +Use the third parameter of `[DynamicForeignKey]`: + +````csharp +[DynamicEntity] +public class Order +{ + [DynamicForeignKey("MyApp.Customers.Customer", "Name", ForeignAccess.Edit)] + public Guid CustomerId { get; set; } +} +```` + +## Configuring with Fluent API + +````csharp +AbpDynamicEntityConfig.EntityConfigurations.Configure( + "MyApp.Orders.Order", + entity => + { + var customerIdProperty = entity.AddOrGetProperty("CustomerId"); + customerIdProperty.ForeignKey = new ForeignKeyDescriptor + { + EntityName = "MyApp.Customers.Customer", + DisplayPropertyName = "Name", + Access = ForeignAccess.Edit + }; + } +); +```` + +## Configuring in model.json + +Set the `access` field on a foreign key property: + +```json +{ + "name": "CustomerId", + "foreignKey": { + "entityName": "LowCodeDemo.Customers.Customer", + "displayPropertyName": "Name", + "access": "edit" + } +} +``` + +### Examples from the Demo Application + +**Edit access** — Orders can be managed from the Customer page: + +```json +{ + "name": "LowCodeDemo.Orders.Order", + "properties": [ + { + "name": "CustomerId", + "foreignKey": { + "entityName": "LowCodeDemo.Customers.Customer", + "access": "edit" + } + } + ] +} +``` + +**View access** — Visited countries are viewable from the Country page: + +```json +{ + "name": "LowCodeDemo.Customers.VisitedCountry", + "parent": "LowCodeDemo.Customers.Customer", + "properties": [ + { + "name": "CountryId", + "foreignKey": { + "entityName": "LowCodeDemo.Countries.Country", + "access": "view" + } + } + ] +} +``` + +## UI Behavior + +When foreign access is configured between two **dynamic entities**: + +![Actions menu showing foreign access items (Order, Visited Country, etc.)](images/actions-menu.png) + +### `ForeignAccess.View` + +An **action menu item** appears on the target entity's data grid row (e.g., a "Visited Countries" item on the Country row). Clicking it opens a read-only modal showing related records. + +### `ForeignAccess.Edit` + +An **action menu item** appears on the target entity's data grid row (e.g., an "Orders" item on the Customer row). Clicking it opens a fully functional CRUD modal where users can create, edit, and delete related records. + +![Foreign access modal with full CRUD capabilities](images/foreign-access-modal.png) + +### `ForeignAccess.None` + +No action menu item is added. The foreign key exists only for data integrity and lookup display. + +## Permission Control + +Foreign access actions respect the **entity permissions** of the source entity (the entity with the foreign key). For example, if a user does not have the `Delete` permission for `Order`, the delete button will not appear in the foreign access modal, even if the access level is `Edit`. + +## How It Works + +The `ForeignAccessRelation` class stores the relationship metadata: + +* **Source entity** — the dynamic entity with the foreign key (e.g., `Order`) +* **Target entity** — the dynamic entity being referenced (e.g., `Customer`) +* **Foreign key property** — the property name (e.g., `CustomerId`) +* **Access level** — `None`, `View`, or `Edit` + +The `DynamicEntityAppService` checks these relations when building entity actions and filtering data. + +> **Terminology:** In foreign access context, "target entity" refers to the entity whose UI shows the action menu (the entity being pointed to by the foreign key). This is different from "reference entity" which specifically means an existing C# entity registered for read-only access. + +## See Also + +* [model.json Structure](model-json.md) +* [Reference Entities](reference-entities.md) +* [Attributes & Fluent API](fluent-api.md) diff --git a/docs/en/low-code/images/actions-menu.png b/docs/en/low-code/images/actions-menu.png new file mode 100644 index 0000000000..b953394215 Binary files /dev/null and b/docs/en/low-code/images/actions-menu.png differ diff --git a/docs/en/low-code/images/create-modal.png b/docs/en/low-code/images/create-modal.png new file mode 100644 index 0000000000..ebc77debb5 Binary files /dev/null and b/docs/en/low-code/images/create-modal.png differ diff --git a/docs/en/low-code/images/data-grid.png b/docs/en/low-code/images/data-grid.png new file mode 100644 index 0000000000..2a97d9ca6f Binary files /dev/null and b/docs/en/low-code/images/data-grid.png differ diff --git a/docs/en/low-code/images/foreign-access-modal.png b/docs/en/low-code/images/foreign-access-modal.png new file mode 100644 index 0000000000..b7a9c3189e Binary files /dev/null and b/docs/en/low-code/images/foreign-access-modal.png differ diff --git a/docs/en/low-code/images/interceptor-error.png b/docs/en/low-code/images/interceptor-error.png new file mode 100644 index 0000000000..eb10fe6db0 Binary files /dev/null and b/docs/en/low-code/images/interceptor-error.png differ diff --git a/docs/en/low-code/images/menu-items.png b/docs/en/low-code/images/menu-items.png new file mode 100644 index 0000000000..d2fd84b009 Binary files /dev/null and b/docs/en/low-code/images/menu-items.png differ diff --git a/docs/en/low-code/images/quick-look.png b/docs/en/low-code/images/quick-look.png new file mode 100644 index 0000000000..51e93b73fa Binary files /dev/null and b/docs/en/low-code/images/quick-look.png differ diff --git a/docs/en/low-code/index.md b/docs/en/low-code/index.md new file mode 100644 index 0000000000..dd8b7298ec --- /dev/null +++ b/docs/en/low-code/index.md @@ -0,0 +1,365 @@ +```json +//[doc-seo] +{ + "Description": "ABP Low-Code System: Build admin panels with auto-generated CRUD UI, APIs, and permissions using C# attributes and Fluent API. No boilerplate code needed." +} +``` + +# Low-Code System + +> You must have an ABP Team or a higher license to use this module. + +The ABP Low-Code System allows you to define entities using C# attributes or Fluent API and automatically generates: + +* **Database tables** (via EF Core migrations) +* **CRUD REST APIs** (Get, GetList, Create, Update, Delete) +* **Permissions** (View, Create, Update, Delete per entity) +* **Menu items** (auto-added to the admin sidebar) +* **Full Blazor UI** (data grid, create/edit modals, filters, foreign key lookups) + +No need to write DTOs, application services, repositories, or UI pages manually. + +![Auto-generated menu items in the sidebar](images/menu-items.png) + +## Why Low-Code? + +Traditionally, adding a new entity with full CRUD functionality to an ABP application requires: + +* Entity class in Domain +* DbContext configuration in EF Core +* DTOs in Application.Contracts +* AppService in Application +* Controller in HttpApi +* Razor/Blazor pages in UI +* Permissions, menu items, localization + +**With Low-Code, a single C# class replaces all of the above:** + +````csharp +[DynamicEntity(DefaultDisplayPropertyName = "Name")] +[DynamicEntityUI(PageTitle = "Products")] +public class Product : DynamicEntityBase +{ + [DynamicPropertyUnique] + public string Name { get; set; } + + [DynamicPropertyUI(DisplayName = "Unit Price")] + public decimal Price { get; set; } + + public int StockCount { get; set; } + + [DynamicForeignKey("MyApp.Categories.Category", "Name")] + public Guid? CategoryId { get; set; } +} +```` + +Run `dotnet ef migrations add Added_Product` and start your application. You get a complete Product management page with search, filtering, sorting, pagination, create/edit forms, and foreign key dropdown — all auto-generated. + +![Auto-generated data grid with search, filters, and actions](images/data-grid.png) + +![Auto-generated create/edit modal with form fields and foreign key lookups](images/create-modal.png) + +## Getting Started + +### 1. Create a Low-Code Initializer + +Create a static initializer class in your Domain project's `_Dynamic` folder that registers your assembly and calls `DynamicModelManager.Instance.InitializeAsync()`: + +````csharp +using Volo.Abp.Identity; +using Volo.Abp.LowCode.Configuration; +using Volo.Abp.LowCode.Modeling; +using Volo.Abp.Threading; + +namespace MyApp._Dynamic; + +public static class MyAppLowCodeInitializer +{ + private static readonly AsyncOneTimeRunner Runner = new(); + + public static async Task InitializeAsync() + { + await Runner.RunAsync(async () => + { + // Register reference entities (optional — for linking to existing C# entities) + AbpDynamicEntityConfig.ReferencedEntityList.Add( + nameof(IdentityUser.UserName), + nameof(IdentityUser.Email) + ); + + // Register assemblies containing [DynamicEntity] classes and model.json + var sourcePath = ResolveDomainSourcePath(); + AbpDynamicEntityConfig.SourceAssemblies.Add( + new DynamicEntityAssemblyInfo( + typeof(MyAppDomainModule).Assembly, + rootNamespace: "MyApp", + projectRootPath: sourcePath // Required for model.json hot-reload in development + ) + ); + + // Fluent API configurations (optional — highest priority) + AbpDynamicEntityConfig.EntityConfigurations.Configure("MyApp.Products.Product", entity => + { + entity.AddOrGetProperty("InternalNotes").AsServerOnly(); + }); + + // Initialize the dynamic model manager + await DynamicModelManager.Instance.InitializeAsync(); + }); + } + + private static string ResolveDomainSourcePath() + { + // Traverse up from bin folder to find the Domain project source + var baseDir = AppContext.BaseDirectory; + var current = new DirectoryInfo(baseDir); + + for (int i = 0; i < 10 && current != null; i++) + { + var candidate = Path.Combine(current.FullName, "src", "MyApp.Domain"); + if (Directory.Exists(Path.Combine(candidate, "_Dynamic"))) + { + return candidate; + } + current = current.Parent; + } + + // Fallback for production (embedded resource will be used instead) + return string.Empty; + } +} +```` + +> The `projectRootPath` parameter enables hot-reload of `model.json` during development. When the path is empty or the file doesn't exist, the module falls back to reading `model.json` as an embedded resource. + +### 2. Call the Initializer in Program.cs + +The initializer must be called **before** the application starts. Add it to `Program.cs`: + +````csharp +public static async Task Main(string[] args) +{ + // Initialize Low-Code before building the application + await MyAppLowCodeInitializer.InitializeAsync(); + + var builder = WebApplication.CreateBuilder(args); + // ... rest of your startup code +} +```` + +> **Important:** The initializer must also be called in your `DbMigrator` project and any other entry points (AuthServer, HttpApi.Host, etc.) that use dynamic entities. This ensures EF Core migrations can discover the entity schema. + +### 3. Configure DbContext + +Call `ConfigureDynamicEntities()` in your `DbContext`: + +````csharp +protected override void OnModelCreating(ModelBuilder builder) +{ + builder.ConfigureDynamicEntities(); + base.OnModelCreating(builder); +} +```` + +### 3. Define Your First Entity + +````csharp +[DynamicEntity] +[DynamicEntityUI(PageTitle = "Customers")] +public class Customer : DynamicEntityBase +{ + public string Name { get; set; } + + [DynamicPropertyUI(DisplayName = "Phone Number")] + public string Telephone { get; set; } + + [DynamicForeignKey("Volo.Abp.Identity.IdentityUser", "UserName")] + public Guid? UserId { get; set; } +} +```` + +### 4. Add Migration and Run + +```bash +dotnet ef migrations add Added_Customer +dotnet ef database update +``` + +Start your application — the Customer page is ready. + +## Two Ways to Define Entities + +### C# Attributes (Recommended) + +Define entities as C# classes with attributes. You get compile-time checking, IntelliSense, and refactoring support: + +````csharp +[DynamicEntity] +[DynamicEntityUI(PageTitle = "Orders")] +public class Order : DynamicEntityBase +{ + [DynamicForeignKey("MyApp.Customers.Customer", "Name", ForeignAccess.Edit)] + public Guid CustomerId { get; set; } + + public decimal TotalAmount { get; set; } + public bool IsDelivered { get; set; } +} + +[DynamicEntity(Parent = "MyApp.Orders.Order")] +public class OrderLine : DynamicEntityBase +{ + [DynamicForeignKey("MyApp.Products.Product", "Name")] + public Guid ProductId { get; set; } + + public int Quantity { get; set; } + public decimal Amount { get; set; } +} +```` + +See [Attributes & Fluent API](fluent-api.md) for the full attribute reference. + +### model.json (Declarative) + +Alternatively, define entities in a JSON file without writing C# classes: + +```json +{ + "entities": [ + { + "name": "MyApp.Customers.Customer", + "displayProperty": "Name", + "properties": [ + { "name": "Name", "isRequired": true }, + { "name": "Telephone", "ui": { "displayName": "Phone Number" } } + ], + "ui": { "pageTitle": "Customers" } + } + ] +} +``` + +See [model.json Structure](model-json.md) for the full specification. + +> Both approaches can be combined. The [three-layer configuration system](fluent-api.md#three-layer-configuration-system) merges Attributes, JSON, and Fluent API with clear priority rules. + +## Key Features + +| Feature | Description | Documentation | +|---------|-------------|---------------| +| **Attributes & Fluent API** | Define dynamic entities with C# attributes and configure programmatically | [Attributes & Fluent API](fluent-api.md) | +| **model.json** | Declarative dynamic entity definitions in JSON | [model.json Structure](model-json.md) | +| **Reference Entities** | Read-only access to existing C# entities (e.g., `IdentityUser`) for foreign key lookups | [Reference Entities](reference-entities.md) | +| **Interceptors** | Pre/Post hooks for Create, Update, Delete with JavaScript | [Interceptors](interceptors.md) | +| **Scripting API** | Server-side JavaScript for database queries and CRUD | [Scripting API](scripting-api.md) | +| **Custom Endpoints** | REST APIs with JavaScript handlers | [Custom Endpoints](custom-endpoints.md) | +| **Foreign Access** | View/Edit related dynamic entities from the target entity's UI | [Foreign Access](foreign-access.md) | +| **Export** | Export dynamic entity data to Excel (XLSX) or CSV | See below | + +## Export (Excel / CSV) + +The Low-Code System provides built-in export functionality for all dynamic entities. Users can export filtered data to **Excel (XLSX)** or **CSV** directly from the Blazor UI. + +### How It Works + +1. The client calls `GET /api/low-code/entities/{entityName}/download-token` to obtain a single-use download token (valid for 30 seconds). +2. The client calls `GET /api/low-code/entities/{entityName}/export-as-excel` or `GET /api/low-code/entities/{entityName}/export-as-csv` with the token and optional filters. + +### API Endpoints + +| Endpoint | Description | +|----------|-------------| +| `GET /api/low-code/entities/{entityName}/download-token` | Get a single-use download token | +| `GET /api/low-code/entities/{entityName}/export-as-excel` | Export as Excel (.xlsx) | +| `GET /api/low-code/entities/{entityName}/export-as-csv` | Export as CSV (.csv) | + +Export requests accept the same filtering, sorting, and search parameters as the list endpoint. Server-only properties are automatically excluded, and foreign key columns display the referenced entity's display value instead of the raw ID. + +## Custom Commands and Queries + +The Low-Code System allows you to replace or extend the default CRUD operations by implementing custom command and query handlers in C#. + +### Custom Commands + +Create a class that implements `ILcCommand` and decorate it with `[CustomCommand]`: + +````csharp +[CustomCommand("Create", "MyApp.Products.Product")] +public class CustomProductCreateCommand : CreateCommand +{ + public override async Task ExecuteWithResultAsync(DynamicCommandArgs commandArgs) + { + // Your custom create logic here + // ... + } +} +```` + +| Parameter | Description | +|-----------|-------------| +| `commandName` | The command to replace: `"Create"`, `"Update"`, or `"Delete"` | +| `entityName` | Full entity name (e.g., `"MyApp.Products.Product"`) | + +### Custom Queries + +Create a class that implements `ILcQuery` and decorate it with `[CustomQuery]`: + +````csharp +[CustomQuery("List", "MyApp.Products.Product")] +public class CustomProductListQuery : ILcQuery +{ + public async Task ExecuteAsync(DynamicQueryArgs queryArgs) + { + // Your custom list query logic here + // ... + } +} +```` + +````csharp +[CustomQuery("Single", "MyApp.Products.Product")] +public class CustomProductListQuery : ILcQuery +{ + public async Task ExecuteAsync(DynamicQueryArgs queryArgs) + { + // Your custom single query logic here + // ... + } +} +```` + +| Parameter | Description | +|-----------|-------------| +| `queryName` | The query to replace: `"List"` or `"Single"` | +| `entityName` | Full entity name (e.g., `"MyApp.Products.Product"`) | + +Custom commands and queries are automatically discovered and registered at startup. They completely replace the default handler for the specified entity and operation. + +## Internals + +### Domain Layer + +* `DynamicModelManager`: Singleton managing all entity metadata with a layered configuration architecture (Code > JSON > Fluent > Defaults). +* `EntityDescriptor`: Entity definition with properties, foreign keys, interceptors, and UI configuration. +* `EntityPropertyDescriptor`: Property definition with type, validation, UI settings, and foreign key info. +* `IDynamicEntityRepository`: Repository for dynamic entity CRUD operations. + +### Application Layer + +* `DynamicEntityAppService`: CRUD operations for all dynamic entities (Get, GetList, Create, Update, Delete, Export). +* `DynamicEntityUIAppService`: UI definitions, menu items, and page configurations. Provides: + * `GetUiDefinitionAsync(entityName)` — Full UI definition (filters, columns, forms, children, foreign access actions, permissions) + * `GetUiCreationFormDefinitionAsync(entityName)` — Creation form fields with validation rules + * `GetUiEditFormDefinitionAsync(entityName)` — Edit form fields with validation rules + * `GetMenuItemsAsync()` — Menu items for all entities that have a `pageTitle` configured (filtered by permissions) +* `DynamicPermissionDefinitionProvider`: Auto-generates permissions per entity. +* `CustomEndpointExecutor`: Executes JavaScript-based custom endpoints. + +### Database Providers + +**Entity Framework Core**: Dynamic entities are configured as EF Core [shared-type entities](https://learn.microsoft.com/en-us/ef/core/modeling/entity-types?tabs=fluent-api#shared-type-entity-types) via the `ConfigureDynamicEntities()` extension method. + +## See Also + +* [Attributes & Fluent API](fluent-api.md) +* [model.json Structure](model-json.md) +* [Scripting API](scripting-api.md) diff --git a/docs/en/low-code/interceptors.md b/docs/en/low-code/interceptors.md new file mode 100644 index 0000000000..7eaf97eb77 --- /dev/null +++ b/docs/en/low-code/interceptors.md @@ -0,0 +1,249 @@ +```json +//[doc-seo] +{ + "Description": "Add custom business logic to dynamic entity CRUD operations using Interceptors in the ABP Low-Code System. Validate, transform, and react to data changes with JavaScript." +} +``` + +# Interceptors + +Interceptors allow you to run custom JavaScript code before, after, or instead of Create, Update, and Delete operations on dynamic entities. + +## Interceptor Types + +| Command | Type | When Executed | +|---------|------|---------------| +| `Create` | `Pre` | Before entity creation — validation, default values | +| `Create` | `Post` | After entity creation — notifications, related data | +| `Create` | `Replace` | Instead of entity creation — **must return the new entity's Id** (see below) | +| `Update` | `Pre` | Before entity update — validation, authorization | +| `Update` | `Post` | After entity update — sync, notifications | +| `Update` | `Replace` | Instead of entity update — no return value needed | +| `Delete` | `Pre` | Before entity deletion — dependency checks | +| `Delete` | `Post` | After entity deletion — cleanup | +| `Delete` | `Replace` | Instead of entity deletion — no return value needed | + +## Defining Interceptors with Attributes + +Use the `[DynamicEntityCommandInterceptor]` attribute on a C# class: + +````csharp +[DynamicEntity] +[DynamicEntityCommandInterceptor( + "Create", + InterceptorType.Pre, + "if(!context.commandArgs.data['Name']) { globalError = 'Name is required!'; }" +)] +[DynamicEntityCommandInterceptor( + "Create", + InterceptorType.Post, + "context.log('Entity created: ' + context.commandArgs.entityId);" +)] +public class Organization +{ + public string Name { get; set; } +} +```` + +The `Name` parameter must be one of: `"Create"`, `"Update"`, or `"Delete"`. The `InterceptorType` can be `Pre`, `Post`, or `Replace`. When `Replace` is used, the default database operation is completely skipped and only your JavaScript handler executes. Multiple interceptors can be added to the same class (`AllowMultiple = true`). + +## Defining Interceptors with Fluent API + +Use the `Interceptors` list on an `EntityDescriptor` to add interceptors programmatically in your [Low-Code Initializer](index.md#1-create-a-low-code-initializer): + +````csharp +AbpDynamicEntityConfig.EntityConfigurations.Configure( + "MyApp.Organizations.Organization", + entity => + { + entity.Interceptors.Add(new CommandInterceptorDescriptor("Create") + { + Type = InterceptorType.Pre, + Javascript = "if(!context.commandArgs.data['Name']) { globalError = 'Name is required!'; }" + }); + + entity.Interceptors.Add(new CommandInterceptorDescriptor("Delete") + { + Type = InterceptorType.Post, + Javascript = "context.log('Deleted: ' + context.commandArgs.entityId);" + }); + } +); +```` + +See [Attributes & Fluent API](fluent-api.md#adding-interceptors) for more details on Fluent API configuration. + +## Defining Interceptors in model.json + +Add interceptors to the `interceptors` array of an entity: + +```json +{ + "name": "LowCodeDemo.Customers.Customer", + "interceptors": [ + { + "commandName": "Create", + "type": "Pre", + "javascript": "if(context.commandArgs.data['Name'] == 'Invalid') {\n globalError = 'Invalid Customer Name!';\n}" + } + ] +} +``` + +### Interceptor Descriptor + +| Field | Type | Description | +|-------|------|-------------| +| `commandName` | string | `"Create"`, `"Update"`, or `"Delete"` | +| `type` | string | `"Pre"`, `"Post"`, or `"Replace"` | +| `javascript` | string | JavaScript code to execute | + +## JavaScript Context + +Inside interceptor scripts, you have access to: + +### `context.commandArgs` + +| Property / Method | Type | Description | +|----------|------|-------------| +| `data` | object | Entity data dictionary (for Create/Update) | +| `entityId` | string | Entity ID (for Update/Delete) | +| `commandName` | string | Command name (`"Create"`, `"Update"`, or `"Delete"`) | +| `entityName` | string | Full entity name | +| `getValue(name)` | function | Get a property value | +| `setValue(name, value)` | function | Set a property value (Pre-interceptors only) | +| `hasValue(name)` | function | Check if a property exists in the data | +| `removeValue(name)` | function | Remove a property from the data | + +### `context.currentUser` + +| Property / Method | Type | Description | +|----------|------|-------------| +| `isAuthenticated` | bool | Whether user is logged in | +| `id` | string | User ID | +| `userName` | string | Username | +| `email` | string | Email address | +| `name` | string | First name | +| `surName` | string | Last name | +| `phoneNumber` | string | Phone number | +| `phoneNumberVerified` | bool | Whether phone is verified | +| `emailVerified` | bool | Whether email is verified | +| `tenantId` | string | Tenant ID (for multi-tenant apps) | +| `roles` | string[] | User's role names | +| `isInRole(roleName)` | function | Check if user has a specific role | + +### `context.emailSender` + +| Property / Method | Description | +|--------|-------------| +| `isAvailable` | Whether the email sender is configured and available | +| `sendAsync(to, subject, body)` | Send a plain-text email | +| `sendHtmlAsync(to, subject, htmlBody)` | Send an HTML email | + +### Logging + +| Method | Description | +|--------|-------------| +| `context.log(message)` | Log an informational message | +| `context.logWarning(message)` | Log a warning message | +| `context.logError(message)` | Log an error message | + +> Use these methods instead of `console.log` (which is blocked in the sandbox). + +### `db` (Database API) + +Full access to the [Scripting API](scripting-api.md) for querying and mutating data. + +### `globalError` + +Set this variable to a string to **abort** the operation and return an error: + +```javascript +globalError = 'Cannot delete this entity!'; +``` + +![Interceptor validation error displayed in the UI](images/interceptor-error.png) + +## Examples + +### Pre-Create: Validation + +```json +{ + "commandName": "Create", + "type": "Pre", + "javascript": "if(!context.commandArgs.data['Name']) {\n globalError = 'Organization name is required!';\n}" +} +``` + +### Post-Create: Email Notification + +```json +{ + "commandName": "Create", + "type": "Post", + "javascript": "if(context.currentUser.isAuthenticated && context.emailSender) {\n await context.emailSender.sendAsync(\n context.currentUser.email,\n 'New Order Created',\n 'Order total: $' + context.commandArgs.data['TotalAmount']\n );\n}" +} +``` + +### Pre-Update: Role-Based Authorization + +```json +{ + "commandName": "Update", + "type": "Pre", + "javascript": "if(context.commandArgs.data['IsDelivered']) {\n if(!context.currentUser.roles.includes('admin')) {\n globalError = 'Only administrators can mark orders as delivered!';\n }\n}" +} +``` + +### Pre-Delete: Business Rule Check + +```json +{ + "commandName": "Delete", + "type": "Pre", + "javascript": "var project = await db.get('LowCodeDemo.Projects.Project', context.commandArgs.entityId);\nif(project.Budget > 100000) {\n globalError = 'Cannot delete high-budget projects!';\n}" +} +``` + +### Pre-Update: Negative Value Check + +```json +{ + "commandName": "Update", + "type": "Pre", + "javascript": "if(context.commandArgs.data['Quantity'] < 0) {\n globalError = 'Quantity cannot be negative!';\n}" +} +``` + +### Replace-Create: Custom Insert Logic + +When you need to completely replace the default create operation with custom logic: + +```json +{ + "commandName": "Create", + "type": "Replace", + "javascript": "var data = context.commandArgs.data;\ndata['Code'] = 'PRD-' + Date.now();\nvar result = await db.insert('LowCodeDemo.Products.Product', data);\ncontext.log('Product created with custom code: ' + data['Code']);\nreturn result.Id;" +} +``` + +> **Important:** `Replace-Create` interceptors **must** return the new entity's `Id` (Guid). The system uses this value to fetch and return the created entity. Use `return result.Id;` after `db.insert(...)`. +> +> `Replace-Update` and `Replace-Delete` interceptors do not need to return a value. + +### Pre-Update: Self-Reference Check + +```json +{ + "commandName": "Update", + "type": "Pre", + "javascript": "if(context.commandArgs.data.ParentCategoryId === context.commandArgs.entityId) {\n globalError = 'A category cannot be its own parent!';\n}" +} +``` + +## See Also + +* [Scripting API](scripting-api.md) +* [model.json Structure](model-json.md) +* [Custom Endpoints](custom-endpoints.md) diff --git a/docs/en/low-code/model-json.md b/docs/en/low-code/model-json.md new file mode 100644 index 0000000000..2f58876a29 --- /dev/null +++ b/docs/en/low-code/model-json.md @@ -0,0 +1,422 @@ +```json +//[doc-seo] +{ + "Description": "Define dynamic entities using model.json in the ABP Low-Code System. Learn about entity properties, enums, foreign keys, validators, UI configuration, and migration requirements." +} +``` + +# model.json Structure + +The `model.json` file defines all your dynamic entities, their properties, enums, relationships, interceptors, custom endpoints, and UI configurations. It is an alternative configuration source to [C# Attributes and Fluent API](fluent-api.md), ideal when you prefer a declarative JSON approach. + +## File Location + +Place your `model.json` in a `_Dynamic` folder inside your **Domain** project: + +``` +YourApp.Domain/ +└── _Dynamic/ + └── model.json +``` + +The module automatically discovers and loads this file at application startup. + +> A JSON Schema file (`model.schema.json`) is available in the module source for IDE IntelliSense. Reference it using the `$schema` property: + +```json +{ + "$schema": "path/to/model.schema.json", + "entities": [] +} +``` + +## Top-Level Structure + +The `model.json` file has three root sections: + +```json +{ + "$schema": "...", + "enums": [], + "entities": [], + "endpoints": [] +} +``` + +| Section | Description | +|---------|-------------| +| `enums` | Enum type definitions | +| `entities` | Entity definitions with properties, foreign keys, interceptors, and UI | +| `endpoints` | Custom REST API endpoints with JavaScript handlers | + +## Enum Definitions + +Define enums that can be used as property types: + +```json +{ + "enums": [ + { + "name": "LowCodeDemo.Organizations.OrganizationType", + "values": [ + { "name": "Corporate", "value": 0 }, + { "name": "Enterprise", "value": 1 }, + { "name": "Startup", "value": 2 }, + { "name": "Consulting", "value": 3 } + ] + } + ] +} +``` + +Reference enums in entity properties using the `enumType` field: + +```json +{ + "name": "OrganizationType", + "enumType": "LowCodeDemo.Organizations.OrganizationType" +} +``` + +## Entity Definition + +Each entity has the following structure: + +```json +{ + "name": "LowCodeDemo.Products.Product", + "displayProperty": "Name", + "parent": null, + "properties": [], + "interceptors": [], + "ui": {} +} +``` + +### Entity Attributes + +| Attribute | Type | Description | +|-----------|------|-------------| +| `name` | string | **Required.** Full entity name with namespace (e.g., `"MyApp.Products.Product"`) | +| `displayProperty` | string | Property to display in lookups and foreign key dropdowns | +| `parent` | string | Parent entity name for parent-child (master-detail) relationships | +| `properties` | array | Property definitions | +| `interceptors` | array | CRUD lifecycle interceptors | +| `ui` | object | UI configuration | + +### Parent-Child Relationships + +Use the `parent` field to create nested entities. Children are managed through the parent entity's UI: + +```json +{ + "name": "LowCodeDemo.Orders.OrderLine", + "parent": "LowCodeDemo.Orders.Order", + "properties": [ + { + "name": "ProductId", + "foreignKey": { + "entityName": "LowCodeDemo.Products.Product" + } + }, + { "name": "Quantity", "type": "int" }, + { "name": "Amount", "type": "decimal" } + ] +} +``` + +Multi-level nesting is supported (e.g., `Order > OrderLine > ShipmentItem > ShipmentTracking`). + +## Property Definition + +```json +{ + "name": "Price", + "type": "decimal", + "isRequired": true, + "isUnique": false, + "isMappedToDbField": true, + "serverOnly": false, + "allowSetByClients": true, + "enumType": null, + "foreignKey": null, + "validators": [], + "ui": {} +} +``` + +### Property Types + +| Type | Description | +|------|-------------| +| `string` | Text (default if type is omitted) | +| `int` | 32-bit integer | +| `long` | 64-bit integer | +| `decimal` | Decimal number | +| `DateTime` | Date and time | +| `boolean` | True/false | +| `Guid` | GUID/UUID | +| `Enum` | Enum type (requires `enumType` field) | + +### Property Flags + +| Flag | Type | Default | Description | +|------|------|---------|-------------| +| `isRequired` | bool | `false` | Property must have a value | +| `isUnique` | bool | `false` | Value must be unique across all records | +| `isMappedToDbField` | bool | `true` | Property is stored in the database | +| `serverOnly` | bool | `false` | Property is hidden from API clients | +| `allowSetByClients` | bool | `true` | Whether clients can set this value | + +### Foreign Key Properties + +Define a foreign key relationship inline on a property: + +```json +{ + "name": "CustomerId", + "foreignKey": { + "entityName": "LowCodeDemo.Customers.Customer", + "displayPropertyName": "Name", + "access": "edit" + } +} +``` + +| Attribute | Description | +|-----------|-------------| +| `entityName` | **Required.** Full name of the target entity — can be a **dynamic entity** (e.g., `"LowCodeDemo.Customers.Customer"`) or a **[reference entity](reference-entities.md)** (e.g., `"Volo.Abp.Identity.IdentityUser"`) | +| `displayPropertyName` | Property to display in lookups (defaults to entity's `displayProperty`) | +| `access` | [Foreign access](foreign-access.md) level: `"none"`, `"view"`, or `"edit"` | + +> **Note:** [Reference entities](reference-entities.md) are existing C# entities (like ABP's `IdentityUser`) that are registered for read-only access. Unlike dynamic entities, they don't get CRUD pages — they're used only for foreign key lookups and display values. + +### Validators + +Add validation rules to properties: + +```json +{ + "name": "EmailAddress", + "validators": [ + { "type": "required" }, + { "type": "emailAddress" }, + { "type": "minLength", "length": 5 }, + { "type": "maxLength", "length": 255 } + ] +} +``` + +Additional validator examples: + +```json +{ + "name": "Website", + "validators": [ + { "type": "url", "message": "Please enter a valid URL" } + ] +}, +{ + "name": "PhoneNumber", + "validators": [ + { "type": "phone" } + ] +}, +{ + "name": "ProductCode", + "validators": [ + { "type": "regularExpression", "pattern": "^[A-Z]{3}-\\d{4}$", "message": "Code must be in format ABC-1234" } + ] +}, +{ + "name": "Price", + "type": "decimal", + "validators": [ + { "type": "range", "minimum": 0.01, "maximum": 99999.99 } + ] +} +``` + +| Validator | Parameters | Applies To | Description | +|-----------|------------|------------|-------------| +| `required` | `allowEmptyStrings` (optional) | All types | Value is required | +| `minLength` | `length` | String | Minimum string length | +| `maxLength` | `length` | String | Maximum string length | +| `stringLength` | `minimumLength`, `maximumLength` | String | String length range (min and max together) | +| `emailAddress` | — | String | Must be a valid email | +| `phone` | — | String | Must be a valid phone number | +| `url` | — | String | Must be a valid URL | +| `creditCard` | — | String | Must be a valid credit card number | +| `regularExpression` | `pattern` | String | Must match the regex pattern | +| `range` | `minimum`, `maximum` | Numeric | Numeric range | +| `min` | `minimum` | Numeric | Minimum numeric value | +| `max` | `maximum` | Numeric | Maximum numeric value | + +> All validators accept an optional `message` parameter for a custom error message. The `regularExpression` validator also accepts the alias `pattern`, and `emailAddress` also accepts `email`. + +## UI Configuration + +### Entity-Level UI + +```json +{ + "ui": { + "pageTitle": "Products" + } +} +``` + +> Only entities with `ui.pageTitle` get a menu item and a dedicated page in the UI. + +### Property-Level UI + +```json +{ + "name": "RegistrationNumber", + "ui": { + "displayName": "Registration Number", + "isAvailableOnDataTable": true, + "isAvailableOnDataTableFiltering": true, + "creationFormAvailability": "Hidden", + "editingFormAvailability": "NotAvailable", + "quickLookOrder": 100 + } +} +``` + +| Attribute | Type | Default | Description | +|-----------|------|---------|-------------| +| `displayName` | string | Property name | Display label in UI | +| `isAvailableOnDataTable` | bool | `true` | Show in data grid | +| `isAvailableOnDataTableFiltering` | bool | `true` | Show in filter panel | +| `creationFormAvailability` | string | `"Available"` | Visibility in create form | +| `editingFormAvailability` | string | `"Available"` | Visibility in edit form | +| `quickLookOrder` | int | -2 | Order in quick-look panel (-2 = not shown) | + +#### Form Availability Values + +| Value | Description | +|-------|-------------| +| `Available` | Visible and editable | +| `Hidden` | Not visible in the form | +| `NotAvailable` | Visible but disabled/read-only | + +## Interceptors + +Define JavaScript interceptors for CRUD lifecycle hooks: + +```json +{ + "interceptors": [ + { + "commandName": "Create", + "type": "Pre", + "javascript": "if(!context.commandArgs.data['Name']) { globalError = 'Name is required!'; }" + } + ] +} +``` + +See [Interceptors](interceptors.md) for details. + +## Endpoints + +Define custom REST endpoints with JavaScript handlers: + +```json +{ + "endpoints": [ + { + "name": "GetProductStats", + "route": "/api/custom/products/stats", + "method": "GET", + "requireAuthentication": false, + "javascript": "var count = await db.count('Products.Product'); return ok({ total: count });" + } + ] +} +``` + +See [Custom Endpoints](custom-endpoints.md) for details. + +## Complete Example + +```json +{ + "enums": [ + { + "name": "ShipmentStatus", + "values": [ + { "name": "Pending", "value": 0 }, + { "name": "Shipped", "value": 2 }, + { "name": "Delivered", "value": 4 } + ] + } + ], + "entities": [ + { + "name": "LowCodeDemo.Products.Product", + "displayProperty": "Name", + "properties": [ + { "name": "Name", "isUnique": true, "isRequired": true }, + { "name": "Price", "type": "decimal" }, + { "name": "StockCount", "type": "int" }, + { "name": "ReleaseDate", "type": "DateTime" } + ], + "ui": { "pageTitle": "Products" } + }, + { + "name": "LowCodeDemo.Orders.Order", + "displayProperty": "Id", + "properties": [ + { + "name": "CustomerId", + "foreignKey": { + "entityName": "LowCodeDemo.Customers.Customer", + "access": "edit" + } + }, + { "name": "TotalAmount", "type": "decimal" }, + { "name": "IsDelivered", "type": "boolean" } + ], + "interceptors": [ + { + "commandName": "Create", + "type": "Post", + "javascript": "context.log('Order created: ' + context.commandArgs.entityId);" + } + ], + "ui": { "pageTitle": "Orders" } + }, + { + "name": "LowCodeDemo.Orders.OrderLine", + "parent": "LowCodeDemo.Orders.Order", + "properties": [ + { + "name": "ProductId", + "foreignKey": { "entityName": "LowCodeDemo.Products.Product" } + }, + { "name": "Quantity", "type": "int" }, + { "name": "Amount", "type": "decimal" } + ] + } + ] +} +``` + +## Migration Requirements + +When you modify `model.json`, you need database migrations for the changes to take effect: + +* **New entity**: `dotnet ef migrations add Added_{EntityName}` +* **New property**: `dotnet ef migrations add Added_{PropertyName}_To_{EntityName}` +* **Type change**: `dotnet ef migrations add Changed_{PropertyName}_In_{EntityName}` + +> The same migration requirement applies when using [C# Attributes](fluent-api.md). Any change to entity structure requires an EF Core migration. + +## See Also + +* [Attributes & Fluent API](fluent-api.md) +* [Interceptors](interceptors.md) +* [Custom Endpoints](custom-endpoints.md) +* [Scripting API](scripting-api.md) diff --git a/docs/en/low-code/reference-entities.md b/docs/en/low-code/reference-entities.md new file mode 100644 index 0000000000..b937175c7a --- /dev/null +++ b/docs/en/low-code/reference-entities.md @@ -0,0 +1,147 @@ +```json +//[doc-seo] +{ + "Description": "Link dynamic entities to existing C# entities like IdentityUser using Reference Entities in the ABP Low-Code System." +} +``` + +# Reference Entities + +Reference Entities allow you to create foreign key relationships from **dynamic entities** to **existing C# entities** that live outside the Low-Code System. + +## Dynamic Entities vs Reference Entities + +| | Dynamic Entities | Reference Entities | +|---|-----------------|-------------------| +| **Definition** | Defined via `[DynamicEntity]` attribute or `model.json` | Existing C# classes (e.g., `IdentityUser`, `Tenant`) | +| **CRUD Operations** | Full CRUD (Create, Read, Update, Delete) | **Read-only** — no create/update/delete | +| **UI Pages** | Auto-generated pages with data grids and forms | No UI pages | +| **Permissions** | Auto-generated permissions | No permissions | +| **Purpose** | Primary data management | Foreign key lookups and display values | +| **Registration** | `AbpDynamicEntityConfig.SourceAssemblies` | `AbpDynamicEntityConfig.ReferencedEntityList` | + +## Overview + +Dynamic entities defined via [Attributes](fluent-api.md) or [model.json](model-json.md) can reference **other dynamic entities** using foreign keys. However, you may also need to link to entities that exist **outside** the Low-Code System — such as ABP's `IdentityUser`, `Tenant`, or your own C# entity classes. + +**Reference entities** make this possible by exposing existing entities for: + +* **Foreign key lookups** — dropdown selection in UI forms +* **Display values** — showing the entity's display property in grids instead of raw GUIDs +* **Read-only queries** — querying via the [Scripting API](scripting-api.md) + +> **Key distinction:** When you define a foreign key with `entityName`, the system checks if it's a registered **reference entity** first. If not found, it assumes it's a **dynamic entity**. + +## Registering Reference Entities + +Register reference entities in your [Low-Code Initializer](index.md#1-create-a-low-code-initializer) using `AbpDynamicEntityConfig.ReferencedEntityList`: + +````csharp +public static async Task InitializeAsync() +{ + await Runner.RunAsync(async () => + { + // Register reference entity with default display property only + AbpDynamicEntityConfig.ReferencedEntityList.Add( + "UserName" + ); + + // Register reference entity with additional exposed properties + AbpDynamicEntityConfig.ReferencedEntityList.Add( + "UserName", // Default display property + "UserName", // Exposed properties (for queries and display) + "Email", + "PhoneNumber" + ); + + // ... rest of initialization + await DynamicModelManager.Instance.InitializeAsync(); + }); +} +```` + +### `Add` Method + +````csharp +public void Add( + string defaultDisplayProperty, + params string[] properties +) where TEntity : class, IEntity +```` + +| Parameter | Description | +|-----------|-------------| +| `defaultDisplayProperty` | Property name used as display value in lookups | +| `properties` | Additional properties to expose (optional) | + +> The entity type must implement `IEntity`. + +## Using Reference Entities in model.json + +Reference a registered entity in a foreign key definition: + +```json +{ + "name": "UserId", + "foreignKey": { + "entityName": "Volo.Abp.Identity.IdentityUser" + } +} +``` + +The entity name must match the CLR type's full name. The module automatically detects that this is a reference entity and uses the registered `ReferenceEntityDescriptor`. + +## Using Reference Entities with Attributes + +Use the `[DynamicForeignKey]` attribute on a Guid property: + +````csharp +[DynamicEntity] +public class Customer +{ + [DynamicForeignKey("Volo.Abp.Identity.IdentityUser", "UserName")] + public Guid? UserId { get; set; } +} +```` + +## How It Works + +The `ReferenceEntityDescriptor` class stores metadata about the reference entity: + +* `Name` — Full CLR type name +* `Type` — The actual CLR type +* `DefaultDisplayPropertyName` — Display property for lookups +* `Properties` — List of `ReferenceEntityPropertyDescriptor` entries + +When a foreign key points to a reference entity, the `ForeignKeyDescriptor` populates its `ReferencedEntityDescriptor` and `ReferencedDisplayPropertyDescriptor` instead of the standard `EntityDescriptor` fields. + +## Querying Reference Entities in Scripts + +Reference entities can be queried via the [Scripting API](scripting-api.md): + +```javascript +// Query reference entity in interceptor or custom endpoint +var user = await db.get('Volo.Abp.Identity.IdentityUser', userId); +if (user) { + context.log('User: ' + user.UserName); +} +``` + +## Limitations + +* **Read-only**: Reference entities do not get CRUD operations, permissions, or UI pages. +* **No child entities**: You cannot define a reference entity as a parent in parent-child relationships. +* **Guid keys only**: Reference entities must have `Guid` primary keys (`IEntity`). +* **Explicit registration required**: Each reference entity must be registered in code before use. + +## Common Reference Entities + +| Entity | Name for `entityName` | Typical Display Property | +|--------|----------------------|--------------------------| +| ABP Identity User | `Volo.Abp.Identity.IdentityUser` | `UserName` | + +## See Also + +* [model.json Structure](model-json.md) +* [Foreign Access](foreign-access.md) +* [Attributes & Fluent API](fluent-api.md) diff --git a/docs/en/low-code/scripting-api.md b/docs/en/low-code/scripting-api.md new file mode 100644 index 0000000000..a08b1107ec --- /dev/null +++ b/docs/en/low-code/scripting-api.md @@ -0,0 +1,455 @@ +```json +//[doc-seo] +{ + "Description": "Server-side JavaScript Scripting API for ABP Low-Code System. Query, filter, aggregate data and perform CRUD operations with database-level execution." +} +``` + +# Scripting API + +The Low-Code System provides a server-side JavaScript scripting engine for executing custom business logic within [interceptors](interceptors.md) and [custom endpoints](custom-endpoints.md). Scripts run in a sandboxed environment with access to a database API backed by EF Core. + +## Unified Database API (`db`) + +The `db` object is the main entry point for all data operations. + +### Key Design Principles + +* **Immutable Query Builder** — each query method returns a new builder instance. The original is never modified. +* **Database-Level Execution** — all operations (filters, aggregations, joins, set operations) translate to SQL via EF Core and Dynamic LINQ. +* **No in-memory processing** of large datasets. + +```javascript +// Immutable pattern — each call creates a new builder +var baseQuery = db.query('Entity').where(x => x.Active); +var cheap = baseQuery.where(x => x.Price < 100); // baseQuery unchanged +var expensive = baseQuery.where(x => x.Price > 500); // baseQuery unchanged +``` + +## Query API + +### Basic Queries + +```javascript +var products = await db.query('LowCodeDemo.Products.Product') + .where(x => x.Price > 100) + .orderBy(x => x.Price) + .take(10) + .toList(); + +var result = await db.query('LowCodeDemo.Products.Product') + .where(x => x.Price > 100 && x.Price < 500) + .where(x => x.StockCount > 0) + .orderByDescending(x => x.Price) + .skip(10) + .take(20) + .toList(); +``` + +### Query Methods + +| Method | Description | Returns | +|--------|-------------|---------| +| `where(x => condition)` | Filter results | `QueryBuilder` | +| `orderBy(x => x.Property)` | Sort ascending | `QueryBuilder` | +| `orderByDescending(x => x.Property)` | Sort descending | `QueryBuilder` | +| `thenBy(x => x.Property)` | Secondary sort ascending | `QueryBuilder` | +| `thenByDescending(x => x.Property)` | Secondary sort descending | `QueryBuilder` | +| `skip(n)` | Skip n records | `QueryBuilder` | +| `take(n)` | Take n records | `QueryBuilder` | +| `toList()` | Execute and return array | `Promise` | +| `count()` | Return count | `Promise` | +| `any()` | Check if any matches exist | `Promise` | +| `all(x => condition)` | Check if all records match | `Promise` | +| `isEmpty()` | Check if no results | `Promise` | +| `isSingle()` | Check if exactly one result | `Promise` | +| `first()` / `firstOrDefault()` | Return first match or null | `Promise` | +| `last()` / `lastOrDefault()` | Return last match or null | `Promise` | +| `single()` / `singleOrDefault()` | Return single match or null | `Promise` | +| `elementAt(index)` | Return element at index | `Promise` | +| `select(x => projection)` | Project to custom shape | `QueryBuilder` | +| `join(entity, alias, condition)` | Inner join | `QueryBuilder` | +| `leftJoin(entity, alias, condition)` | Left join | `QueryBuilder` | + +### Supported Operators in Lambda + +| Category | Operators | +|----------|-----------| +| Comparison | `===`, `!==`, `>`, `>=`, `<`, `<=` | +| Logical | `&&`, `\|\|`, `!` | +| Arithmetic | `+`, `-`, `*`, `/`, `%` | +| String | `startsWith()`, `endsWith()`, `includes()`, `trim()`, `toLowerCase()`, `toUpperCase()` | +| Array | `array.includes(x.Property)` — translates to SQL `IN` | +| Math | `Math.round()`, `Math.floor()`, `Math.ceil()`, `Math.abs()`, `Math.sqrt()`, `Math.pow()`, `Math.sign()`, `Math.truncate()` | +| Null | `!= null`, `=== null` | + +### Variable Capture + +External variables are captured and passed as parameters: + +```javascript +var minPrice = 100; +var config = { minStock: 10 }; +var nested = { range: { min: 50, max: 200 } }; + +var result = await db.query('Entity').where(x => x.Price > minPrice).toList(); +var result2 = await db.query('Entity').where(x => x.StockCount > config.minStock).toList(); +var result3 = await db.query('Entity').where(x => x.Price >= nested.range.min).toList(); +``` + +### Contains / IN Operator + +```javascript +var targetPrices = [50, 100, 200]; +var products = await db.query('Entity') + .where(x => targetPrices.includes(x.Price)) + .toList(); +``` + +### Select Projection + +```javascript +var projected = await db.query('LowCodeDemo.Products.Product') + .where(x => x.Price > 0) + .select(x => ({ ProductName: x.Name, ProductPrice: x.Price })) + .toList(); +``` + +## Joins + +### Explicit Joins + +```javascript +var orderLines = await db.query('LowCodeDemo.Orders.OrderLine') + .join('LowCodeDemo.Products.Product', 'p', (ol, p) => ol.ProductId === p.Id) + .take(10) + .toList(); + +// Access joined data via alias +orderLines.forEach(line => { + var product = line.p; + context.log(product.Name + ': $' + line.Amount); +}); +``` + +### Left Join + +```javascript +var orders = await db.query('LowCodeDemo.Orders.Order') + .leftJoin('LowCodeDemo.Products.Product', 'p', (o, p) => o.CustomerId === p.Id) + .toList(); + +orders.forEach(order => { + if (order.p) { + context.log('Has match: ' + order.p.Name); + } +}); +``` + +### LINQ-Style Join + +```javascript +db.query('Order') + .join('LowCodeDemo.Products.Product', + o => o.ProductId, + p => p.Id) +``` + +### Join with Filtered Query + +```javascript +var expensiveProducts = db.query('Product').where(p => p.Price > 100); + +var orders = await db.query('OrderLine') + .join(expensiveProducts, + ol => ol.ProductId, + p => p.Id) + .toList(); +``` + +## Set Operations + +Set operations execute at the database level using SQL: + +| Method | SQL Equivalent | Description | +|--------|---------------|-------------| +| `union(query)` | `UNION` | Combine, remove duplicates | +| `concat(query)` | `UNION ALL` | Combine, keep duplicates | +| `intersect(query)` | `INTERSECT` | Elements in both | +| `except(query)` | `EXCEPT` | Elements in first, not second | + +```javascript +var cheap = db.query('Product').where(x => x.Price <= 100); +var popular = db.query('Product').where(x => x.Rating > 4); + +var bestDeals = await cheap.intersect(popular).toList(); +var underrated = await cheap.except(popular).toList(); +``` + +## Aggregation Methods + +All aggregations execute as SQL statements: + +| Method | SQL | Returns | +|--------|-----|---------| +| `sum(x => x.Property)` | `SELECT SUM(...)` | `Promise` | +| `average(x => x.Property)` | `SELECT AVG(...)` | `Promise` | +| `min(x => x.Property)` | `SELECT MIN(...)` | `Promise` | +| `max(x => x.Property)` | `SELECT MAX(...)` | `Promise` | +| `distinct(x => x.Property)` | `SELECT DISTINCT ...` | `Promise` | +| `groupBy(x => x.Property)` | `GROUP BY ...` | `Promise` | + +```javascript +var totalValue = await db.query('Product').sum(x => x.Price); +var avgPrice = await db.query('Product').where(x => x.InStock).average(x => x.Price); +var cheapest = await db.query('Product').min(x => x.Price); +``` + +### GroupBy with Select + +```javascript +var grouped = await db.query('Product') + .groupBy(x => x.Category) + .select(g => ({ + Category: g.Key, + Count: g.count(), + TotalPrice: g.sum(x => x.Price), + AvgPrice: g.average(x => x.Price), + MinPrice: g.min(x => x.Price), + MaxPrice: g.max(x => x.Price) + })) + .toList(); +``` + +### GroupBy Aggregation Methods + +| Method | SQL | +|--------|-----| +| `g.Key` | Group key value | +| `g.count()` | `COUNT(*)` | +| `g.sum(x => x.Prop)` | `SUM(prop)` | +| `g.average(x => x.Prop)` | `AVG(prop)` | +| `g.min(x => x.Prop)` | `MIN(prop)` | +| `g.max(x => x.Prop)` | `MAX(prop)` | +| `g.toList()` | Get group items | +| `g.take(n).toList()` | Get first n items | + +### GroupBy with Items + +```javascript +var grouped = await db.query('Product') + .groupBy(x => x.Category) + .select(g => ({ + Category: g.Key, + Count: g.count(), + Items: g.take(10).toList() + })) + .toList(); +``` + +### GroupBy Security Limits + +| Limit | Default | Description | +|-------|---------|-------------| +| `MaxGroupCount` | No limit | Maximum groups | + +## Math Functions + +Math functions translate to SQL functions (ROUND, FLOOR, CEILING, ABS, etc.): + +```javascript +var products = await db.query('Product') + .where(x => Math.round(x.Price) > 100) + .toList(); + +var result = await db.query('Product') + .where(x => Math.abs(x.Balance) < 10 && Math.floor(x.Rating) >= 4) + .toList(); +``` + +## CRUD API + +Direct CRUD methods on the `db` object: + +| Method | Description | Returns | +|--------|-------------|---------| +| `db.get(entityName, id)` | Get by ID | `Promise` | +| `db.getCount(entityName)` | Get count | `Promise` | +| `db.exists(entityName)` | Check if any records exist | `Promise` | +| `db.insert(entityName, entity)` | Insert new | `Promise` | +| `db.update(entityName, entity)` | Update existing | `Promise` | +| `db.delete(entityName, id)` | Delete by ID | `Promise` | + +> **Note:** The `entityName` parameter can be either a **dynamic entity** (e.g., `"LowCodeDemo.Products.Product"`) or a **[reference entity](reference-entities.md)** (e.g., `"Volo.Abp.Identity.IdentityUser"`). However, `insert`, `update`, and `delete` operations only work on dynamic entities — reference entities are read-only. + +```javascript +// Get by ID +var product = await db.get('LowCodeDemo.Products.Product', id); + +// Insert +var newProduct = await db.insert('LowCodeDemo.Products.Product', { + Name: 'New Product', + Price: 99.99, + StockCount: 100 +}); + +// Update +var updated = await db.update('LowCodeDemo.Products.Product', { + Id: existingId, + Name: 'Updated Name', + Price: 149.99 +}); + +// Delete +await db.delete('LowCodeDemo.Products.Product', id); +``` + +## Context Object + +Available in [interceptors](interceptors.md): + +| Property | Type | Description | +|----------|------|-------------| +| `context.commandArgs` | object | Command arguments (data, entityId, commandName, entityName) | +| `context.commandArgs.getValue(name)` | function | Get property value | +| `context.commandArgs.setValue(name, value)` | function | Set property value | +| `context.commandArgs.hasValue(name)` | function | Check if a property exists | +| `context.commandArgs.removeValue(name)` | function | Remove a property value | +| `context.currentUser` | object | Current user info (see [Interceptors](interceptors.md) for full list) | +| `context.emailSender` | object | Email sending (`sendAsync`, `sendHtmlAsync`) | +| `context.log(msg)` | function | Log an informational message | +| `context.logWarning(msg)` | function | Log a warning message | +| `context.logError(msg)` | function | Log an error message | + +## Configuration + +You can configure scripting limits using `AbpLowCodeScriptingOptions` in your module's `ConfigureServices` method: + +```csharp +Configure(options => +{ + // Script execution limits (null = no limit) + options.Script.Timeout = TimeSpan.FromMinutes(1); + options.Script.MaxStatements = 100_000; + options.Script.MaxMemoryBytes = 512 * 1024 * 1024; // 512 MB + options.Script.MaxRecursionDepth = 500; + + // Query API limits (null = no limit) + options.Query.MaxLimit = 10_000; + options.Query.DefaultLimit = 1000; + options.Query.MaxExpressionNodes = 200; + options.Query.MaxExpressionDepth = 20; + options.Query.MaxArraySize = 500; + options.Query.MaxGroupCount = 500; +}); +``` + +All limits default to `null` (no limit). Configure them based on your security requirements and expected workload. + +## Security + +### Sandbox Constraints + +| Constraint | Default | Configurable | +|------------|---------|--------------| +| Script Timeout | No limit | Yes | +| Max Statements | No limit | Yes | +| Memory Limit | No limit | Yes | +| Recursion Depth | No limit | Yes | +| CLR Access | Disabled | No | + +### Query Security Limits + +| Limit | Default | Description | +|-------|---------|-------------| +| MaxExpressionNodes | No limit | Max AST nodes per expression | +| MaxExpressionDepth | No limit | Max nesting depth | +| MaxLimit (take) | No limit | Max records per query | +| DefaultLimit | No limit | Default if `take()` not specified | +| MaxArraySize (includes) | No limit | Max array size for IN operations | +| MaxGroupCount | No limit | Max groups in GroupBy | + +### Property Whitelist + +Only properties defined in the entity model can be queried. Accessing undefined properties throws a `SecurityException`. + +### SQL Injection Protection + +All values are parameterized: + +```javascript +var malicious = "'; DROP TABLE Products;--"; +// Safely treated as a literal string — no injection +var result = await db.query('Entity').where(x => x.Name.includes(malicious)).count(); +``` + +### Blocked Features + +The following are **not allowed** inside lambda expressions: `typeof`, `instanceof`, `in`, bitwise operators, `eval()`, `Function()`, `new RegExp()`, `new Date()`, `console.log()`, `setTimeout()`, `globalThis`, `window`, `__proto__`, `constructor`, `prototype`, `Reflect`, `Proxy`, `Symbol`. + +## Error Handling + +```javascript +// Abort operation with error +if (!context.commandArgs.getValue('Email').includes('@')) { + throw new Error('Valid email is required'); +} + +// Try-catch for safe execution +try { + var products = await db.query('Entity').where(x => x.Price > 0).toList(); +} catch (error) { + context.log('Query failed: ' + error.message); +} +``` + +## Best Practices + +1. **Use specific filters** — avoid querying all records without `where()` +2. **Set limits** — always use `take()` to limit results +3. **Validate early** — check inputs at the start of scripts +4. **Use `first()` for single results** — instead of `toList()[0]` +5. **Keep scripts focused** — one responsibility per interceptor +6. **Use `context.log()`** — never `console.log()` +7. **Handle nulls** — check for null before property access + +## Examples + +### Inventory Check on Order Creation + +```javascript +// Pre-create interceptor for Order +var productId = context.commandArgs.getValue('ProductId'); +var quantity = context.commandArgs.getValue('Quantity'); + +var product = await db.query('LowCodeDemo.Products.Product') + .where(x => x.Id === productId) + .first(); + +if (!product) { throw new Error('Product not found'); } +if (product.StockCount < quantity) { throw new Error('Insufficient stock'); } + +context.commandArgs.setValue('TotalAmount', product.Price * quantity); +``` + +### Sales Dashboard (Custom Endpoint) + +```javascript +var totalOrders = await db.query('LowCodeDemo.Orders.Order').count(); +var delivered = await db.query('LowCodeDemo.Orders.Order') + .where(x => x.IsDelivered === true).count(); +var revenue = await db.query('LowCodeDemo.Orders.Order') + .where(x => x.IsDelivered === true).sum(x => x.TotalAmount); + +return ok({ + orders: totalOrders, + delivered: delivered, + revenue: revenue +}); +``` + +## See Also + +* [Interceptors](interceptors.md) +* [Custom Endpoints](custom-endpoints.md) +* [model.json Structure](model-json.md) 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 d86e0b7de2..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) 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/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..d4249c4ea7 --- /dev/null +++ b/docs/en/package-version-changes.md @@ -0,0 +1,22 @@ +# Package Version Changes + +## 10.2.0-preview + +| Package | Old Version | New Version | PR | +|---------|-------------|-------------|-----| +| Blazorise | 1.8.8 | 2.0.0 | #24906 | +| Blazorise.Components | 1.8.8 | 2.0.0 | #24906 | +| Blazorise.DataGrid | 1.8.8 | 2.0.0 | #24906 | +| Blazorise.Snackbar | 1.8.8 | 2.0.0 | #24906 | +| TickerQ | 2.5.3 | 10.1.1 | #24916 | +| TickerQ.Dashboard | 2.5.3 | 10.1.1 | #24916 | +| TickerQ.EntityFrameworkCore | 2.5.3 | 10.1.1 | #24916 | +| TickerQ.Utilities | 2.5.3 | 10.1.1 | #24916 | + +## 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/release-info/migration-guides/abp-10-2.md b/docs/en/release-info/migration-guides/abp-10-2.md new file mode 100644 index 0000000000..64ab4f36e3 --- /dev/null +++ b/docs/en/release-info/migration-guides/abp-10-2.md @@ -0,0 +1,118 @@ +```json +//[doc-seo] +{ + "Description": "Upgrade your ABP solutions from v10.1 to v10.2 with this comprehensive migration guide, ensuring compatibility and new features with ABP v10.2." +} +``` + +# ABP Version 10.2 Migration Guide + +This document is a guide for upgrading ABP v10.1 solutions to ABP v10.2. There are some changes in this version that may affect your applications. Please read them carefully and apply the necessary changes to your application. + +> **Package Version Changes:** Before upgrading, review the [Package Version Changes](../../package-version-changes.md) document to see version changes on dependent NuGet packages and align your project with ABP's internal package versions. + +## Open-Source (Framework) + +This version only requires changes on the open-source side. **There are no breaking changes on the PRO side.** + +### Add New EF Core Migrations for Audit Logging Module + +In this version, we increased the maximum length limits for entity and property type full names in the [Audit Logging Module](../../modules/audit-logging.md) from 128/64/192 to 512 characters. This reduces truncation risk when persisting entity/property type information for entities with long CLR type names. + +**If you are using the Audit Logging module with Entity Framework Core, you need to create a new EF Core migration and apply it to your database** after upgrading to ABP 10.2. + +> See [#24846](https://github.com/abpframework/abp/pull/24846) for more details. + +### Ambient Auditing Disable/Enable Support + +In this version, we added ambient auditing disable/enable support to the ABP Framework. The `IAuditingHelper` interface now includes `DisableAuditing()` and `IsAuditingEnabled()` methods, allowing you to temporarily disable auditing for specific code blocks using a disposable scope pattern. + +**Action required:** If you have custom code that extends or overrides `CmsKitPageRouteValueTransformer`, note that it now injects `IAuditingHelper` to disable auditing during route matching. You may need to update your constructor to accept the new dependency. + +For most applications, no changes are required. The new API is additive and can be used when you need to disable auditing programmatically: + +```csharp +using (var scope = _auditingHelper.DisableAuditing()) +{ + // Auditing is disabled within this block +} +``` + +> See [#24718](https://github.com/abpframework/abp/pull/24718) for more details. + +### TickerQ Package Upgrade (2.5.3 → 10.1.1) + +**If you are using the TickerQ integration packages** (`Volo.Abp.TickerQ`, `Volo.Abp.BackgroundJobs.TickerQ`, or `Volo.Abp.BackgroundWorkers.TickerQ`), you need to apply the following breaking changes. TickerQ 10.1.1 only targets .NET 10.0 and contains several API changes. + +#### UseAbpTickerQ moved from IApplicationBuilder to IHost + +`UseAbpTickerQ` is now an extension on `IHost` (namespace `Microsoft.Extensions.Hosting`). Update your `OnApplicationInitializationAsync` method: + +```csharp +// Before +public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context) +{ + context.GetApplicationBuilder().UseAbpTickerQ(); +} + +// After +public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context) +{ + context.GetHost().UseAbpTickerQ(); +} +``` + +> **Important:** Do **not** resolve `IHost` from `context.ServiceProvider.GetRequiredService()`. That returns the internal generic host whose `Services` does not include `IApplicationBuilder`, which will cause a runtime exception from the TickerQ Dashboard. Always use `context.GetHost()`. + +#### Entity types renamed + +- `TimeTicker` → `TimeTickerEntity` +- `CronTicker` → `CronTickerEntity` + +Update your `using` statements and type references from `TickerQ.Utilities.Models.Ticker` to `TickerQ.Utilities.Entities`. + +#### TickerFunctionContext namespace moved + +`TickerFunctionContext` has moved from `TickerQ.Utilities.Models` to `TickerQ.Utilities.Base`. + +#### TickerRequestProvider.GetRequestAsync signature changed + +```csharp +// Before +var request = await TickerRequestProvider.GetRequestAsync(serviceProvider, context.Id, context.Type); + +// After +var request = await TickerRequestProvider.GetRequestAsync(context, cancellationToken); +``` + +#### Scheduler configuration API changed + +```csharp +// Before +options.SetInstanceIdentifier(name); +options.UpdateMissedJobCheckDelay(TimeSpan.FromSeconds(30)); + +// After +options.ConfigureScheduler(s => s.NodeIdentifier = name); +options.ConfigureScheduler(s => s.FallbackIntervalChecker = TimeSpan.FromSeconds(30)); +``` + +#### Dashboard configuration API changed + +```csharp +// Before +x.BasePath = "/tickerq"; +x.UseHostAuthentication = true; + +// After +x.SetBasePath("/tickerq"); +x.WithHostAuthentication(); +``` + +#### Other changes + +- **Typo fix:** `result.IsSucceded` → `result.IsSucceeded` +- **BatchParent removed:** `TimeTickerEntity.ParentId` now has a private setter. Use TickerQ's `FluentChainTickerBuilder` fluent API for job chaining. +- **BatchRunCondition renamed:** `BatchRunCondition? BatchRunCondition` → `RunCondition? RunCondition` in `AbpBackgroundJobsTimeTickerConfiguration` + +> See [#24916](https://github.com/abpframework/abp/pull/24916) for more details. diff --git a/docs/en/release-info/migration-guides/blazorise-2-0-migration.md b/docs/en/release-info/migration-guides/blazorise-2-0-migration.md new file mode 100644 index 0000000000..ad020cde0b --- /dev/null +++ b/docs/en/release-info/migration-guides/blazorise-2-0-migration.md @@ -0,0 +1,157 @@ +```json +//[doc-seo] +{ + "Description": "This migration guide provides a comprehensive overview of the necessary code changes when upgrading your ABP solution from Blazorise 1.x to 2.0, ensuring a smooth transition to the latest version." +} +``` + +# ABP Blazorise 1.x to 2.0 Migration Guide + +This document summarizes the required code changes when upgrading ABP solutions from Blazorise 1.x to 2.0. + +## 1. Package upgrades + +Upgrade Blazorise-related packages to `2.0.0`. + +- `Blazorise` +- `Blazorise.Components` +- `Blazorise.DataGrid` +- `Blazorise.Snackbar` +- `Blazorise.Bootstrap5` +- `Blazorise.Icons.FontAwesome` + +## 2. Input component renames + +Blazorise 2.0 uses new input component names: + +- `TextEdit` -> `TextInput` +- `MemoEdit` -> `MemoInput` +- `DateEdit` -> `DateInput` +- `TimeEdit` -> `TimeInput` +- `NumericEdit` -> `NumericInput` +- `ColorEdit` -> `ColorInput` +- `FileEdit` -> `FileInput` + +## 3. Binding API normalization to Value/ValueChanged + +Migrate old binding/value APIs to the new `Value` model. + +- `@bind-Text` -> `@bind-Value` +- `Text` / `TextChanged` -> `Value` / `ValueChanged` +- `@bind-Checked` -> `@bind-Value` +- `Checked` / `CheckedChanged` -> `Value` / `ValueChanged` +- `CheckedValue` / `CheckedValueChanged` -> `Value` / `ValueChanged` +- `@bind-Date` / `@bind-Time` -> `@bind-Value` +- `Date` / `DateChanged` -> `Value` / `ValueChanged` +- `Time` / `TimeChanged` -> `Value` / `ValueChanged` +- `@bind-SelectedValue` (for `Select`) -> `@bind-Value` +- `SelectedValue` / `SelectedValueChanged` (for `Select`) -> `Value` / `ValueChanged` +- `@bind-Checked` (for `Switch`) -> `@bind-Value` +- `Checked` / `CheckedChanged` (for `Switch`) -> `Value` / `ValueChanged` + +## 4. DatePicker and Select multiple changes + +### DatePicker range mode + +For `SelectionMode="DateInputSelectionMode.Range"`, the old `Dates` / `DatesChanged` parameters are replaced by the unified `Value` / `ValueChanged`. Use an array or `IReadOnlyList` as `TValue`: + +- `@bind-Dates` -> `@bind-Value` (with `TValue="DateTime[]"` or `TValue="IReadOnlyList"`) +- `Dates` / `DatesChanged` -> `Value` / `ValueChanged` + +### DatePicker single value mode + +For non-range `DatePicker` usage: + +- `Date` / `DateChanged` -> `Value` / `ValueChanged` + +### Select multiple mode + +For ` + One + Two + + +@code { + private int[] Selected { get; set; } = new int[] { 1 }; +} +``` + +### Empty SelectItem type requirement + +For empty placeholder items, set explicit `TValue`: + +- `` -> `` (or another correct type such as `Guid?`) + +## 5. DataGrid migration + +### 5.1 Page parameter rename + +- `CurrentPage` -> `Page` on `DataGrid` + +Important: `AbpExtensibleDataGrid` still uses `CurrentPage` (for example ABP v10.2). Do not rename it to `Page`. + +### 5.2 DisplayTemplate context type change + +Inside `DisplayTemplate`, use `context.Item` instead of directly using `context`. + +Typical updates: + +- `context.Property` -> `context.Item.Property` +- `Method(context)` -> `Method(context.Item)` +- `() => Method(context)` -> `() => Method(context.Item)` +- For custom template variable names, same rule applies: `row.Property` -> `row.Item.Property` + +The same rule also applies to action handlers in `DataGridEntityActionsColumn` and `DataGridCommandColumn` (such as `Clicked`, `Visible`, and `ConfirmationMessage`): + +- `Clicked="async () => await action.Clicked(context)"` -> `Clicked="async () => await action.Clicked(context.Item)"` +- `Visible="action.Visible(context)"` -> `Visible="action.Visible(context.Item)"` + +Important: This change applies to DataGrid template contexts only (`DisplayTemplate` in `DataGridColumn`, `DataGridEntityActionsColumn`, etc.). In non-DataGrid templates (for example `TreeView` `NodeContent`), `context` is already the item and should remain unchanged (for example `DeleteMenuItemAsync(context)`). + +### 5.3 Width type change (string -> Fluent sizing) + +DataGrid column `Width` moved from plain string to fluent sizing APIs: + +- `Width="30px"` -> `Width="Width.Px(30)"` +- `Width="60px"` -> `Width="Width.Px(60)"` +- `Width="0.5rem"` -> `Width="Width.Px(8)"` (or another equivalent pixel value) +- `Width="50%"` -> `Width="Width.Percent(50)"` or `Width="Width.Is50"` +- `Width="100%"` -> `Width="Width.Is100"` + +For dynamic string widths (for example `column.Width`), ABP introduces `BlazoriseFluentSizingParse.Parse(...)` to convert string values into `IFluentSizingStyle`. + +```csharp +Width="@BlazoriseFluentSizingParse.Parse(column.Width)" // column.Width is a string +``` + +## 6. Modal parameter placement changes + +`Size` and `Centered` should be placed on ``, not on ``. + +- `` -> `` + `` + +## 7. Other component parameter changes + +- `Dropdown RightAligned="true"` -> `Dropdown EndAligned="true"` +- `Autocomplete MinLength` -> `MinSearchLength` + +## 8. Notes from ABP migration implementation + +- Keep component-specific behavior in mind. Not every component follows exactly the same rename pattern. +- `Autocomplete` usage can still involve `SelectedValue` / `SelectedValueChanged`, depending on component API. +- `BarDropdown` and `Dropdown` are different components; align parameter names according to the actual component type. + +# Reference + +This document may not cover all Blazorise 2.0 changes. For completeness, refer to the official migration guide and release notes: + +- [Blazorise 2.0 - Release Notes](https://blazorise.com/news/release-notes/200) +- [Blazorise 2.0 - Migration Guide](https://blazorise.com/news/migration/200) diff --git a/docs/en/release-info/migration-guides/index.md b/docs/en/release-info/migration-guides/index.md index 61bb095434..abf3d87461 100644 --- a/docs/en/release-info/migration-guides/index.md +++ b/docs/en/release-info/migration-guides/index.md @@ -9,6 +9,7 @@ The following documents explain how to migrate your existing ABP applications. We write migration documents only if you need to take an action while upgrading your solution. Otherwise, you can easily upgrade your solution using the [abp update command](../upgrading.md). +- [10.x to 10.2](abp-10-2.md) - [10.0 to 10.1](abp-10-1.md) - [9.x to 10.0](abp-10-0.md) - [9.2 to 9.3](abp-9-3.md) 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 04dac9ef13..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" } } ```` diff --git a/docs/en/studio/overview.md b/docs/en/studio/overview.md index 256389f79d..f875e9ebf1 100644 --- a/docs/en/studio/overview.md +++ b/docs/en/studio/overview.md @@ -103,6 +103,8 @@ This pane is dedicated to managing Kubernetes services. It simplifies the proces 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: diff --git a/docs/en/studio/release-notes.md b/docs/en/studio/release-notes.md index 13e206127e..6bcb82790f 100644 --- a/docs/en/studio/release-notes.md +++ b/docs/en/studio/release-notes.md @@ -9,7 +9,45 @@ This document contains **brief release notes** for each ABP Studio release. Release notes only include **major features** and **visible enhancements**. Therefore, they don't include all the development done in the related version. -## 2.1.4 (2025-12-30) Latest +## 2.2.1 (2026-02-20) Latest + +* Added `abp run` and `abp watch` commands to Studio CLI. +* Added "Start and wait for ready" option in Solution Runner. +* Added Angular support to standard solution and module templates, with Angular templates upgraded to v21. +* Updated ABP Framework to `10.1.0` and LeptonX to `5.0.3`. +* Fixed various Solution Runner issues, including tooltips, log rendering, and stability problems. + +## 2.1.9 (2026-01-30) + +* Fixed MCP server CLI output problem. + +## 2.1.8 (2026-01-29) + +* Added Studio MCP server support to allow AI monitoring of applications linked to ABP Studio. +* Added `Open with > Cursor` option. +* Improved task failure handling and related log visibility. +* Fixed various Solution Runner issues, including memory/crash and log scrolling problems. + +## 2.1.7 (2026-01-23) + +* Added management UI for custom solution commands. +* Showed logs of background jobs. +* Updated Aspire to version `13.1`. + +## 2.1.6 (2026-01-13) + +* Enhanced runnable task logs window. +* Fixed tooltip line-height problem. + +## 2.1.5 (2026-01-13) + +* Added `version` command to Studio CLI. +* Updated ABP Framework to `10.0.2` and LeptonX to `5.0.2`. +* Fixed microservice solution build errors for Blazor Server and Angular. +* Improved Solution Runner behavior to avoid re-running applications after build errors. +* Replaced "Clear Cookies" with "Clear site data" in the tools section. + +## 2.1.4 (2025-12-30) * Fixed books sample for blazor-webapp tiered solution. * Fixed K8s cluster deployment issues for microservices. diff --git a/docs/en/studio/version-mapping.md b/docs/en/studio/version-mapping.md index f399c97390..5a70c5b916 100644 --- a/docs/en/studio/version-mapping.md +++ b/docs/en/studio/version-mapping.md @@ -11,7 +11,9 @@ 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.2.1 | 10.1.0 | +| 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/framework/Volo.Abp.slnx b/framework/Volo.Abp.slnx index cb15af402f..8b02869845 100644 --- a/framework/Volo.Abp.slnx +++ b/framework/Volo.Abp.slnx @@ -188,6 +188,7 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/ClientProxies/AbpApplicationConfigurationClientProxy.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/ClientProxies/AbpApplicationConfigurationClientProxy.cs index 62b582b01b..8b2001a17f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/ClientProxies/AbpApplicationConfigurationClientProxy.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/ClientProxies/AbpApplicationConfigurationClientProxy.cs @@ -1,12 +1,9 @@ // This file is part of AbpApplicationConfigurationClientProxy, you can customize it here // ReSharper disable once CheckNamespace -using Volo.Abp.DependencyInjection; - namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies; [RemoteService(false)] -[DisableConventionalRegistration] public partial class AbpApplicationConfigurationClientProxy { } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/ClientProxies/AbpTenantClientProxy.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/ClientProxies/AbpTenantClientProxy.cs index 8ca24d1317..f8bf2389e0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/ClientProxies/AbpTenantClientProxy.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/ClientProxies/AbpTenantClientProxy.cs @@ -2,13 +2,10 @@ // ReSharper disable once CheckNamespace using Volo.Abp; -using Volo.Abp.DependencyInjection; namespace Pages.Abp.MultiTenancy.ClientProxies; [RemoteService(false)] -[DisableConventionalRegistration] public partial class AbpTenantClientProxy { } - diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientCommonModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientCommonModule.cs index b7cd9d3a30..a9ab95cbc0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientCommonModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientCommonModule.cs @@ -1,6 +1,4 @@ using Microsoft.Extensions.DependencyInjection; -using Pages.Abp.MultiTenancy.ClientProxies; -using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies; using Volo.Abp.Authorization; using Volo.Abp.Caching; using Volo.Abp.Features; @@ -39,9 +37,6 @@ public class AbpAspNetCoreMvcClientCommonModule : AbpModule options.GlobalContributors.Add(); }); - context.Services.AddTransient(); - context.Services.AddTransient(); - var abpClaimsPrincipalFactoryOptions = context.Services.ExecutePreConfiguredActions(); if (abpClaimsPrincipalFactoryOptions.IsRemoteRefreshEnabled) { 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.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/JQueryForm/JQueryFormScriptContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/JQueryForm/JQueryFormScriptContributor.cs deleted file mode 100644 index cde8e83a59..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/JQueryForm/JQueryFormScriptContributor.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; -using Volo.Abp.AspNetCore.Mvc.UI.Bundling; -using Volo.Abp.AspNetCore.Mvc.UI.Packages.JQuery; -using Volo.Abp.Modularity; - -namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.JQueryForm; - -[DependsOn(typeof(JQueryScriptContributor))] -public class JQueryFormScriptContributor : BundleContributor -{ - public override void ConfigureBundle(BundleConfigurationContext context) - { - context.Files.AddIfNotContains("/libs/jquery-form/jquery.form.min.js"); - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs index 4bb1d80fef..728becdf6d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs @@ -4,7 +4,6 @@ using Volo.Abp.AspNetCore.Mvc.UI.Packages.BootstrapDatepicker; using Volo.Abp.AspNetCore.Mvc.UI.Packages.BootstrapDaterangepicker; using Volo.Abp.AspNetCore.Mvc.UI.Packages.DatatablesNetBs5; using Volo.Abp.AspNetCore.Mvc.UI.Packages.JQuery; -using Volo.Abp.AspNetCore.Mvc.UI.Packages.JQueryForm; using Volo.Abp.AspNetCore.Mvc.UI.Packages.JQueryValidationUnobtrusive; using Volo.Abp.AspNetCore.Mvc.UI.Packages.Lodash; using Volo.Abp.AspNetCore.Mvc.UI.Packages.Luxon; @@ -21,7 +20,6 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling; typeof(BootstrapScriptContributor), typeof(LodashScriptContributor), typeof(JQueryValidationUnobtrusiveScriptContributor), - typeof(JQueryFormScriptContributor), typeof(Select2ScriptContributor), typeof(DatatablesNetBs5ScriptContributor), typeof(Sweetalert2ScriptContributor), diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js index 7a2c08ca7e..3280408261 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js @@ -1,5 +1,5 @@ (function ($) { - if (!$ || !$.fn.ajaxForm) { + if (!$) { return; } @@ -87,11 +87,64 @@ userOptions.complete && userOptions.complete.apply(this, arguments); }; - return $form.ajaxForm(options); + $form.off("submit.abpAjaxForm").on("submit.abpAjaxForm", function (e) { + e.preventDefault(); + + var formEl = $form[0]; + + var formData = new FormData(formEl); + var arr = $form.serializeArray(); + + if (options.beforeSubmit && options.beforeSubmit.call(formEl, arr, $form) === false) { + return; + } + + var method = (options.method || $form.attr("method") || "POST").toUpperCase(); + var url = $form.attr("action") || window.location.href; + + var ajaxOptions = { + url: url, + type: method, + dataType: options.dataType, + timeout: options.timeout, + headers: { + "X-Requested-With": "XMLHttpRequest" + } + }; + + if (method === "GET") { + var query = $.param(arr); + if (query) { + url += (url.indexOf("?") >= 0 ? "&" : "?") + query; + } + ajaxOptions.url = url; + } else { + ajaxOptions.data = formData; + ajaxOptions.processData = false; + ajaxOptions.contentType = false; + } + + var jqXhrForComplete = null; + $.ajax(ajaxOptions) + .done(function (data, statusText, jqXhr) { + jqXhrForComplete = jqXhr; + options.success && options.success.call(formEl, data, statusText, jqXhr, $form); + }) + .fail(function (jqXhr, statusText, errorThrown) { + jqXhrForComplete = jqXhr; + options.error && options.error.call(formEl, jqXhr, statusText, errorThrown); + }) + .always(function (dataOrJqXhr, statusText, jqXhrOrError) { + var jqXhr = jqXhrForComplete || (dataOrJqXhr && dataOrJqXhr.status !== undefined ? dataOrJqXhr : jqXhrOrError); + options.complete && options.complete.call(formEl, jqXhr, statusText, $form); + }); + }); + + return $form; }; $.fn.abpAjaxForm.defaults = { method: 'POST' }; -})(jQuery); \ No newline at end of file +})(jQuery); 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/ApplicationConfigurations/AbpApplicationConfigurationScriptController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationScriptController.cs index de38e89104..8910ce1ce7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationScriptController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationScriptController.cs @@ -17,14 +17,14 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; [ApiExplorerSettings(IgnoreApi = true)] public class AbpApplicationConfigurationScriptController : AbpController { - protected readonly AbpApplicationConfigurationAppService ConfigurationAppService; + protected readonly IAbpApplicationConfigurationAppService ConfigurationAppService; protected readonly IJsonSerializer JsonSerializer; protected readonly AbpAspNetCoreMvcOptions Options; protected readonly IJavascriptMinifier JavascriptMinifier; protected readonly IAbpAntiForgeryManager AntiForgeryManager; public AbpApplicationConfigurationScriptController( - AbpApplicationConfigurationAppService configurationAppService, + IAbpApplicationConfigurationAppService configurationAppService, IJsonSerializer jsonSerializer, IOptions options, IJavascriptMinifier javascriptMinifier, 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/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs index 3a283cbe36..aab5b5cc2b 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -38,6 +38,18 @@ public static class AbpApplicationBuilderExtensions Check.NotNull(app, nameof(app)); app.ApplicationServices.GetRequiredService>().Value = app; + if (app is WebApplication webApplication) + { + app.ApplicationServices.GetRequiredService>().Value = webApplication; + } + if (app is IHost host) + { + app.ApplicationServices.GetRequiredService>().Value = host; + } + if (app is IEndpointRouteBuilder endpointRouteBuilder) + { + app.ApplicationServices.GetRequiredService>().Value = endpointRouteBuilder; + } var application = app.ApplicationServices.GetRequiredService(); var applicationLifetime = app.ApplicationServices.GetRequiredService(); @@ -59,6 +71,18 @@ public static class AbpApplicationBuilderExtensions Check.NotNull(app, nameof(app)); app.ApplicationServices.GetRequiredService>().Value = app; + if (app is WebApplication webApplication) + { + app.ApplicationServices.GetRequiredService>().Value = webApplication; + } + if (app is IHost host) + { + app.ApplicationServices.GetRequiredService>().Value = host; + } + if (app is IEndpointRouteBuilder endpointRouteBuilder) + { + app.ApplicationServices.GetRequiredService>().Value = endpointRouteBuilder; + } var application = app.ApplicationServices.GetRequiredService(); var applicationLifetime = app.ApplicationServices.GetRequiredService(); diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ApplicationInitializationContextExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ApplicationInitializationContextExtensions.cs index 1e361d1587..930b081df0 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ApplicationInitializationContextExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ApplicationInitializationContextExtensions.cs @@ -1,7 +1,9 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Volo.Abp.DependencyInjection; @@ -21,6 +23,42 @@ public static class ApplicationInitializationContextExtensions return context.ServiceProvider.GetRequiredService>().Value; } + public static IHost GetHost(this ApplicationInitializationContext context) + { + var host = context.ServiceProvider.GetRequiredService>().Value; + Check.NotNull(host, nameof(host)); + return host; + } + + public static IHost? GetHostOrNull(this ApplicationInitializationContext context) + { + return context.ServiceProvider.GetRequiredService>().Value; + } + + public static IEndpointRouteBuilder GetEndpointRouteBuilder(this ApplicationInitializationContext context) + { + var endpointRouteBuilder = context.ServiceProvider.GetRequiredService>().Value; + Check.NotNull(endpointRouteBuilder, nameof(endpointRouteBuilder)); + return endpointRouteBuilder; + } + + public static IEndpointRouteBuilder? GetEndpointRouteBuilderOrNull(this ApplicationInitializationContext context) + { + return context.ServiceProvider.GetRequiredService>().Value; + } + + public static WebApplication GetWebApplication(this ApplicationInitializationContext context) + { + var webApplication = context.ServiceProvider.GetRequiredService>().Value; + Check.NotNull(webApplication, nameof(webApplication)); + return webApplication; + } + + public static WebApplication? GetWebApplicationOrNull(this ApplicationInitializationContext context) + { + return context.ServiceProvider.GetRequiredService>().Value; + } + public static IWebHostEnvironment GetEnvironment(this ApplicationInitializationContext context) { return context.ServiceProvider.GetRequiredService(); diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs index 405e49753c..a457d3b1eb 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs @@ -2,7 +2,9 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting.StaticWebAssets; using Microsoft.AspNetCore.RequestLocalization; +using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.FileProviders; using MyCSharp.HttpUserAgentParser.DependencyInjection; using Volo.Abp.AspNetCore.Auditing; @@ -57,6 +59,9 @@ public class AbpAspNetCoreModule : AbpModule AddAspNetServices(context.Services); context.Services.AddObjectAccessor(); + context.Services.AddObjectAccessor(); + context.Services.AddObjectAccessor(); + context.Services.AddObjectAccessor(); context.Services.AddAbpDynamicOptions(); StaticWebAssetsLoader.UseStaticWebAssets(context.Services.GetHostingEnvironment(), context.Services.GetConfiguration()); 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.BackgroundJobs.TickerQ/Volo.Abp.BackgroundJobs.TickerQ.csproj b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo.Abp.BackgroundJobs.TickerQ.csproj index df450f5ff6..41d70914a4 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo.Abp.BackgroundJobs.TickerQ.csproj +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo.Abp.BackgroundJobs.TickerQ.csproj @@ -4,7 +4,7 @@ - netstandard2.1;net8.0;net9.0;net10.0 + net10.0 enable Nullable Volo.Abp.BackgroundJobs.TickerQ diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs index b5ed598932..3d93fc68a1 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs @@ -65,7 +65,7 @@ public class AbpBackgroundJobsTickerQModule : AbpModule using (var scope = serviceProvider.CreateScope()) { var jobExecuter = serviceProvider.GetRequiredService(); - var args = await TickerRequestProvider.GetRequestAsync(serviceProvider, context.Id, context.Type); + var args = await TickerRequestProvider.GetRequestAsync(context, cancellationToken); var jobType = options.GetJob(typeof(TArgs)).JobType; var jobExecutionContext = new JobExecutionContext(scope.ServiceProvider, jobType, args!, cancellationToken: cancellationToken); await jobExecuter.ExecuteAsync(jobExecutionContext); diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs index 65b150ea48..ecceaeb28a 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs @@ -1,4 +1,3 @@ -using System; using TickerQ.Utilities.Enums; namespace Volo.Abp.BackgroundJobs.TickerQ; @@ -11,7 +10,5 @@ public class AbpBackgroundJobsTimeTickerConfiguration public TickerTaskPriority? Priority { get; set; } - public Guid? BatchParent { get; set; } - - public BatchRunCondition? BatchRunCondition { get; set; } + public RunCondition? RunCondition { get; set; } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs index b1a2dbe36d..638c1845f2 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs @@ -2,8 +2,8 @@ using System.Threading.Tasks; using Microsoft.Extensions.Options; using TickerQ.Utilities; +using TickerQ.Utilities.Entities; using TickerQ.Utilities.Interfaces.Managers; -using TickerQ.Utilities.Models.Ticker; using Volo.Abp.DependencyInjection; namespace Volo.Abp.BackgroundJobs.TickerQ; @@ -11,12 +11,12 @@ namespace Volo.Abp.BackgroundJobs.TickerQ; [Dependency(ReplaceServices = true)] public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientDependency { - protected ITimeTickerManager TimeTickerManager { get; } + protected ITimeTickerManager TimeTickerManager { get; } protected AbpBackgroundJobOptions Options { get; } protected AbpBackgroundJobsTickerQOptions TickerQOptions { get; } public AbpTickerQBackgroundJobManager( - ITimeTickerManager timeTickerManager, + ITimeTickerManager timeTickerManager, IOptions options, IOptions tickerQOptions) { @@ -28,7 +28,7 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { var job = Options.GetJob(typeof(TArgs)); - var timeTicker = new TimeTicker + var timeTicker = new TimeTickerEntity { Id = Guid.NewGuid(), Function = job.JobName, @@ -41,11 +41,10 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD { timeTicker.Retries = config.Retries ?? timeTicker.Retries; timeTicker.RetryIntervals = config.RetryIntervals ?? timeTicker.RetryIntervals; - timeTicker.BatchParent = config.BatchParent ?? timeTicker.BatchParent; - timeTicker.BatchRunCondition = config.BatchRunCondition ?? timeTicker.BatchRunCondition; + timeTicker.RunCondition = config.RunCondition ?? timeTicker.RunCondition; } var result = await TimeTickerManager.AddAsync(timeTicker); - return !result.IsSucceded ? timeTicker.Id.ToString() : result.Result.Id.ToString(); + return !result.IsSucceeded ? timeTicker.Id.ToString() : result.Result.Id.ToString(); } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo.Abp.BackgroundWorkers.TickerQ.csproj b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo.Abp.BackgroundWorkers.TickerQ.csproj index 2c4ab29c97..b62024131d 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo.Abp.BackgroundWorkers.TickerQ.csproj +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo.Abp.BackgroundWorkers.TickerQ.csproj @@ -4,7 +4,7 @@ - netstandard2.1;net8.0;net9.0;net10.0 + net10.0 enable Nullable Volo.Abp.BackgroundWorkers.TickerQ diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQModule.cs index 3fb15a50b8..788eee1759 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQModule.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using TickerQ.Utilities.Entities; using TickerQ.Utilities.Interfaces.Managers; -using TickerQ.Utilities.Models.Ticker; using Volo.Abp.Modularity; using Volo.Abp.TickerQ; @@ -14,11 +14,11 @@ public class AbpBackgroundWorkersTickerQModule : AbpModule public override async Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context) { var abpTickerQBackgroundWorkersProvider = context.ServiceProvider.GetRequiredService(); - var cronTickerManager = context.ServiceProvider.GetRequiredService>(); + var cronTickerManager = context.ServiceProvider.GetRequiredService>(); var abpBackgroundWorkersTickerQOptions = context.ServiceProvider.GetRequiredService>().Value; foreach (var backgroundWorker in abpTickerQBackgroundWorkersProvider.BackgroundWorkers) { - var cronTicker = new CronTicker + var cronTicker = new CronTickerEntity { Function = backgroundWorker.Value.Function, Expression = backgroundWorker.Value.CronExpression diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQPeriodicBackgroundWorkerInvoker.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQPeriodicBackgroundWorkerInvoker.cs index 17cf7cdc87..f09a271017 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQPeriodicBackgroundWorkerInvoker.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQPeriodicBackgroundWorkerInvoker.cs @@ -3,7 +3,7 @@ using System.Linq.Expressions; using System.Reflection; using System.Threading; using System.Threading.Tasks; -using TickerQ.Utilities.Models; +using TickerQ.Utilities.Base; namespace Volo.Abp.BackgroundWorkers.TickerQ; diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseFluentSizingParse.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseFluentSizingParse.cs new file mode 100644 index 0000000000..5492623be7 --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseFluentSizingParse.cs @@ -0,0 +1,87 @@ +using Blazorise; +using System; +using System.Globalization; +using System.Text.RegularExpressions; + +namespace Volo.Abp.BlazoriseUI; + +public static class BlazoriseFluentSizingParse +{ + private static readonly Regex SizingPattern = new Regex( + @"^(\d+(?:\.\d+)?)(px|rem|em|ch|vw|vh|%)$", + RegexOptions.IgnoreCase | RegexOptions.Compiled); + + /// + /// Parses a CSS size string into an IFluentSizingStyle. + /// Supported formats (based on Blazorise FluentSizing source): + /// Fixed units : 10px, 10rem, 10em, 10ch + /// Viewport units : 10vw, 10vh + /// Percentage : 25%, 33%, 50%, 66%, 75%, 100% -> maps to SizingSize enum (CSS class) + /// other % values -> inline style + /// Keyword : auto -> SizingSize.Auto + /// CSS variable : var(--my-var), --my-var, or my-var (all handled by WithVariable) + /// + public static IFluentSizingStyle Parse(string value, SizingType sizingType = SizingType.None) + { + var fluentSizing = new FluentSizing(sizingType); + + if (string.IsNullOrWhiteSpace(value)) + { + return fluentSizing; + } + + value = value.Trim(); + + // "auto" -> SizingSize.Auto + if (value.Equals("auto", StringComparison.OrdinalIgnoreCase)) + { + return (IFluentSizingStyle)fluentSizing.WithSize(SizingSize.Auto); + } + + // CSS variable: + // "var(--my-var)" -> used as-is + // "--my-var" -> wrapped as var(--my-var) + // "my-var" -> prepended "--" and wrapped as var(--my-var) + // All three cases are handled correctly by Blazorise's GetCssVariableValue. + if (value.StartsWith("var(", StringComparison.Ordinal) || value.StartsWith("--", StringComparison.Ordinal)) + { + return fluentSizing.WithVariable(value); + } + + var match = SizingPattern.Match(value); + + if (!match.Success) + { + return fluentSizing; + } + + var number = double.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture); + var unit = match.Groups[2].Value.ToLowerInvariant(); + + if (unit == "%") + { + // Standard percentages map to SizingSize enum (generates CSS class via class provider) + var sizingSize = number switch + { + 25 => SizingSize.Is25, + 33 => SizingSize.Is33, + 50 => SizingSize.Is50, + 66 => SizingSize.Is66, + 75 => SizingSize.Is75, + 100 => SizingSize.Is100, + _ => SizingSize.Default + }; + + if (sizingSize != SizingSize.Default) + { + return (IFluentSizingStyle)fluentSizing.WithSize(sizingSize); + } + + // Non-standard percentage falls back to inline style + return fluentSizing.WithSize("%", number); + } + + // px, rem, em, ch, vw, vh -> inline style via WithSize(unit, size) + return fluentSizing.WithSize(unit, number); + } +} diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs index 5794021488..b8a31d6a54 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs @@ -211,7 +211,7 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions { foreach (var attribute in propertyInfo.Attributes) { - var inputTypeByAttribute = GetInputTypeFromAttributeOrNull(attribute); + var inputTypeByAttribute = GetInputTypeFromAttributeOrNull(attribute, propertyInfo.Type); if (inputTypeByAttribute != null) { return inputTypeByAttribute; @@ -226,7 +226,7 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions return propertyInfo.Type.IsEnum || TypeHelper.IsNullableEnum(propertyInfo.Type); } - private static Type? GetInputTypeFromAttributeOrNull(Attribute attribute) + private static Type? GetInputTypeFromAttributeOrNull(Attribute attribute, Type propertyType) { var hasTextEditSupport = TextEditSupportedAttributeTypes.Any(t => t == attribute.GetType()); @@ -235,7 +235,6 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions return typeof(TextExtensionProperty<,>); } - if (attribute is DataTypeAttribute dataTypeAttribute) { switch (dataTypeAttribute.DataType) @@ -247,7 +246,9 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions return typeof(TextExtensionProperty<,>); case DataType.Date: case DataType.DateTime: - return typeof(DateTimeExtensionProperty<,>); + return propertyType == typeof(DateTimeOffset) || propertyType == typeof(DateTimeOffset?) + ? typeof(DateTimeOffsetExtensionProperty<,>) + : typeof(DateTimeExtensionProperty<,>); case DataType.Time: return typeof(TimeExtensionProperty<,>); case DataType.MultilineText: @@ -265,11 +266,16 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions return typeof(CheckExtensionProperty<,>); } - if (type == typeof(DateTime)) + if (type == typeof(DateTime) || type == typeof(DateTime?)) { return typeof(DateTimeExtensionProperty<,>); } + if (type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?)) + { + return typeof(DateTimeOffsetExtensionProperty<,>); + } + if (NumberTypes.Contains(type)) { return typeof(TextExtensionProperty<,>); diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor index 44b8aa46e4..6f1a82df5d 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor @@ -7,7 +7,7 @@ ReadData="@ReadData" TotalItems="@TotalItems" ShowPager="@ShowPager" - CurrentPage="@CurrentPage" + Page="@CurrentPage" PageSize="@PageSize" Responsive="@Responsive" Striped @@ -44,9 +44,9 @@ @@ -54,10 +54,10 @@ else { @@ -73,17 +73,17 @@ { @if (column.ValueConverter == null) { - + - @RenderCustomTableColumnComponent(column.Component, context!) + @RenderCustomTableColumnComponent(column.Component, context.Item!) } else { - + - @RenderCustomTableColumnComponent(column.Component, context!) + @RenderCustomTableColumnComponent(column.Component, context.Item!) } @@ -92,11 +92,11 @@ { if (!ExtensionPropertiesRegex.IsMatch(column.Data)) { - @if (column.ValueConverter == null) + @if (column.ValueConverter == null && !IsDateTimeColumn(column)) { - @((MarkupString)GetConvertedFieldValue(context, column)) + @((MarkupString)GetConvertedFieldValue(context.Item, column)) } } else { - + @{ var entity = context as IHasExtraProperties; @@ -140,18 +140,11 @@ { if (column.ValueConverter != null) { - @((MarkupString)GetConvertedFieldValue(context, column)) + @((MarkupString)GetConvertedFieldValue(context.Item, column)) } else { - if (column.DisplayFormat == null) - { - @(propertyValue) - } - else - { - @(string.Format(column.DisplayFormatProvider, column.DisplayFormat, propertyValue)) - } + @((MarkupString)GetConvertedFieldValue(propertyValue, column)) } } } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs index 682643893e..be8ede1cb2 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Text.RegularExpressions; using Blazorise.DataGrid; using Blazorise.Extensions; @@ -7,6 +8,7 @@ using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.Localization; using Volo.Abp.AspNetCore.Components.Web.Extensibility.TableColumns; +using Volo.Abp.Timing; namespace Volo.Abp.BlazoriseUI.Components; @@ -45,6 +47,9 @@ public partial class AbpExtensibleDataGrid : ComponentBase [Inject] public IStringLocalizer UiLocalizer { get; set; } = default!; + [Inject] + public IClock Clock { get; set; } = default!; + protected virtual RenderFragment RenderCustomTableColumnComponent(Type type, object data) { return (builder) => @@ -57,13 +62,67 @@ public partial class AbpExtensibleDataGrid : ComponentBase protected virtual string GetConvertedFieldValue(TItem item, TableColumn columnDefinition) { - var convertedValue = columnDefinition.ValueConverter!.Invoke(item!); + if (columnDefinition.ValueConverter != null) + { + var convertedValue = columnDefinition.ValueConverter.Invoke(item!); + if (!columnDefinition.DisplayFormat.IsNullOrEmpty()) + { + return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, convertedValue); + } + + return convertedValue; + } + + var propertyInfo = item!.GetType().GetProperty(columnDefinition.Data); + return GetConvertedFieldValue(propertyInfo?.GetValue(item), columnDefinition); + } + + protected virtual string GetConvertedFieldValue(object? value, TableColumn columnDefinition) + { + if (value is DateTime dateTime) + { + var converted = Clock.ConvertToUserTime(dateTime); + if (!columnDefinition.DisplayFormat.IsNullOrEmpty()) + { + return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, converted); + } + + return converted.ToString(columnDefinition.DisplayFormatProvider as CultureInfo ?? CultureInfo.CurrentCulture); + } + + if (value is DateTimeOffset dateTimeOffset) + { + var converted = Clock.ConvertToUserTime(dateTimeOffset); + if (!columnDefinition.DisplayFormat.IsNullOrEmpty()) + { + return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, converted); + } + + return converted.ToString(columnDefinition.DisplayFormatProvider as CultureInfo ?? CultureInfo.CurrentCulture); + } + + if (value == null) + { + return string.Empty; + } + if (!columnDefinition.DisplayFormat.IsNullOrEmpty()) { - return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, - convertedValue); + return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, value); + } + + return value.ToString() ?? string.Empty; + } + + protected virtual bool IsDateTimeColumn(TableColumn columnDefinition) + { + var propertyInfo = typeof(TItem).GetProperty(columnDefinition.Data); + if (propertyInfo == null) + { + return false; } - return convertedValue; + var propertyType = Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType; + return propertyType == typeof(DateTime) || propertyType == typeof(DateTimeOffset); } } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.razor.cs index 0180833054..b48a3744fc 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.razor.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.razor.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Threading.Tasks; +using Blazorise; using Blazorise.DataGrid; using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Components; @@ -21,13 +22,13 @@ public partial class DataGridEntityActionsColumn : DataGridColumn protected virtual ValueTask SetDefaultValuesAsync() { Caption = UiLocalizer["Actions"]; - Width = "150px"; + Width = Blazorise.Width.Px(150); Sortable = false; Field = ResolveFieldName(); - + return ValueTask.CompletedTask; } - + protected virtual string ResolveFieldName() { var props = typeof(TItem).GetProperties(); diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/CheckExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/CheckExtensionProperty.razor index eaea3c844a..4ec9b868e0 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/CheckExtensionProperty.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/CheckExtensionProperty.razor @@ -7,7 +7,7 @@ { - + @PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory) diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeExtensionProperty.razor index 0500d29c32..5c54a95112 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeExtensionProperty.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeExtensionProperty.razor @@ -10,15 +10,15 @@ @PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory) - + @bind-Value="@Value"> - + } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeOffsetExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeOffsetExtensionProperty.razor new file mode 100644 index 0000000000..045928fffa --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeOffsetExtensionProperty.razor @@ -0,0 +1,24 @@ +@typeparam TEntity +@typeparam TResourceType +@using Volo.Abp.BlazoriseUI +@using Volo.Abp.Localization +@using Volo.Abp.ObjectExtending +@inherits ExtensionPropertyComponentBase + +@if (PropertyInfo != null && Entity != null) +{ + + + @PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory) + + + + + + + +} diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeOffsetExtensionProperty.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeOffsetExtensionProperty.razor.cs new file mode 100644 index 0000000000..41488c0ea8 --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeOffsetExtensionProperty.razor.cs @@ -0,0 +1,29 @@ +using System; +using Volo.Abp.Data; + +namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending; + +public partial class DateTimeOffsetExtensionProperty + where TEntity : IHasExtraProperties +{ + protected DateTimeOffset? Value { + get { + var raw = Entity.GetProperty(PropertyInfo.Name); + return raw switch + { + null => null, + DateTimeOffset dto => dto, + DateTime dt => dt.Kind switch + { + DateTimeKind.Utc => new DateTimeOffset(dt, TimeSpan.Zero), + DateTimeKind.Local => new DateTimeOffset(dt), + _ => new DateTimeOffset(DateTime.SpecifyKind(dt, DateTimeKind.Utc), TimeSpan.Zero) + }, + _ => null + }; + } + set { + Entity.SetProperty(PropertyInfo.Name, value, false); + } + } +} diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor index 6217a75543..4c1094421b 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor @@ -6,16 +6,17 @@ @PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory) - - + + + + diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor index 605158aec0..79d2f06bc5 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor @@ -6,7 +6,7 @@ @PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory) - @foreach (var item in SelectItems) { diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextAreaExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextAreaExtensionProperty.razor index 6acf7ba69d..515869efea 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextAreaExtensionProperty.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextAreaExtensionProperty.razor @@ -1,4 +1,4 @@ -@typeparam TEntity +@typeparam TEntity @typeparam TResourceType @using Volo.Abp.BlazoriseUI @using Volo.Abp.Localization @@ -9,11 +9,11 @@ @PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory) - + - + } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextExtensionProperty.razor index e9d3d7031e..0dfd4a19d2 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextExtensionProperty.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextExtensionProperty.razor @@ -9,11 +9,11 @@ @PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory) - + - + } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor index 03be9f438a..a0b2333714 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor @@ -7,12 +7,12 @@ { - @PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)--> - + @PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory) + - + } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor index 9e0d86c112..c480711a93 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor @@ -1,5 +1,5 @@ - - + + @if (!Title.IsNullOrEmpty()) { 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.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.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EfCoreRepositoryExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EfCoreRepositoryExtensions.cs index 614ba135ff..d054733785 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EfCoreRepositoryExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EfCoreRepositoryExtensions.cs @@ -49,6 +49,6 @@ public static class EfCoreRepositoryExtensions public static IQueryable AsNoTrackingIf(this IQueryable queryable, bool condition) where TEntity : class, IEntity { - return condition ? queryable.AsNoTracking() : queryable; + return condition ? queryable.AsNoTracking() : queryable.AsTracking(); } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs index ff4aeabc44..cf8f994d42 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs @@ -478,9 +478,7 @@ public class EfCoreRepository : EfCoreRepository e.Id).FirstOrDefaultAsync(e => e.Id!.Equals(id), GetCancellationToken(cancellationToken)) - : !ShouldTrackingEntityChange() - ? await (await GetQueryableAsync()).OrderBy(e => e.Id).FirstOrDefaultAsync(e => e.Id!.Equals(id), GetCancellationToken(cancellationToken)) - : await (await GetDbSetAsync()).FindAsync(new object[] { id! }, GetCancellationToken(cancellationToken)); + : await (await GetQueryableAsync()).OrderBy(e => e.Id).FirstOrDefaultAsync(e => e.Id!.Equals(id), GetCancellationToken(cancellationToken)); } public virtual async Task DeleteAsync(TKey id, bool autoSave = false, CancellationToken cancellationToken = default) 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 07ea443fdf..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(); + } } } @@ -994,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/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.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.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.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.ObjectMapping/Volo/Abp/ObjectMapping/ObjectMappingHelper.cs b/framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/ObjectMappingHelper.cs index 5949edaba9..3bc1a1389b 100644 --- a/framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/ObjectMappingHelper.cs +++ b/framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/ObjectMappingHelper.cs @@ -55,10 +55,17 @@ public static class ObjectMappingHelper return true; } - if (type.IsGenericType && - supportedCollectionTypes.Contains(type.GetGenericTypeDefinition()) || + if ((type.IsGenericType && + supportedCollectionTypes.Contains(type.GetGenericTypeDefinition())) || type.GetInterfaces().Any(i => i.IsGenericType && supportedCollectionTypes.Contains(i.GetGenericTypeDefinition()))) { + if (!type.IsGenericType) + { + elementType = null!; + definitionGenericType = null!; + return false; + } + elementType = type.GetGenericArguments()[0]; definitionGenericType = type.GetGenericTypeDefinition(); if (definitionGenericType == typeof(IEnumerable<>) || 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.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenServiceCollectionExtensions.cs index d63ca833eb..b81aa8bf77 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenServiceCollectionExtensions.cs @@ -77,7 +77,8 @@ public static class AbpSwaggerGenServiceCollectionExtensions string[]? scopes = null, string[]? flows = null, string? discoveryEndpoint = null, - Action? setupAction = null) + Action? setupAction = null, + string oidcAuthenticationScheme = "oidc") { var discoveryUrl = discoveryEndpoint != null ? $"{discoveryEndpoint.TrimEnd('/')}/.well-known/openid-configuration": @@ -96,7 +97,7 @@ public static class AbpSwaggerGenServiceCollectionExtensions .AddSwaggerGen( options => { - options.AddSecurityDefinition("oidc", new OpenApiSecurityScheme + options.AddSecurityDefinition(oidcAuthenticationScheme, new OpenApiSecurityScheme { Type = SecuritySchemeType.OpenIdConnect, OpenIdConnectUrl = new Uri(RemoveTenantPlaceholders(discoveryUrl)) @@ -104,7 +105,7 @@ public static class AbpSwaggerGenServiceCollectionExtensions options.AddSecurityRequirement(document => new OpenApiSecurityRequirement() { - [new OpenApiSecuritySchemeReference("oauth2", document)] = [] + [new OpenApiSecuritySchemeReference(oidcAuthenticationScheme, document)] = [] }); setupAction?.Invoke(options); 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/src/Volo.Abp.TickerQ/Microsoft/AspNetCore/Builder/AbpTickerQApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.TickerQ/Microsoft/Extensions/Hosting/AbpTickerQApplicationBuilderExtensions.cs similarity index 61% rename from framework/src/Volo.Abp.TickerQ/Microsoft/AspNetCore/Builder/AbpTickerQApplicationBuilderExtensions.cs rename to framework/src/Volo.Abp.TickerQ/Microsoft/Extensions/Hosting/AbpTickerQApplicationBuilderExtensions.cs index 4e81565e99..4d1897b200 100644 --- a/framework/src/Volo.Abp.TickerQ/Microsoft/AspNetCore/Builder/AbpTickerQApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.TickerQ/Microsoft/Extensions/Hosting/AbpTickerQApplicationBuilderExtensions.cs @@ -1,16 +1,17 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using TickerQ.DependencyInjection; using TickerQ.Utilities; using TickerQ.Utilities.Enums; using Volo.Abp.TickerQ; -namespace Microsoft.AspNetCore.Builder; +namespace Microsoft.Extensions.Hosting; public static class AbpTickerQApplicationBuilderExtensions { - public static IApplicationBuilder UseAbpTickerQ(this IApplicationBuilder app, TickerQStartMode qStartMode = TickerQStartMode.Immediate) + public static IHost UseAbpTickerQ(this IHost app, TickerQStartMode qStartMode = TickerQStartMode.Immediate) { - var abpTickerQFunctionProvider = app.ApplicationServices.GetRequiredService(); + var abpTickerQFunctionProvider = app.Services.GetRequiredService(); TickerFunctionProvider.RegisterFunctions(abpTickerQFunctionProvider.Functions); TickerFunctionProvider.RegisterRequestType(abpTickerQFunctionProvider.RequestTypes); diff --git a/framework/src/Volo.Abp.TickerQ/Volo.Abp.TickerQ.csproj b/framework/src/Volo.Abp.TickerQ/Volo.Abp.TickerQ.csproj index 89a037bab7..51649a9a86 100644 --- a/framework/src/Volo.Abp.TickerQ/Volo.Abp.TickerQ.csproj +++ b/framework/src/Volo.Abp.TickerQ/Volo.Abp.TickerQ.csproj @@ -4,7 +4,7 @@ - netstandard2.1;net8.0;net9.0;net10.0 + net10.0 enable Nullable Volo.Abp.TickerQ diff --git a/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQModule.cs b/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQModule.cs index b6c140e962..82b47294e1 100644 --- a/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQModule.cs +++ b/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQModule.cs @@ -10,7 +10,10 @@ public class AbpTickerQModule : AbpModule { context.Services.AddTickerQ(options => { - options.SetInstanceIdentifier(context.Services.GetApplicationName()); + options.ConfigureScheduler(scheduler => + { + scheduler.NodeIdentifier = context.Services.GetApplicationName(); + }); }); } } 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.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/ChangeTracking/ChangeTrackingInterceptor_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ChangeTracking/ChangeTrackingInterceptor_Tests.cs index 87b487b68a..9581df3a19 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ChangeTracking/ChangeTrackingInterceptor_Tests.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ChangeTracking/ChangeTrackingInterceptor_Tests.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; using Shouldly; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.ChangeTracking; @@ -83,6 +84,96 @@ public class ChangeTrackingInterceptor_Tests : TestAppTestBase>(); + + Guid personId = default; + await WithUnitOfWorkAsync(async () => + { + var p = await repository.FindAsync(x => x.Name == "people1"); + p.ShouldNotBeNull(); + personId = p.Id; + }); + + // Simulate global NoTracking configured on DbContext (e.g. optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)) + await WithUnitOfWorkAsync(async () => + { + var db = await repository.GetDbContextAsync(); + db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + db.ChangeTracker.Entries().Count().ShouldBe(0); + + // FindAsync(id): ShouldTrackingEntityChange()=true, GetQueryableAsync() uses AsTracking() to override global NoTracking + var person = await repository.FindAsync(personId, includeDetails: false); + person.ShouldNotBeNull(); + db.ChangeTracker.Entries().Count().ShouldBe(1); + db.Entry(person).State.ShouldBe(EntityState.Unchanged); + }); + + await WithUnitOfWorkAsync(async () => + { + var db = await repository.GetDbContextAsync(); + db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + db.ChangeTracker.Entries().Count().ShouldBe(0); + + // FindAsync(predicate): same - AsTracking() overrides global NoTracking + var person = await repository.FindAsync(x => x.Name == "people1"); + person.ShouldNotBeNull(); + db.ChangeTracker.Entries().Count().ShouldBe(1); + db.Entry(person).State.ShouldBe(EntityState.Unchanged); + }); + + await WithUnitOfWorkAsync(async () => + { + var db = await repository.GetDbContextAsync(); + db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + db.ChangeTracker.Entries().Count().ShouldBe(0); + + // GetListAsync: same - AsTracking() overrides global NoTracking + var list = await repository.GetListAsync(); + list.Count.ShouldBeGreaterThan(0); + db.ChangeTracker.Entries().Count().ShouldBe(list.Count); + }); + } + + [Fact] + public async Task Repository_Should_Respect_NoTracking_When_EntityChangeTracking_Is_Disabled_With_Global_NoTracking() + { + await AddSomePeopleAsync(); + + var repository = GetRequiredService>(); + + Guid personId = default; + await WithUnitOfWorkAsync(async () => + { + var p = await repository.FindAsync(x => x.Name == "people1"); + p.ShouldNotBeNull(); + personId = p.Id; + }); + + await WithUnitOfWorkAsync(async () => + { + var db = await repository.GetDbContextAsync(); + db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + db.ChangeTracker.Entries().Count().ShouldBe(0); + + // When tracking is explicitly disabled, entity should NOT be tracked regardless of global setting + using (repository.DisableTracking()) + { + var person = await repository.FindAsync(personId, includeDetails: false); + person.ShouldNotBeNull(); + db.ChangeTracker.Entries().Count().ShouldBe(0); + + var list = await repository.GetListAsync(); + list.Count.ShouldBeGreaterThan(0); + db.ChangeTracker.Entries().Count().ShouldBe(0); + } + }); + } + private async Task AddSomePeopleAsync() { var repository = GetRequiredService>(); diff --git a/framework/test/Volo.Abp.ObjectMapping.Tests/Volo/Abp/ObjectMapping/ObjectMappingHelper_Tests.cs b/framework/test/Volo.Abp.ObjectMapping.Tests/Volo/Abp/ObjectMapping/ObjectMappingHelper_Tests.cs new file mode 100644 index 0000000000..c262dad81a --- /dev/null +++ b/framework/test/Volo.Abp.ObjectMapping.Tests/Volo/Abp/ObjectMapping/ObjectMappingHelper_Tests.cs @@ -0,0 +1,84 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Shouldly; +using Xunit; + +namespace Volo.Abp.ObjectMapping; + +public class ObjectMappingHelper_Tests +{ + [Fact] + public void IsCollectionGenericType_Should_Return_True_For_Standard_GenericCollection() + { + var result = ObjectMappingHelper.IsCollectionGenericType, List>( + out var sourceArg, out var destArg, out var defGenericType); + + result.ShouldBeTrue(); + sourceArg.ShouldBe(typeof(MappingTestSource)); + destArg.ShouldBe(typeof(MappingTestDestination)); + defGenericType.ShouldBe(typeof(List<>)); + } + + [Fact] + public void IsCollectionGenericType_Should_Return_True_For_Array() + { + var result = ObjectMappingHelper.IsCollectionGenericType( + out var sourceArg, out var destArg, out _); + + result.ShouldBeTrue(); + sourceArg.ShouldBe(typeof(MappingTestSource)); + destArg.ShouldBe(typeof(MappingTestDestination)); + } + + [Fact] + public void IsCollectionGenericType_Should_Normalize_IEnumerable_To_List() + { + var result = ObjectMappingHelper.IsCollectionGenericType, IEnumerable>( + out _, out _, out var defGenericType); + + result.ShouldBeTrue(); + defGenericType.ShouldBe(typeof(List<>)); + } + + [Fact] + public void IsCollectionGenericType_Should_Normalize_ICollection_To_Collection() + { + var result = ObjectMappingHelper.IsCollectionGenericType, ICollection>( + out _, out _, out var defGenericType); + + result.ShouldBeTrue(); + defGenericType.ShouldBe(typeof(Collection<>)); + } + + [Fact] + public void IsCollectionGenericType_Should_Return_False_For_NonCollection() + { + var result = ObjectMappingHelper.IsCollectionGenericType( + out _, out _, out _); + + result.ShouldBeFalse(); + } + + [Fact] + public void IsCollectionGenericType_Should_Return_False_For_NonGeneric_DerivedCollection() + { + var result = ObjectMappingHelper.IsCollectionGenericType, MappingTestDestinationList>( + out _, out _, out _); + + result.ShouldBeFalse(); + } +} + +public class MappingTestSource +{ + public string Value { get; set; } = ""; +} + +public class MappingTestDestination +{ + public string Value { get; set; } = ""; +} + +public class MappingTestDestinationList : List +{ +} 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/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 007d19f046..448a2fc3d8 100644 --- a/latest-versions.json +++ b/latest-versions.json @@ -1,4 +1,22 @@ [ + { + "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": "", 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.Blazor/Pages/Account/AccountManage.razor b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor index 47ffa4cc48..2341b9dc5b 100644 --- a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor +++ b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor @@ -23,15 +23,15 @@ @L["DisplayName:CurrentPassword"] - + @L["DisplayName:NewPassword"] - + @L["DisplayName:NewPasswordConfirm"] - + @@ -45,25 +45,25 @@ @L["DisplayName:UserName"] - + @L["DisplayName:Name"] - + @L["DisplayName:Surname"] - + @L["DisplayName:Email"] - + @L["DisplayName:PhoneNumber"] - + // TODO: Move this logic to 'ExtensionProperties' component. diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml index 4b3d2a67dc..a8f72584f0 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml @@ -3,11 +3,14 @@ @using Volo.Abp.Account.Localization @using Volo.Abp.Account.Web.Pages.Account @using Volo.Abp.AspNetCore.Mvc.UI.Theming +@using Volo.Abp.AspNetCore.Mvc.UI.Layout @inject IThemeManager ThemeManager +@inject IPageLayout PageLayout @inject IHtmlLocalizer L @model ManageModel @{ Layout = ThemeManager.CurrentTheme.GetApplicationLayout(); + PageLayout.Content.Title = L["MyAccount"].Value; } @section scripts { 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/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/CleanupJobs.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/CleanupJobs.cs index 6eca55e09f..3b9da774ae 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/CleanupJobs.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/CleanupJobs.cs @@ -1,7 +1,7 @@ using System; using System.Threading; using System.Threading.Tasks; -using TickerQ.Utilities.Models; +using TickerQ.Utilities.Base; namespace Volo.Abp.BackgroundJobs.DemoApp.TickerQ; diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs index c9a3b957de..de3ef3c05d 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs @@ -3,13 +3,14 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using TickerQ.Dashboard.DependencyInjection; using TickerQ.DependencyInjection; using TickerQ.Utilities; using TickerQ.Utilities.Enums; using TickerQ.Utilities.Interfaces.Managers; -using TickerQ.Utilities.Models; -using TickerQ.Utilities.Models.Ticker; +using TickerQ.Utilities.Base; +using TickerQ.Utilities.Entities; using Volo.Abp.AspNetCore; using Volo.Abp.Autofac; using Volo.Abp.BackgroundJobs.DemoApp.Shared; @@ -35,13 +36,14 @@ public class DemoAppTickerQModule : AbpModule { context.Services.AddTickerQ(options => { - options.UpdateMissedJobCheckDelay(TimeSpan.FromSeconds(30)); + options.ConfigureScheduler(scheduler => + { + scheduler.FallbackIntervalChecker = TimeSpan.FromSeconds(30); + }); options.AddDashboard(x => { - x.BasePath = "/tickerq-dashboard"; - - x.UseHostAuthentication = true; + x.SetBasePath("/tickerq-dashboard"); }); }); @@ -78,7 +80,7 @@ public class DemoAppTickerQModule : AbpModule abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) => { var service = new CleanupJobs(); - var request = await TickerRequestProvider.GetRequestAsync(serviceProvider, tickerFunctionContext.Id, tickerFunctionContext.Type); + var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); }))); @@ -92,10 +94,11 @@ public class DemoAppTickerQModule : AbpModule await backgroundWorkerManager.AddAsync(context.ServiceProvider.GetRequiredService()); var app = context.GetApplicationBuilder(); - app.UseAbpTickerQ(); - var timeTickerManager = context.ServiceProvider.GetRequiredService>(); - await timeTickerManager.AddAsync(new TimeTicker + context.GetHost().UseAbpTickerQ(); + + var timeTickerManager = context.ServiceProvider.GetRequiredService>(); + await timeTickerManager.AddAsync(new TimeTickerEntity { Function = nameof(CleanupJobs), ExecutionTime = DateTime.UtcNow.AddSeconds(5), @@ -104,8 +107,8 @@ public class DemoAppTickerQModule : AbpModule RetryIntervals = new[] { 30, 60, 120 }, // Retry after 30s, 60s, then 2min }); - var cronTickerManager = context.ServiceProvider.GetRequiredService>(); - await cronTickerManager.AddAsync(new CronTicker + var cronTickerManager = context.ServiceProvider.GetRequiredService>(); + await cronTickerManager.AddAsync(new CronTickerEntity { Function = nameof(CleanupJobs), Expression = "* * * * *", // Every minute @@ -134,7 +137,7 @@ public class DemoAppTickerQModule : AbpModule await Task.Delay(1000); - var timeTickerManager = serviceProvider.GetRequiredService>(); + var timeTickerManager = serviceProvider.GetRequiredService>(); var result = await timeTickerManager.DeleteAsync(Guid.Parse(jobId)); } } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Themes/Basic/LoginDisplay.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Themes/Basic/LoginDisplay.razor index b2af7c2e1d..973912af30 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Themes/Basic/LoginDisplay.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Themes/Basic/LoginDisplay.razor @@ -10,7 +10,7 @@ @inject IStringLocalizer L - + @if (CurrentTenant.Name != null) { diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LoginDisplay.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LoginDisplay.razor index 995dd0ba7f..6c02e4ffc0 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LoginDisplay.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LoginDisplay.razor @@ -10,7 +10,7 @@ @inject IOptions AbpAspNetCoreComponentsWebOptions - + @if (CurrentTenant.Name != null) { 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..9d2e50d629 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.2.0-rc.1", + "@abp/prismjs": "~10.2.0-rc.1", + "@abp/highlight.js": "~10.2.0-rc.1" } } 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..9ff18bf15b 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,195 @@ # 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.2.0-rc.1.tgz#9c54d78dd6d96eb6611b427ef27a159e62f1c835" + integrity sha512-5XcRHqLRsWIMDtyx8LN7M9sLPaIznZwCgtQqk2cC5l0RsT9HLZmjU5QBTxnhenvuDGZ4gqNfkWyuUhtga4jgAg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.2.0-rc.1" + "@abp/bootstrap" "~10.2.0-rc.1" + "@abp/bootstrap-datepicker" "~10.2.0-rc.1" + "@abp/bootstrap-daterangepicker" "~10.2.0-rc.1" + "@abp/datatables.net-bs5" "~10.2.0-rc.1" + "@abp/font-awesome" "~10.2.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~10.2.0-rc.1" + "@abp/lodash" "~10.2.0-rc.1" + "@abp/luxon" "~10.2.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~10.2.0-rc.1" + "@abp/moment" "~10.2.0-rc.1" + "@abp/select2" "~10.2.0-rc.1" + "@abp/sweetalert2" "~10.2.0-rc.1" + "@abp/timeago" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.2.0-rc.1.tgz#850043c1442d6f21e9d2908b9f52848e51656bd8" + integrity sha512-C0roQpNBZMjRcPHYodP2yrvGmc4SOw3RnSjReC3p4GVd6qyirBXwAU2mKMDEwvA8jcBMRNcMSD2heY4uNDGUZA== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.2.0-rc.1.tgz#dc38443f1b25ba8a31179b5afa8e2106ddaffdf3" + integrity sha512-o96qRDYhGSU9am8dhcilxZ+gO2BiRuofWyUQEnrxPoRnjZJ301eSQvf55sFeYHxTp9h6Q7FEveOM3BtFW/F57Q== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.2.0-rc.1.tgz#6a3ffe6375c408d376f7e71de03fe9dbafc38151" + integrity sha512-dwnmwXRmixQSBZPNhTzpwtmDj3NfnhsA8q5ZotjaKcR7F0V+jsGp6sbTKKeGHaYfVDcXw2Kg3P3a4zxA1pyCcQ== dependencies: + "@abp/moment" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.2.0-rc.1.tgz#bb990c0d270ddee566c15e80df70e17a5c2a4688" + integrity sha512-Htzhib/Bmf1RBuhxJaSnBehEfkEjO6H6t91QXGT30+dO+12R1paN5Ddsg7/DpC0k9Eq+xabcUIKKMKmjbhFScg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.2.0-rc.1.tgz#1b095c6c7daa04102b44942bb195145d55e6a722" + integrity sha512-fXcjuZOUer6afvcqsSxhrG2B4c+JuR+dVW9sJKG8Am1Va4Ju7qH0yd81rtD6dzI29CdgaESH0NlrQTBuDFNRnw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.2.0-rc.1.tgz#aa52ef3cea768a0fbb5854d471d7d788575fd60d" + integrity sha512-2z46ob+MorakWb0xBb08Dv/EtzMgNllbYlxn28igcslsasZzKzMQ4QOvPI/6iDPgazgsoxW073AlaD2JW9e45A== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.2.0-rc.1.tgz#6a9564bb9ef20e2549b1367f8df860a3176d169f" + integrity sha512-jtRVPPa8+XSJTFT+9N8bG9TeBNt7PcHjVExglg2DFx18+TCR91Sew/H7BRaDB8+wbablEJNRacP5TIF+vIFxjQ== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.2.0-rc.1.tgz#f15671cf5ef579af8842e80b51bfb365985afe27" + integrity sha512-eA8GyXXcCtLt7IFp9HksL6aDYliA4s3b/6Mv89RUlSg2UJiTwN1fOWxcQucHXqL/UaWRTW0mtoeXx0H/AIUyJA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.2.0-rc.1.tgz#3346ca6d7b18ce3b973a74fdfbda42cd72240409" + integrity sha512-yvqaih+ZSUtYlEBd7XRK1ZUNILnFGi36xZAiTP0z9E6yxrXmAG2HB3K3VLy33iyr4SstPgUeRHwktKAGaXjorQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-10.2.0-rc.1.tgz#e8aa5553fa2c8253a8c5dbafae2c71c8fad91524" + integrity sha512-3SB2pexK3YX9tfasWwWfJbjB2fd/WLNdnxc+eDUe0lAKR1A1TgHqi26UiSR6VZvWsuEKP9DWgpIRXBDAwx8Mdw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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-validation-unobtrusive@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.2.0-rc.1.tgz#2f91a9edf740e417f278dc88c0e5de8a01e18c8e" + integrity sha512-m9LLaFppg2rNAAKykxFMSeu0+kg8GUVEbtyYRrRWa12ezmbvm1hcMV6zzYlwSt+NOeuGJ2X/7ST5BCAgSS9llw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - 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== - dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.2.0-rc.1.tgz#e993ced0cbe2501cce50af9feb5bf7256f1e5d8e" + integrity sha512-w8abcFGyUeY8d09AkSceW4DEO/Y5xkqIA0lZ8qxLy+dS3Di3FhPQ6w6nS2N3Nwt/OZs7p8xW4HZlyEmN1D+rGA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.2.0-rc.1.tgz#04c36aa404b71fff27933b98efa266d83ce941ee" + integrity sha512-mZcHCJU8rjXx59zRf9N/uLP48DEkJOusqfnG1ZHAz36eHrQIoA2SZnsU8DwW/yHQudWno1A8g/w8scxHlYzq+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.2.0-rc.1.tgz#d21b2b60403430a11d4b4f03eace0362bc7d762d" + integrity sha512-6+YMGXvZAu1YK85jnNIxzLlcMqWFDcBHKS/4f37hQr/Vum7cz2iw2orOmY0sDnZp2jY3vBdMtWYKM1H03+lhDA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.2.0-rc.1.tgz#7b0c9669822b223d45a1f11f0414a5a51cc60af9" + integrity sha512-1cRY7kQ/rxNq0JBBBRhVQUExGvU9S9rUC8wmLdPs2lxgg7GRnNPjzIDxFXYYajKXenTBabV8MLWa6QfhgrIeUA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.2.0-rc.1.tgz#410f409c7734d017f0ee42e146bfd3508c693341" + integrity sha512-veQyOqyj/EX5mESj2AZz5HThWde00aBsC9mJ7EfTD+TZy+kyuHOqW9Z/h94hFwgkHLPozrtD5q9UngPS7T4mgw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.2.0-rc.1.tgz#99604ac5f5bdcfe40f93e74e0475a3153502313e" + integrity sha512-pRcujgAJ9zVXoNva1b4dLf5hFwcYPSf2od4Ef3Qpt0S/Q2By9XA8Kp0UqhP1R4e8zYDIGg2LWMQZE+NE2W7B0A== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.2.0-rc.1.tgz#c2e4a65bd52e4908de7383783c6ce2892143e714" + integrity sha512-6fjsHiwGWHAvmYyjMZVEa/dKMWGvwgLBFeI5jrsKRftImZgcD1djVdNudNCgAAaA1qf6iD1n0I+lHAh8VZEFxQ== dependencies: - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/core" "~10.1.0-rc.2" + "@abp/clipboard" "~10.2.0-rc.1" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.2.0-rc.1.tgz#ee9876661b92646252ee4f368422c199e60e7b61" + integrity sha512-mk7UFL1yhCh8OEdyKn6sDCaSR5iBmlWd63qv5paXc7WuugEW5pLGbYEorhYBnljRw7Gcavslb2YPduWvwcdE6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.2.0-rc.1.tgz#9b97de09f27370a3795413ccd7b238ccea9d2483" + integrity sha512-98GSYHvRMnS565sg+mxTeIALVDZwAIzssDFrdWsHhF3g+oMo7+dpbhw3CQ0PdBuEF15vUCU1fzmEi0lXzk4+6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.2.0-rc.1.tgz#6254e2c43536dd952bec32107748f5896f84891f" + integrity sha512-tw0uDtlmOVIW2CRiys/me//ratM9JeAjmzPT/gtyCfcrqmNTlbkbYu4UmGDnwGgo9XeL1LbWGbDc22s868UVYA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.2.0-rc.1.tgz#9c23c7c78720077df60f1a3809d9b688016478b5" + integrity sha512-l7spGr0LUYJXGsYYNCYOYCiv7YKyFeBzNcpYqIv+wV6glqpTvF5qa1+NU/T/cbfGCrqch3P/wr+//oqwWEcNIg== dependencies: just-compare "^2.3.0" @@ -273,13 +265,6 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - jquery-mousewheel@>=3.0.6: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -298,7 +283,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0: resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== -jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2, "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1: +jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== 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..659c475d6e 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.2.0-rc.1", + "@abp/prismjs": "~10.2.0-rc.1" }, "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..078527b954 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,194 @@ # 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.2.0-rc.1.tgz#6427f22e77c0d5bcd072babf0bc93ec736b9b8f9" + integrity sha512-XJOKZNguxdT+MqmlPyCezZDiAmsvLqDwUOPilxvaDHPEQkgL28jRV1Jo6YfiOV178eljTukMPKXBR9IXTEAiww== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.2.0-rc.1.tgz#9c54d78dd6d96eb6611b427ef27a159e62f1c835" + integrity sha512-5XcRHqLRsWIMDtyx8LN7M9sLPaIznZwCgtQqk2cC5l0RsT9HLZmjU5QBTxnhenvuDGZ4gqNfkWyuUhtga4jgAg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.2.0-rc.1" + "@abp/bootstrap" "~10.2.0-rc.1" + "@abp/bootstrap-datepicker" "~10.2.0-rc.1" + "@abp/bootstrap-daterangepicker" "~10.2.0-rc.1" + "@abp/datatables.net-bs5" "~10.2.0-rc.1" + "@abp/font-awesome" "~10.2.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~10.2.0-rc.1" + "@abp/lodash" "~10.2.0-rc.1" + "@abp/luxon" "~10.2.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~10.2.0-rc.1" + "@abp/moment" "~10.2.0-rc.1" + "@abp/select2" "~10.2.0-rc.1" + "@abp/sweetalert2" "~10.2.0-rc.1" + "@abp/timeago" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.2.0-rc.1.tgz#850043c1442d6f21e9d2908b9f52848e51656bd8" + integrity sha512-C0roQpNBZMjRcPHYodP2yrvGmc4SOw3RnSjReC3p4GVd6qyirBXwAU2mKMDEwvA8jcBMRNcMSD2heY4uNDGUZA== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.2.0-rc.1.tgz#dc38443f1b25ba8a31179b5afa8e2106ddaffdf3" + integrity sha512-o96qRDYhGSU9am8dhcilxZ+gO2BiRuofWyUQEnrxPoRnjZJ301eSQvf55sFeYHxTp9h6Q7FEveOM3BtFW/F57Q== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.2.0-rc.1.tgz#6a3ffe6375c408d376f7e71de03fe9dbafc38151" + integrity sha512-dwnmwXRmixQSBZPNhTzpwtmDj3NfnhsA8q5ZotjaKcR7F0V+jsGp6sbTKKeGHaYfVDcXw2Kg3P3a4zxA1pyCcQ== dependencies: + "@abp/moment" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.2.0-rc.1.tgz#bb990c0d270ddee566c15e80df70e17a5c2a4688" + integrity sha512-Htzhib/Bmf1RBuhxJaSnBehEfkEjO6H6t91QXGT30+dO+12R1paN5Ddsg7/DpC0k9Eq+xabcUIKKMKmjbhFScg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.2.0-rc.1.tgz#1b095c6c7daa04102b44942bb195145d55e6a722" + integrity sha512-fXcjuZOUer6afvcqsSxhrG2B4c+JuR+dVW9sJKG8Am1Va4Ju7qH0yd81rtD6dzI29CdgaESH0NlrQTBuDFNRnw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.2.0-rc.1.tgz#aa52ef3cea768a0fbb5854d471d7d788575fd60d" + integrity sha512-2z46ob+MorakWb0xBb08Dv/EtzMgNllbYlxn28igcslsasZzKzMQ4QOvPI/6iDPgazgsoxW073AlaD2JW9e45A== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.2.0-rc.1.tgz#6a9564bb9ef20e2549b1367f8df860a3176d169f" + integrity sha512-jtRVPPa8+XSJTFT+9N8bG9TeBNt7PcHjVExglg2DFx18+TCR91Sew/H7BRaDB8+wbablEJNRacP5TIF+vIFxjQ== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.2.0-rc.1.tgz#f15671cf5ef579af8842e80b51bfb365985afe27" + integrity sha512-eA8GyXXcCtLt7IFp9HksL6aDYliA4s3b/6Mv89RUlSg2UJiTwN1fOWxcQucHXqL/UaWRTW0mtoeXx0H/AIUyJA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.2.0-rc.1.tgz#3346ca6d7b18ce3b973a74fdfbda42cd72240409" + integrity sha512-yvqaih+ZSUtYlEBd7XRK1ZUNILnFGi36xZAiTP0z9E6yxrXmAG2HB3K3VLy33iyr4SstPgUeRHwktKAGaXjorQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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-validation-unobtrusive@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.2.0-rc.1.tgz#2f91a9edf740e417f278dc88c0e5de8a01e18c8e" + integrity sha512-m9LLaFppg2rNAAKykxFMSeu0+kg8GUVEbtyYRrRWa12ezmbvm1hcMV6zzYlwSt+NOeuGJ2X/7ST5BCAgSS9llw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - 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== - dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.2.0-rc.1.tgz#e993ced0cbe2501cce50af9feb5bf7256f1e5d8e" + integrity sha512-w8abcFGyUeY8d09AkSceW4DEO/Y5xkqIA0lZ8qxLy+dS3Di3FhPQ6w6nS2N3Nwt/OZs7p8xW4HZlyEmN1D+rGA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.2.0-rc.1.tgz#04c36aa404b71fff27933b98efa266d83ce941ee" + integrity sha512-mZcHCJU8rjXx59zRf9N/uLP48DEkJOusqfnG1ZHAz36eHrQIoA2SZnsU8DwW/yHQudWno1A8g/w8scxHlYzq+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.2.0-rc.1.tgz#d21b2b60403430a11d4b4f03eace0362bc7d762d" + integrity sha512-6+YMGXvZAu1YK85jnNIxzLlcMqWFDcBHKS/4f37hQr/Vum7cz2iw2orOmY0sDnZp2jY3vBdMtWYKM1H03+lhDA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.2.0-rc.1.tgz#7b0c9669822b223d45a1f11f0414a5a51cc60af9" + integrity sha512-1cRY7kQ/rxNq0JBBBRhVQUExGvU9S9rUC8wmLdPs2lxgg7GRnNPjzIDxFXYYajKXenTBabV8MLWa6QfhgrIeUA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.2.0-rc.1.tgz#410f409c7734d017f0ee42e146bfd3508c693341" + integrity sha512-veQyOqyj/EX5mESj2AZz5HThWde00aBsC9mJ7EfTD+TZy+kyuHOqW9Z/h94hFwgkHLPozrtD5q9UngPS7T4mgw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.2.0-rc.1.tgz#99604ac5f5bdcfe40f93e74e0475a3153502313e" + integrity sha512-pRcujgAJ9zVXoNva1b4dLf5hFwcYPSf2od4Ef3Qpt0S/Q2By9XA8Kp0UqhP1R4e8zYDIGg2LWMQZE+NE2W7B0A== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.2.0-rc.1.tgz#c2e4a65bd52e4908de7383783c6ce2892143e714" + integrity sha512-6fjsHiwGWHAvmYyjMZVEa/dKMWGvwgLBFeI5jrsKRftImZgcD1djVdNudNCgAAaA1qf6iD1n0I+lHAh8VZEFxQ== dependencies: - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/core" "~10.1.0-rc.2" + "@abp/clipboard" "~10.2.0-rc.1" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.2.0-rc.1.tgz#ee9876661b92646252ee4f368422c199e60e7b61" + integrity sha512-mk7UFL1yhCh8OEdyKn6sDCaSR5iBmlWd63qv5paXc7WuugEW5pLGbYEorhYBnljRw7Gcavslb2YPduWvwcdE6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.2.0-rc.1.tgz#9b97de09f27370a3795413ccd7b238ccea9d2483" + integrity sha512-98GSYHvRMnS565sg+mxTeIALVDZwAIzssDFrdWsHhF3g+oMo7+dpbhw3CQ0PdBuEF15vUCU1fzmEi0lXzk4+6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.2.0-rc.1.tgz#6254e2c43536dd952bec32107748f5896f84891f" + integrity sha512-tw0uDtlmOVIW2CRiys/me//ratM9JeAjmzPT/gtyCfcrqmNTlbkbYu4UmGDnwGgo9XeL1LbWGbDc22s868UVYA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.2.0-rc.1.tgz#9c23c7c78720077df60f1a3809d9b688016478b5" + integrity sha512-l7spGr0LUYJXGsYYNCYOYCiv7YKyFeBzNcpYqIv+wV6glqpTvF5qa1+NU/T/cbfGCrqch3P/wr+//oqwWEcNIg== dependencies: just-compare "^2.3.0" @@ -267,13 +259,6 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - jquery-mousewheel@>=3.0.6: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -292,7 +277,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0: resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== -jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2: +jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7: version "3.6.4" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index 0f4e62f9cf..4eb44d84b6 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.2.0-rc.1", + "@abp/blogging": "~10.2.0-rc.1" } } diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 1f2cd9805d..f5667d5ffc 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,228 +2,220 @@ # 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.2.0-rc.1.tgz#6427f22e77c0d5bcd072babf0bc93ec736b9b8f9" + integrity sha512-XJOKZNguxdT+MqmlPyCezZDiAmsvLqDwUOPilxvaDHPEQkgL28jRV1Jo6YfiOV178eljTukMPKXBR9IXTEAiww== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.2.0-rc.1.tgz#9c54d78dd6d96eb6611b427ef27a159e62f1c835" + integrity sha512-5XcRHqLRsWIMDtyx8LN7M9sLPaIznZwCgtQqk2cC5l0RsT9HLZmjU5QBTxnhenvuDGZ4gqNfkWyuUhtga4jgAg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.2.0-rc.1" + "@abp/bootstrap" "~10.2.0-rc.1" + "@abp/bootstrap-datepicker" "~10.2.0-rc.1" + "@abp/bootstrap-daterangepicker" "~10.2.0-rc.1" + "@abp/datatables.net-bs5" "~10.2.0-rc.1" + "@abp/font-awesome" "~10.2.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~10.2.0-rc.1" + "@abp/lodash" "~10.2.0-rc.1" + "@abp/luxon" "~10.2.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~10.2.0-rc.1" + "@abp/moment" "~10.2.0-rc.1" + "@abp/select2" "~10.2.0-rc.1" + "@abp/sweetalert2" "~10.2.0-rc.1" + "@abp/timeago" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.2.0-rc.1.tgz#850043c1442d6f21e9d2908b9f52848e51656bd8" + integrity sha512-C0roQpNBZMjRcPHYodP2yrvGmc4SOw3RnSjReC3p4GVd6qyirBXwAU2mKMDEwvA8jcBMRNcMSD2heY4uNDGUZA== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-10.2.0-rc.1.tgz#505305f2d6ce8e0b8af01ad780c1df569acf9c82" + integrity sha512-3a48OGUn7+1mgZAtOs3wtC+g0vtq2VZobu1S8GS019G6BjMBZO5EzDnjy+XLLpRb912EtoOG47OQE43DjcL7wQ== 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.2.0-rc.1" + "@abp/owl.carousel" "~10.2.0-rc.1" + "@abp/prismjs" "~10.2.0-rc.1" + "@abp/tui-editor" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.2.0-rc.1.tgz#dc38443f1b25ba8a31179b5afa8e2106ddaffdf3" + integrity sha512-o96qRDYhGSU9am8dhcilxZ+gO2BiRuofWyUQEnrxPoRnjZJ301eSQvf55sFeYHxTp9h6Q7FEveOM3BtFW/F57Q== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.2.0-rc.1.tgz#6a3ffe6375c408d376f7e71de03fe9dbafc38151" + integrity sha512-dwnmwXRmixQSBZPNhTzpwtmDj3NfnhsA8q5ZotjaKcR7F0V+jsGp6sbTKKeGHaYfVDcXw2Kg3P3a4zxA1pyCcQ== dependencies: + "@abp/moment" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.2.0-rc.1.tgz#bb990c0d270ddee566c15e80df70e17a5c2a4688" + integrity sha512-Htzhib/Bmf1RBuhxJaSnBehEfkEjO6H6t91QXGT30+dO+12R1paN5Ddsg7/DpC0k9Eq+xabcUIKKMKmjbhFScg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.2.0-rc.1.tgz#1b095c6c7daa04102b44942bb195145d55e6a722" + integrity sha512-fXcjuZOUer6afvcqsSxhrG2B4c+JuR+dVW9sJKG8Am1Va4Ju7qH0yd81rtD6dzI29CdgaESH0NlrQTBuDFNRnw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.2.0-rc.1.tgz#aa52ef3cea768a0fbb5854d471d7d788575fd60d" + integrity sha512-2z46ob+MorakWb0xBb08Dv/EtzMgNllbYlxn28igcslsasZzKzMQ4QOvPI/6iDPgazgsoxW073AlaD2JW9e45A== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.2.0-rc.1.tgz#6a9564bb9ef20e2549b1367f8df860a3176d169f" + integrity sha512-jtRVPPa8+XSJTFT+9N8bG9TeBNt7PcHjVExglg2DFx18+TCR91Sew/H7BRaDB8+wbablEJNRacP5TIF+vIFxjQ== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.2.0-rc.1.tgz#f15671cf5ef579af8842e80b51bfb365985afe27" + integrity sha512-eA8GyXXcCtLt7IFp9HksL6aDYliA4s3b/6Mv89RUlSg2UJiTwN1fOWxcQucHXqL/UaWRTW0mtoeXx0H/AIUyJA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.2.0-rc.1.tgz#3346ca6d7b18ce3b973a74fdfbda42cd72240409" + integrity sha512-yvqaih+ZSUtYlEBd7XRK1ZUNILnFGi36xZAiTP0z9E6yxrXmAG2HB3K3VLy33iyr4SstPgUeRHwktKAGaXjorQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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-validation-unobtrusive@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.2.0-rc.1.tgz#2f91a9edf740e417f278dc88c0e5de8a01e18c8e" + integrity sha512-m9LLaFppg2rNAAKykxFMSeu0+kg8GUVEbtyYRrRWa12ezmbvm1hcMV6zzYlwSt+NOeuGJ2X/7ST5BCAgSS9llw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - 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== - dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.2.0-rc.1.tgz#e993ced0cbe2501cce50af9feb5bf7256f1e5d8e" + integrity sha512-w8abcFGyUeY8d09AkSceW4DEO/Y5xkqIA0lZ8qxLy+dS3Di3FhPQ6w6nS2N3Nwt/OZs7p8xW4HZlyEmN1D+rGA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.2.0-rc.1.tgz#04c36aa404b71fff27933b98efa266d83ce941ee" + integrity sha512-mZcHCJU8rjXx59zRf9N/uLP48DEkJOusqfnG1ZHAz36eHrQIoA2SZnsU8DwW/yHQudWno1A8g/w8scxHlYzq+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.2.0-rc.1.tgz#d21b2b60403430a11d4b4f03eace0362bc7d762d" + integrity sha512-6+YMGXvZAu1YK85jnNIxzLlcMqWFDcBHKS/4f37hQr/Vum7cz2iw2orOmY0sDnZp2jY3vBdMtWYKM1H03+lhDA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.2.0-rc.1.tgz#7b0c9669822b223d45a1f11f0414a5a51cc60af9" + integrity sha512-1cRY7kQ/rxNq0JBBBRhVQUExGvU9S9rUC8wmLdPs2lxgg7GRnNPjzIDxFXYYajKXenTBabV8MLWa6QfhgrIeUA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.2.0-rc.1.tgz#410f409c7734d017f0ee42e146bfd3508c693341" + integrity sha512-veQyOqyj/EX5mESj2AZz5HThWde00aBsC9mJ7EfTD+TZy+kyuHOqW9Z/h94hFwgkHLPozrtD5q9UngPS7T4mgw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.2.0-rc.1.tgz#99604ac5f5bdcfe40f93e74e0475a3153502313e" + integrity sha512-pRcujgAJ9zVXoNva1b4dLf5hFwcYPSf2od4Ef3Qpt0S/Q2By9XA8Kp0UqhP1R4e8zYDIGg2LWMQZE+NE2W7B0A== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-10.2.0-rc.1.tgz#476a4efd139ede1a87bf08c6e66347b7d870a41c" + integrity sha512-81rQwIAJJy/y91Hmq9aQaqQeGAY+R0gTvU9ww6qQ2KQxYYZMmxWSHYsyVrbOMLQM3zSZE1L6D+mP4LypXh4NVA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.2.0-rc.1.tgz#c2e4a65bd52e4908de7383783c6ce2892143e714" + integrity sha512-6fjsHiwGWHAvmYyjMZVEa/dKMWGvwgLBFeI5jrsKRftImZgcD1djVdNudNCgAAaA1qf6iD1n0I+lHAh8VZEFxQ== dependencies: - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/core" "~10.1.0-rc.2" + "@abp/clipboard" "~10.2.0-rc.1" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.2.0-rc.1.tgz#ee9876661b92646252ee4f368422c199e60e7b61" + integrity sha512-mk7UFL1yhCh8OEdyKn6sDCaSR5iBmlWd63qv5paXc7WuugEW5pLGbYEorhYBnljRw7Gcavslb2YPduWvwcdE6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.2.0-rc.1.tgz#9b97de09f27370a3795413ccd7b238ccea9d2483" + integrity sha512-98GSYHvRMnS565sg+mxTeIALVDZwAIzssDFrdWsHhF3g+oMo7+dpbhw3CQ0PdBuEF15vUCU1fzmEi0lXzk4+6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.2.0-rc.1.tgz#6254e2c43536dd952bec32107748f5896f84891f" + integrity sha512-tw0uDtlmOVIW2CRiys/me//ratM9JeAjmzPT/gtyCfcrqmNTlbkbYu4UmGDnwGgo9XeL1LbWGbDc22s868UVYA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-10.2.0-rc.1.tgz#c8e5af26357b80446d793229600c15fd78dfa0b5" + integrity sha512-kKPObKw4J+8s6w5hNmDk1BqZoVZ+qXHITq7/N+m7OqL/PUh0wn6OQ49Wb+36IeeH4ijpZtBCxdiVgF7s0Em+yA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - "@abp/prismjs" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" + "@abp/prismjs" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.2.0-rc.1.tgz#9c23c7c78720077df60f1a3809d9b688016478b5" + integrity sha512-l7spGr0LUYJXGsYYNCYOYCiv7YKyFeBzNcpYqIv+wV6glqpTvF5qa1+NU/T/cbfGCrqch3P/wr+//oqwWEcNIg== dependencies: just-compare "^2.3.0" @@ -293,13 +285,6 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - jquery-mousewheel@>=3.0.6: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -318,7 +303,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0: resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== -jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2, jquery@>=1.8.3: +jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.8.3: version "3.6.4" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index 66592df9ff..4dfe7427ed 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.2.0-rc.1" } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index a2b6e13b29..f07a6a1e46 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,185 +2,177 @@ # 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.2.0-rc.1.tgz#6427f22e77c0d5bcd072babf0bc93ec736b9b8f9" + integrity sha512-XJOKZNguxdT+MqmlPyCezZDiAmsvLqDwUOPilxvaDHPEQkgL28jRV1Jo6YfiOV178eljTukMPKXBR9IXTEAiww== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.2.0-rc.1.tgz#9c54d78dd6d96eb6611b427ef27a159e62f1c835" + integrity sha512-5XcRHqLRsWIMDtyx8LN7M9sLPaIznZwCgtQqk2cC5l0RsT9HLZmjU5QBTxnhenvuDGZ4gqNfkWyuUhtga4jgAg== 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.2.0-rc.1" + "@abp/bootstrap" "~10.2.0-rc.1" + "@abp/bootstrap-datepicker" "~10.2.0-rc.1" + "@abp/bootstrap-daterangepicker" "~10.2.0-rc.1" + "@abp/datatables.net-bs5" "~10.2.0-rc.1" + "@abp/font-awesome" "~10.2.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~10.2.0-rc.1" + "@abp/lodash" "~10.2.0-rc.1" + "@abp/luxon" "~10.2.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~10.2.0-rc.1" + "@abp/moment" "~10.2.0-rc.1" + "@abp/select2" "~10.2.0-rc.1" + "@abp/sweetalert2" "~10.2.0-rc.1" + "@abp/timeago" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.2.0-rc.1.tgz#850043c1442d6f21e9d2908b9f52848e51656bd8" + integrity sha512-C0roQpNBZMjRcPHYodP2yrvGmc4SOw3RnSjReC3p4GVd6qyirBXwAU2mKMDEwvA8jcBMRNcMSD2heY4uNDGUZA== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.2.0-rc.1.tgz#dc38443f1b25ba8a31179b5afa8e2106ddaffdf3" + integrity sha512-o96qRDYhGSU9am8dhcilxZ+gO2BiRuofWyUQEnrxPoRnjZJ301eSQvf55sFeYHxTp9h6Q7FEveOM3BtFW/F57Q== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.2.0-rc.1.tgz#6a3ffe6375c408d376f7e71de03fe9dbafc38151" + integrity sha512-dwnmwXRmixQSBZPNhTzpwtmDj3NfnhsA8q5ZotjaKcR7F0V+jsGp6sbTKKeGHaYfVDcXw2Kg3P3a4zxA1pyCcQ== dependencies: + "@abp/moment" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.2.0-rc.1.tgz#bb990c0d270ddee566c15e80df70e17a5c2a4688" + integrity sha512-Htzhib/Bmf1RBuhxJaSnBehEfkEjO6H6t91QXGT30+dO+12R1paN5Ddsg7/DpC0k9Eq+xabcUIKKMKmjbhFScg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.2.0-rc.1.tgz#aa52ef3cea768a0fbb5854d471d7d788575fd60d" + integrity sha512-2z46ob+MorakWb0xBb08Dv/EtzMgNllbYlxn28igcslsasZzKzMQ4QOvPI/6iDPgazgsoxW073AlaD2JW9e45A== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.2.0-rc.1.tgz#6a9564bb9ef20e2549b1367f8df860a3176d169f" + integrity sha512-jtRVPPa8+XSJTFT+9N8bG9TeBNt7PcHjVExglg2DFx18+TCR91Sew/H7BRaDB8+wbablEJNRacP5TIF+vIFxjQ== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.2.0-rc.1.tgz#f15671cf5ef579af8842e80b51bfb365985afe27" + integrity sha512-eA8GyXXcCtLt7IFp9HksL6aDYliA4s3b/6Mv89RUlSg2UJiTwN1fOWxcQucHXqL/UaWRTW0mtoeXx0H/AIUyJA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.2.0-rc.1.tgz#3346ca6d7b18ce3b973a74fdfbda42cd72240409" + integrity sha512-yvqaih+ZSUtYlEBd7XRK1ZUNILnFGi36xZAiTP0z9E6yxrXmAG2HB3K3VLy33iyr4SstPgUeRHwktKAGaXjorQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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-validation-unobtrusive@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.2.0-rc.1.tgz#2f91a9edf740e417f278dc88c0e5de8a01e18c8e" + integrity sha512-m9LLaFppg2rNAAKykxFMSeu0+kg8GUVEbtyYRrRWa12ezmbvm1hcMV6zzYlwSt+NOeuGJ2X/7ST5BCAgSS9llw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - 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== - dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.2.0-rc.1.tgz#e993ced0cbe2501cce50af9feb5bf7256f1e5d8e" + integrity sha512-w8abcFGyUeY8d09AkSceW4DEO/Y5xkqIA0lZ8qxLy+dS3Di3FhPQ6w6nS2N3Nwt/OZs7p8xW4HZlyEmN1D+rGA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.2.0-rc.1.tgz#04c36aa404b71fff27933b98efa266d83ce941ee" + integrity sha512-mZcHCJU8rjXx59zRf9N/uLP48DEkJOusqfnG1ZHAz36eHrQIoA2SZnsU8DwW/yHQudWno1A8g/w8scxHlYzq+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.2.0-rc.1.tgz#d21b2b60403430a11d4b4f03eace0362bc7d762d" + integrity sha512-6+YMGXvZAu1YK85jnNIxzLlcMqWFDcBHKS/4f37hQr/Vum7cz2iw2orOmY0sDnZp2jY3vBdMtWYKM1H03+lhDA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.2.0-rc.1.tgz#7b0c9669822b223d45a1f11f0414a5a51cc60af9" + integrity sha512-1cRY7kQ/rxNq0JBBBRhVQUExGvU9S9rUC8wmLdPs2lxgg7GRnNPjzIDxFXYYajKXenTBabV8MLWa6QfhgrIeUA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.2.0-rc.1.tgz#410f409c7734d017f0ee42e146bfd3508c693341" + integrity sha512-veQyOqyj/EX5mESj2AZz5HThWde00aBsC9mJ7EfTD+TZy+kyuHOqW9Z/h94hFwgkHLPozrtD5q9UngPS7T4mgw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.2.0-rc.1.tgz#99604ac5f5bdcfe40f93e74e0475a3153502313e" + integrity sha512-pRcujgAJ9zVXoNva1b4dLf5hFwcYPSf2od4Ef3Qpt0S/Q2By9XA8Kp0UqhP1R4e8zYDIGg2LWMQZE+NE2W7B0A== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.2.0-rc.1.tgz#ee9876661b92646252ee4f368422c199e60e7b61" + integrity sha512-mk7UFL1yhCh8OEdyKn6sDCaSR5iBmlWd63qv5paXc7WuugEW5pLGbYEorhYBnljRw7Gcavslb2YPduWvwcdE6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.2.0-rc.1.tgz#9b97de09f27370a3795413ccd7b238ccea9d2483" + integrity sha512-98GSYHvRMnS565sg+mxTeIALVDZwAIzssDFrdWsHhF3g+oMo7+dpbhw3CQ0PdBuEF15vUCU1fzmEi0lXzk4+6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.2.0-rc.1.tgz#6254e2c43536dd952bec32107748f5896f84891f" + integrity sha512-tw0uDtlmOVIW2CRiys/me//ratM9JeAjmzPT/gtyCfcrqmNTlbkbYu4UmGDnwGgo9XeL1LbWGbDc22s868UVYA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.2.0-rc.1.tgz#9c23c7c78720077df60f1a3809d9b688016478b5" + integrity sha512-l7spGr0LUYJXGsYYNCYOYCiv7YKyFeBzNcpYqIv+wV6glqpTvF5qa1+NU/T/cbfGCrqch3P/wr+//oqwWEcNIg== dependencies: just-compare "^2.3.0" @@ -229,13 +221,6 @@ datatables.net@2.3.4, datatables.net@^2.3.4: dependencies: jquery ">=1.7" -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - jquery-mousewheel@>=3.0.6: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -254,7 +239,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0: resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== -jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2: +jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7: version "3.6.4" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index d4bc7712ef..953ed09f17 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.2.0-rc.1", + "@abp/ng.identity": "~10.1.0", + "@abp/ng.setting-management": "~10.2.0-rc.1", + "@abp/ng.tenant-management": "~10.2.0-rc.1", + "@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..9f29466c8a 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.2.0-rc.1", + "@abp/ng.theme.shared": ">=10.2.0-rc.1" }, "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..f73ea68e01 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.2.0-rc.1" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index a2b6e13b29..f07a6a1e46 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,185 +2,177 @@ # 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.2.0-rc.1.tgz#6427f22e77c0d5bcd072babf0bc93ec736b9b8f9" + integrity sha512-XJOKZNguxdT+MqmlPyCezZDiAmsvLqDwUOPilxvaDHPEQkgL28jRV1Jo6YfiOV178eljTukMPKXBR9IXTEAiww== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.2.0-rc.1.tgz#9c54d78dd6d96eb6611b427ef27a159e62f1c835" + integrity sha512-5XcRHqLRsWIMDtyx8LN7M9sLPaIznZwCgtQqk2cC5l0RsT9HLZmjU5QBTxnhenvuDGZ4gqNfkWyuUhtga4jgAg== 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.2.0-rc.1" + "@abp/bootstrap" "~10.2.0-rc.1" + "@abp/bootstrap-datepicker" "~10.2.0-rc.1" + "@abp/bootstrap-daterangepicker" "~10.2.0-rc.1" + "@abp/datatables.net-bs5" "~10.2.0-rc.1" + "@abp/font-awesome" "~10.2.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~10.2.0-rc.1" + "@abp/lodash" "~10.2.0-rc.1" + "@abp/luxon" "~10.2.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~10.2.0-rc.1" + "@abp/moment" "~10.2.0-rc.1" + "@abp/select2" "~10.2.0-rc.1" + "@abp/sweetalert2" "~10.2.0-rc.1" + "@abp/timeago" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.2.0-rc.1.tgz#850043c1442d6f21e9d2908b9f52848e51656bd8" + integrity sha512-C0roQpNBZMjRcPHYodP2yrvGmc4SOw3RnSjReC3p4GVd6qyirBXwAU2mKMDEwvA8jcBMRNcMSD2heY4uNDGUZA== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.2.0-rc.1.tgz#dc38443f1b25ba8a31179b5afa8e2106ddaffdf3" + integrity sha512-o96qRDYhGSU9am8dhcilxZ+gO2BiRuofWyUQEnrxPoRnjZJ301eSQvf55sFeYHxTp9h6Q7FEveOM3BtFW/F57Q== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.2.0-rc.1.tgz#6a3ffe6375c408d376f7e71de03fe9dbafc38151" + integrity sha512-dwnmwXRmixQSBZPNhTzpwtmDj3NfnhsA8q5ZotjaKcR7F0V+jsGp6sbTKKeGHaYfVDcXw2Kg3P3a4zxA1pyCcQ== dependencies: + "@abp/moment" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.2.0-rc.1.tgz#bb990c0d270ddee566c15e80df70e17a5c2a4688" + integrity sha512-Htzhib/Bmf1RBuhxJaSnBehEfkEjO6H6t91QXGT30+dO+12R1paN5Ddsg7/DpC0k9Eq+xabcUIKKMKmjbhFScg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.2.0-rc.1.tgz#aa52ef3cea768a0fbb5854d471d7d788575fd60d" + integrity sha512-2z46ob+MorakWb0xBb08Dv/EtzMgNllbYlxn28igcslsasZzKzMQ4QOvPI/6iDPgazgsoxW073AlaD2JW9e45A== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.2.0-rc.1.tgz#6a9564bb9ef20e2549b1367f8df860a3176d169f" + integrity sha512-jtRVPPa8+XSJTFT+9N8bG9TeBNt7PcHjVExglg2DFx18+TCR91Sew/H7BRaDB8+wbablEJNRacP5TIF+vIFxjQ== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.2.0-rc.1.tgz#f15671cf5ef579af8842e80b51bfb365985afe27" + integrity sha512-eA8GyXXcCtLt7IFp9HksL6aDYliA4s3b/6Mv89RUlSg2UJiTwN1fOWxcQucHXqL/UaWRTW0mtoeXx0H/AIUyJA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.2.0-rc.1.tgz#3346ca6d7b18ce3b973a74fdfbda42cd72240409" + integrity sha512-yvqaih+ZSUtYlEBd7XRK1ZUNILnFGi36xZAiTP0z9E6yxrXmAG2HB3K3VLy33iyr4SstPgUeRHwktKAGaXjorQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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-validation-unobtrusive@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.2.0-rc.1.tgz#2f91a9edf740e417f278dc88c0e5de8a01e18c8e" + integrity sha512-m9LLaFppg2rNAAKykxFMSeu0+kg8GUVEbtyYRrRWa12ezmbvm1hcMV6zzYlwSt+NOeuGJ2X/7ST5BCAgSS9llw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - 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== - dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.2.0-rc.1.tgz#e993ced0cbe2501cce50af9feb5bf7256f1e5d8e" + integrity sha512-w8abcFGyUeY8d09AkSceW4DEO/Y5xkqIA0lZ8qxLy+dS3Di3FhPQ6w6nS2N3Nwt/OZs7p8xW4HZlyEmN1D+rGA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.2.0-rc.1.tgz#04c36aa404b71fff27933b98efa266d83ce941ee" + integrity sha512-mZcHCJU8rjXx59zRf9N/uLP48DEkJOusqfnG1ZHAz36eHrQIoA2SZnsU8DwW/yHQudWno1A8g/w8scxHlYzq+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.2.0-rc.1.tgz#d21b2b60403430a11d4b4f03eace0362bc7d762d" + integrity sha512-6+YMGXvZAu1YK85jnNIxzLlcMqWFDcBHKS/4f37hQr/Vum7cz2iw2orOmY0sDnZp2jY3vBdMtWYKM1H03+lhDA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.2.0-rc.1.tgz#7b0c9669822b223d45a1f11f0414a5a51cc60af9" + integrity sha512-1cRY7kQ/rxNq0JBBBRhVQUExGvU9S9rUC8wmLdPs2lxgg7GRnNPjzIDxFXYYajKXenTBabV8MLWa6QfhgrIeUA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.2.0-rc.1.tgz#410f409c7734d017f0ee42e146bfd3508c693341" + integrity sha512-veQyOqyj/EX5mESj2AZz5HThWde00aBsC9mJ7EfTD+TZy+kyuHOqW9Z/h94hFwgkHLPozrtD5q9UngPS7T4mgw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.2.0-rc.1.tgz#99604ac5f5bdcfe40f93e74e0475a3153502313e" + integrity sha512-pRcujgAJ9zVXoNva1b4dLf5hFwcYPSf2od4Ef3Qpt0S/Q2By9XA8Kp0UqhP1R4e8zYDIGg2LWMQZE+NE2W7B0A== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.2.0-rc.1.tgz#ee9876661b92646252ee4f368422c199e60e7b61" + integrity sha512-mk7UFL1yhCh8OEdyKn6sDCaSR5iBmlWd63qv5paXc7WuugEW5pLGbYEorhYBnljRw7Gcavslb2YPduWvwcdE6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.2.0-rc.1.tgz#9b97de09f27370a3795413ccd7b238ccea9d2483" + integrity sha512-98GSYHvRMnS565sg+mxTeIALVDZwAIzssDFrdWsHhF3g+oMo7+dpbhw3CQ0PdBuEF15vUCU1fzmEi0lXzk4+6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.2.0-rc.1.tgz#6254e2c43536dd952bec32107748f5896f84891f" + integrity sha512-tw0uDtlmOVIW2CRiys/me//ratM9JeAjmzPT/gtyCfcrqmNTlbkbYu4UmGDnwGgo9XeL1LbWGbDc22s868UVYA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.2.0-rc.1.tgz#9c23c7c78720077df60f1a3809d9b688016478b5" + integrity sha512-l7spGr0LUYJXGsYYNCYOYCiv7YKyFeBzNcpYqIv+wV6glqpTvF5qa1+NU/T/cbfGCrqch3P/wr+//oqwWEcNIg== dependencies: just-compare "^2.3.0" @@ -229,13 +221,6 @@ datatables.net@2.3.4, datatables.net@^2.3.4: dependencies: jquery ">=1.7" -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - jquery-mousewheel@>=3.0.6: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -254,7 +239,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0: resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== -jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2: +jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7: version "3.6.4" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== 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..ca7faa8c46 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.2.0-rc.1" } } 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..f07a6a1e46 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,177 @@ # 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.2.0-rc.1.tgz#6427f22e77c0d5bcd072babf0bc93ec736b9b8f9" + integrity sha512-XJOKZNguxdT+MqmlPyCezZDiAmsvLqDwUOPilxvaDHPEQkgL28jRV1Jo6YfiOV178eljTukMPKXBR9IXTEAiww== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.2.0-rc.1.tgz#9c54d78dd6d96eb6611b427ef27a159e62f1c835" + integrity sha512-5XcRHqLRsWIMDtyx8LN7M9sLPaIznZwCgtQqk2cC5l0RsT9HLZmjU5QBTxnhenvuDGZ4gqNfkWyuUhtga4jgAg== 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.2.0-rc.1" + "@abp/bootstrap" "~10.2.0-rc.1" + "@abp/bootstrap-datepicker" "~10.2.0-rc.1" + "@abp/bootstrap-daterangepicker" "~10.2.0-rc.1" + "@abp/datatables.net-bs5" "~10.2.0-rc.1" + "@abp/font-awesome" "~10.2.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~10.2.0-rc.1" + "@abp/lodash" "~10.2.0-rc.1" + "@abp/luxon" "~10.2.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~10.2.0-rc.1" + "@abp/moment" "~10.2.0-rc.1" + "@abp/select2" "~10.2.0-rc.1" + "@abp/sweetalert2" "~10.2.0-rc.1" + "@abp/timeago" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.2.0-rc.1.tgz#850043c1442d6f21e9d2908b9f52848e51656bd8" + integrity sha512-C0roQpNBZMjRcPHYodP2yrvGmc4SOw3RnSjReC3p4GVd6qyirBXwAU2mKMDEwvA8jcBMRNcMSD2heY4uNDGUZA== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.2.0-rc.1.tgz#dc38443f1b25ba8a31179b5afa8e2106ddaffdf3" + integrity sha512-o96qRDYhGSU9am8dhcilxZ+gO2BiRuofWyUQEnrxPoRnjZJ301eSQvf55sFeYHxTp9h6Q7FEveOM3BtFW/F57Q== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.2.0-rc.1.tgz#6a3ffe6375c408d376f7e71de03fe9dbafc38151" + integrity sha512-dwnmwXRmixQSBZPNhTzpwtmDj3NfnhsA8q5ZotjaKcR7F0V+jsGp6sbTKKeGHaYfVDcXw2Kg3P3a4zxA1pyCcQ== dependencies: + "@abp/moment" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.2.0-rc.1.tgz#bb990c0d270ddee566c15e80df70e17a5c2a4688" + integrity sha512-Htzhib/Bmf1RBuhxJaSnBehEfkEjO6H6t91QXGT30+dO+12R1paN5Ddsg7/DpC0k9Eq+xabcUIKKMKmjbhFScg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.2.0-rc.1.tgz#aa52ef3cea768a0fbb5854d471d7d788575fd60d" + integrity sha512-2z46ob+MorakWb0xBb08Dv/EtzMgNllbYlxn28igcslsasZzKzMQ4QOvPI/6iDPgazgsoxW073AlaD2JW9e45A== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.2.0-rc.1.tgz#6a9564bb9ef20e2549b1367f8df860a3176d169f" + integrity sha512-jtRVPPa8+XSJTFT+9N8bG9TeBNt7PcHjVExglg2DFx18+TCR91Sew/H7BRaDB8+wbablEJNRacP5TIF+vIFxjQ== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.2.0-rc.1.tgz#f15671cf5ef579af8842e80b51bfb365985afe27" + integrity sha512-eA8GyXXcCtLt7IFp9HksL6aDYliA4s3b/6Mv89RUlSg2UJiTwN1fOWxcQucHXqL/UaWRTW0mtoeXx0H/AIUyJA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.2.0-rc.1.tgz#3346ca6d7b18ce3b973a74fdfbda42cd72240409" + integrity sha512-yvqaih+ZSUtYlEBd7XRK1ZUNILnFGi36xZAiTP0z9E6yxrXmAG2HB3K3VLy33iyr4SstPgUeRHwktKAGaXjorQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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-validation-unobtrusive@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.2.0-rc.1.tgz#2f91a9edf740e417f278dc88c0e5de8a01e18c8e" + integrity sha512-m9LLaFppg2rNAAKykxFMSeu0+kg8GUVEbtyYRrRWa12ezmbvm1hcMV6zzYlwSt+NOeuGJ2X/7ST5BCAgSS9llw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - 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== - dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.2.0-rc.1.tgz#e993ced0cbe2501cce50af9feb5bf7256f1e5d8e" + integrity sha512-w8abcFGyUeY8d09AkSceW4DEO/Y5xkqIA0lZ8qxLy+dS3Di3FhPQ6w6nS2N3Nwt/OZs7p8xW4HZlyEmN1D+rGA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.2.0-rc.1.tgz#04c36aa404b71fff27933b98efa266d83ce941ee" + integrity sha512-mZcHCJU8rjXx59zRf9N/uLP48DEkJOusqfnG1ZHAz36eHrQIoA2SZnsU8DwW/yHQudWno1A8g/w8scxHlYzq+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.2.0-rc.1.tgz#d21b2b60403430a11d4b4f03eace0362bc7d762d" + integrity sha512-6+YMGXvZAu1YK85jnNIxzLlcMqWFDcBHKS/4f37hQr/Vum7cz2iw2orOmY0sDnZp2jY3vBdMtWYKM1H03+lhDA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.2.0-rc.1.tgz#7b0c9669822b223d45a1f11f0414a5a51cc60af9" + integrity sha512-1cRY7kQ/rxNq0JBBBRhVQUExGvU9S9rUC8wmLdPs2lxgg7GRnNPjzIDxFXYYajKXenTBabV8MLWa6QfhgrIeUA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.2.0-rc.1.tgz#410f409c7734d017f0ee42e146bfd3508c693341" + integrity sha512-veQyOqyj/EX5mESj2AZz5HThWde00aBsC9mJ7EfTD+TZy+kyuHOqW9Z/h94hFwgkHLPozrtD5q9UngPS7T4mgw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.2.0-rc.1.tgz#99604ac5f5bdcfe40f93e74e0475a3153502313e" + integrity sha512-pRcujgAJ9zVXoNva1b4dLf5hFwcYPSf2od4Ef3Qpt0S/Q2By9XA8Kp0UqhP1R4e8zYDIGg2LWMQZE+NE2W7B0A== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.2.0-rc.1.tgz#ee9876661b92646252ee4f368422c199e60e7b61" + integrity sha512-mk7UFL1yhCh8OEdyKn6sDCaSR5iBmlWd63qv5paXc7WuugEW5pLGbYEorhYBnljRw7Gcavslb2YPduWvwcdE6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.2.0-rc.1.tgz#9b97de09f27370a3795413ccd7b238ccea9d2483" + integrity sha512-98GSYHvRMnS565sg+mxTeIALVDZwAIzssDFrdWsHhF3g+oMo7+dpbhw3CQ0PdBuEF15vUCU1fzmEi0lXzk4+6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.2.0-rc.1.tgz#6254e2c43536dd952bec32107748f5896f84891f" + integrity sha512-tw0uDtlmOVIW2CRiys/me//ratM9JeAjmzPT/gtyCfcrqmNTlbkbYu4UmGDnwGgo9XeL1LbWGbDc22s868UVYA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.2.0-rc.1.tgz#9c23c7c78720077df60f1a3809d9b688016478b5" + integrity sha512-l7spGr0LUYJXGsYYNCYOYCiv7YKyFeBzNcpYqIv+wV6glqpTvF5qa1+NU/T/cbfGCrqch3P/wr+//oqwWEcNIg== dependencies: just-compare "^2.3.0" @@ -229,13 +221,6 @@ datatables.net@2.3.4, datatables.net@^2.3.4: dependencies: jquery ">=1.7" -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - jquery-mousewheel@>=3.0.6: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -254,7 +239,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0: resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== -jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2: +jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7: version "3.6.4" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== 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..471f577cf7 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.2.0-rc.1", + "@abp/cms-kit": "10.2.0-rc.1" } } 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..e62936949f 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,285 @@ # 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.2.0-rc.1.tgz#6427f22e77c0d5bcd072babf0bc93ec736b9b8f9" + integrity sha512-XJOKZNguxdT+MqmlPyCezZDiAmsvLqDwUOPilxvaDHPEQkgL28jRV1Jo6YfiOV178eljTukMPKXBR9IXTEAiww== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.2.0-rc.1.tgz#9c54d78dd6d96eb6611b427ef27a159e62f1c835" + integrity sha512-5XcRHqLRsWIMDtyx8LN7M9sLPaIznZwCgtQqk2cC5l0RsT9HLZmjU5QBTxnhenvuDGZ4gqNfkWyuUhtga4jgAg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.2.0-rc.1" + "@abp/bootstrap" "~10.2.0-rc.1" + "@abp/bootstrap-datepicker" "~10.2.0-rc.1" + "@abp/bootstrap-daterangepicker" "~10.2.0-rc.1" + "@abp/datatables.net-bs5" "~10.2.0-rc.1" + "@abp/font-awesome" "~10.2.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~10.2.0-rc.1" + "@abp/lodash" "~10.2.0-rc.1" + "@abp/luxon" "~10.2.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~10.2.0-rc.1" + "@abp/moment" "~10.2.0-rc.1" + "@abp/select2" "~10.2.0-rc.1" + "@abp/sweetalert2" "~10.2.0-rc.1" + "@abp/timeago" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.2.0-rc.1.tgz#850043c1442d6f21e9d2908b9f52848e51656bd8" + integrity sha512-C0roQpNBZMjRcPHYodP2yrvGmc4SOw3RnSjReC3p4GVd6qyirBXwAU2mKMDEwvA8jcBMRNcMSD2heY4uNDGUZA== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.2.0-rc.1.tgz#dc38443f1b25ba8a31179b5afa8e2106ddaffdf3" + integrity sha512-o96qRDYhGSU9am8dhcilxZ+gO2BiRuofWyUQEnrxPoRnjZJ301eSQvf55sFeYHxTp9h6Q7FEveOM3BtFW/F57Q== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.2.0-rc.1.tgz#6a3ffe6375c408d376f7e71de03fe9dbafc38151" + integrity sha512-dwnmwXRmixQSBZPNhTzpwtmDj3NfnhsA8q5ZotjaKcR7F0V+jsGp6sbTKKeGHaYfVDcXw2Kg3P3a4zxA1pyCcQ== dependencies: + "@abp/moment" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.2.0-rc.1.tgz#bb990c0d270ddee566c15e80df70e17a5c2a4688" + integrity sha512-Htzhib/Bmf1RBuhxJaSnBehEfkEjO6H6t91QXGT30+dO+12R1paN5Ddsg7/DpC0k9Eq+xabcUIKKMKmjbhFScg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.2.0-rc.1.tgz#1b095c6c7daa04102b44942bb195145d55e6a722" + integrity sha512-fXcjuZOUer6afvcqsSxhrG2B4c+JuR+dVW9sJKG8Am1Va4Ju7qH0yd81rtD6dzI29CdgaESH0NlrQTBuDFNRnw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-10.2.0-rc.1.tgz#ffd2df8aaaad4bbea2ed116816f62136eb2aac1b" + integrity sha512-wjasOzDlZB19aj2XrOsCfIrLUf0x0NbcaMqcuyNt8YT2n4rZ1Ia42Y8yxT/41c6G4cx/Jlz1umNqsPmRvDNguQ== 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.2.0-rc.1" + "@abp/jstree" "~10.2.0-rc.1" + "@abp/markdown-it" "~10.2.0-rc.1" + "@abp/slugify" "~10.2.0-rc.1" + "@abp/tui-editor" "~10.2.0-rc.1" + "@abp/uppy" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-10.2.0-rc.1.tgz#2f4dfce0479094e975fe95a777c2c5264e47f84c" + integrity sha512-RxUvgnPNKhaQAJ2GzvxErDhxNxwA3HB7354SYmoai0LgqeCrDzWOxeiy08ljizi81H/8e9mvn3PYrJxAniQCyw== dependencies: - "@abp/highlight.js" "~10.1.0-rc.2" - "@abp/star-rating-svg" "~10.1.0-rc.2" + "@abp/highlight.js" "~10.2.0-rc.1" + "@abp/star-rating-svg" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-10.2.0-rc.1.tgz#c0a1c45fb80f6579afe3867f3b2425dae6288630" + integrity sha512-PpJM2NxHNTIa2LPGRB6NBDMzcjD6BL/e971zQvvxe4aXOtuZZLzgG6BRh/pPtxoD8WhqX5zCjKGyg18k4V7Hmw== dependencies: - "@abp/cms-kit.admin" "~10.1.0-rc.2" - "@abp/cms-kit.public" "~10.1.0-rc.2" + "@abp/cms-kit.admin" "~10.2.0-rc.1" + "@abp/cms-kit.public" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-10.2.0-rc.1.tgz#cc0938a2a8670858aa8294f8f3603dbbd1b39b1c" + integrity sha512-r3DXFiWhVRIK2/YEy+sMP1jhO3T/xapHsI/rsv5S9dmx18aMbEmSuZ0QQK0jRHPuCkrHWzw9LLSXqLdmQy5dag== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.2.0-rc.1.tgz#aa52ef3cea768a0fbb5854d471d7d788575fd60d" + integrity sha512-2z46ob+MorakWb0xBb08Dv/EtzMgNllbYlxn28igcslsasZzKzMQ4QOvPI/6iDPgazgsoxW073AlaD2JW9e45A== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.2.0-rc.1.tgz#6a9564bb9ef20e2549b1367f8df860a3176d169f" + integrity sha512-jtRVPPa8+XSJTFT+9N8bG9TeBNt7PcHjVExglg2DFx18+TCR91Sew/H7BRaDB8+wbablEJNRacP5TIF+vIFxjQ== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.2.0-rc.1.tgz#f15671cf5ef579af8842e80b51bfb365985afe27" + integrity sha512-eA8GyXXcCtLt7IFp9HksL6aDYliA4s3b/6Mv89RUlSg2UJiTwN1fOWxcQucHXqL/UaWRTW0mtoeXx0H/AIUyJA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.2.0-rc.1.tgz#3346ca6d7b18ce3b973a74fdfbda42cd72240409" + integrity sha512-yvqaih+ZSUtYlEBd7XRK1ZUNILnFGi36xZAiTP0z9E6yxrXmAG2HB3K3VLy33iyr4SstPgUeRHwktKAGaXjorQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-10.2.0-rc.1.tgz#e8aa5553fa2c8253a8c5dbafae2c71c8fad91524" + integrity sha512-3SB2pexK3YX9tfasWwWfJbjB2fd/WLNdnxc+eDUe0lAKR1A1TgHqi26UiSR6VZvWsuEKP9DWgpIRXBDAwx8Mdw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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-validation-unobtrusive@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.2.0-rc.1.tgz#2f91a9edf740e417f278dc88c0e5de8a01e18c8e" + integrity sha512-m9LLaFppg2rNAAKykxFMSeu0+kg8GUVEbtyYRrRWa12ezmbvm1hcMV6zzYlwSt+NOeuGJ2X/7ST5BCAgSS9llw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - 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== - dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.2.0-rc.1.tgz#e993ced0cbe2501cce50af9feb5bf7256f1e5d8e" + integrity sha512-w8abcFGyUeY8d09AkSceW4DEO/Y5xkqIA0lZ8qxLy+dS3Di3FhPQ6w6nS2N3Nwt/OZs7p8xW4HZlyEmN1D+rGA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.2.0-rc.1.tgz#04c36aa404b71fff27933b98efa266d83ce941ee" + integrity sha512-mZcHCJU8rjXx59zRf9N/uLP48DEkJOusqfnG1ZHAz36eHrQIoA2SZnsU8DwW/yHQudWno1A8g/w8scxHlYzq+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-10.2.0-rc.1.tgz#3a1081c661893b273acbdf7cd2dede15fea867c2" + integrity sha512-f6tZToay0ppwogK6eN14OIxP5jKZHeTMBTfqpnH9uYknRV+WusPf6NqBzFPZ22SGoGo3/mOaP+ISfiyu2zIPIg== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.2.0-rc.1.tgz#d21b2b60403430a11d4b4f03eace0362bc7d762d" + integrity sha512-6+YMGXvZAu1YK85jnNIxzLlcMqWFDcBHKS/4f37hQr/Vum7cz2iw2orOmY0sDnZp2jY3vBdMtWYKM1H03+lhDA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.2.0-rc.1.tgz#7b0c9669822b223d45a1f11f0414a5a51cc60af9" + integrity sha512-1cRY7kQ/rxNq0JBBBRhVQUExGvU9S9rUC8wmLdPs2lxgg7GRnNPjzIDxFXYYajKXenTBabV8MLWa6QfhgrIeUA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.2.0-rc.1.tgz#410f409c7734d017f0ee42e146bfd3508c693341" + integrity sha512-veQyOqyj/EX5mESj2AZz5HThWde00aBsC9mJ7EfTD+TZy+kyuHOqW9Z/h94hFwgkHLPozrtD5q9UngPS7T4mgw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-10.2.0-rc.1.tgz#482f213ca4986af0820b7d80735c28a5a1ffbf9e" + integrity sha512-r5A0x1pjngSpjfoVvYldG/Tchq+H0wj5rKs+oCtWPXt03+9+M268FxIR5VOrhMo0NA0J8cMPNvi17A7z+YX9IA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.2.0-rc.1.tgz#99604ac5f5bdcfe40f93e74e0475a3153502313e" + integrity sha512-pRcujgAJ9zVXoNva1b4dLf5hFwcYPSf2od4Ef3Qpt0S/Q2By9XA8Kp0UqhP1R4e8zYDIGg2LWMQZE+NE2W7B0A== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.2.0-rc.1.tgz#c2e4a65bd52e4908de7383783c6ce2892143e714" + integrity sha512-6fjsHiwGWHAvmYyjMZVEa/dKMWGvwgLBFeI5jrsKRftImZgcD1djVdNudNCgAAaA1qf6iD1n0I+lHAh8VZEFxQ== dependencies: - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/core" "~10.1.0-rc.2" + "@abp/clipboard" "~10.2.0-rc.1" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.2.0-rc.1.tgz#ee9876661b92646252ee4f368422c199e60e7b61" + integrity sha512-mk7UFL1yhCh8OEdyKn6sDCaSR5iBmlWd63qv5paXc7WuugEW5pLGbYEorhYBnljRw7Gcavslb2YPduWvwcdE6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-10.2.0-rc.1.tgz#3ca9f959c42d9c3339fbbb67942ea52def6a0ff8" + integrity sha512-N8p7aS6j8wW1hN6SM5s4MLUjlVkUoQ0J6LWX3AzDL5QoXxTuZD9QmWo/8xMHSYgpRU46lbpYZY4e5reixECjlQ== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-10.2.0-rc.1.tgz#42af109e5e8c2644a51ba81a83d5fb4d2f41c8bf" + integrity sha512-oi4D57p4CJoQRh4K4OH9AvskUP5wf0eUxD0E7Ny0hxqY2lezKt69GZsk20rzv/CohYdsT2UMmsOQNaCz8q/WkQ== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.2.0-rc.1.tgz#9b97de09f27370a3795413ccd7b238ccea9d2483" + integrity sha512-98GSYHvRMnS565sg+mxTeIALVDZwAIzssDFrdWsHhF3g+oMo7+dpbhw3CQ0PdBuEF15vUCU1fzmEi0lXzk4+6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.2.0-rc.1.tgz#6254e2c43536dd952bec32107748f5896f84891f" + integrity sha512-tw0uDtlmOVIW2CRiys/me//ratM9JeAjmzPT/gtyCfcrqmNTlbkbYu4UmGDnwGgo9XeL1LbWGbDc22s868UVYA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-10.2.0-rc.1.tgz#c8e5af26357b80446d793229600c15fd78dfa0b5" + integrity sha512-kKPObKw4J+8s6w5hNmDk1BqZoVZ+qXHITq7/N+m7OqL/PUh0wn6OQ49Wb+36IeeH4ijpZtBCxdiVgF7s0Em+yA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - "@abp/prismjs" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" + "@abp/prismjs" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-10.2.0-rc.1.tgz#3f42b93672d125057e9c4946a654fa5ab81654b0" + integrity sha512-2eCN7DPpT/aqu1JZ0T55qRdlQmbWNtkusVjVWboXoucb8keDmToVReBt5AUHXb5105uZB0mSQhS+K/4Pba9WZw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.2.0-rc.1.tgz#9c23c7c78720077df60f1a3809d9b688016478b5" + integrity sha512-l7spGr0LUYJXGsYYNCYOYCiv7YKyFeBzNcpYqIv+wV6glqpTvF5qa1+NU/T/cbfGCrqch3P/wr+//oqwWEcNIg== dependencies: just-compare "^2.3.0" @@ -2150,13 +2142,6 @@ is-stream@^4.0.1: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b" integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A== -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - jquery-mousewheel@>=3.0.6: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -2175,7 +2160,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0: resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== -jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2, jquery@^3.5.0: +jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@^3.5.0: version "3.6.4" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index 0a0a8f4726..fa6e49e403 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.2.0-rc.1", + "@abp/docs": "~10.2.0-rc.1" } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index e99b91ff81..846b295191 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,229 +2,221 @@ # 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-10.2.0-rc.1.tgz#1618ab85a36b803d00147b35f8631e7959b8b3ef" + integrity sha512-chhGnLmsf1orn5XTV2MeC4y3pg1A+dDDqQb1Q1Lw9njwZ+HuOgN6nyA20jMhkNFBhHwjh7/sjpQy4Wrhxo2eDg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.2.0-rc.1.tgz#6427f22e77c0d5bcd072babf0bc93ec736b9b8f9" + integrity sha512-XJOKZNguxdT+MqmlPyCezZDiAmsvLqDwUOPilxvaDHPEQkgL28jRV1Jo6YfiOV178eljTukMPKXBR9IXTEAiww== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.2.0-rc.1.tgz#9c54d78dd6d96eb6611b427ef27a159e62f1c835" + integrity sha512-5XcRHqLRsWIMDtyx8LN7M9sLPaIznZwCgtQqk2cC5l0RsT9HLZmjU5QBTxnhenvuDGZ4gqNfkWyuUhtga4jgAg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.2.0-rc.1" + "@abp/bootstrap" "~10.2.0-rc.1" + "@abp/bootstrap-datepicker" "~10.2.0-rc.1" + "@abp/bootstrap-daterangepicker" "~10.2.0-rc.1" + "@abp/datatables.net-bs5" "~10.2.0-rc.1" + "@abp/font-awesome" "~10.2.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~10.2.0-rc.1" + "@abp/lodash" "~10.2.0-rc.1" + "@abp/luxon" "~10.2.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~10.2.0-rc.1" + "@abp/moment" "~10.2.0-rc.1" + "@abp/select2" "~10.2.0-rc.1" + "@abp/sweetalert2" "~10.2.0-rc.1" + "@abp/timeago" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.2.0-rc.1.tgz#850043c1442d6f21e9d2908b9f52848e51656bd8" + integrity sha512-C0roQpNBZMjRcPHYodP2yrvGmc4SOw3RnSjReC3p4GVd6qyirBXwAU2mKMDEwvA8jcBMRNcMSD2heY4uNDGUZA== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.2.0-rc.1.tgz#dc38443f1b25ba8a31179b5afa8e2106ddaffdf3" + integrity sha512-o96qRDYhGSU9am8dhcilxZ+gO2BiRuofWyUQEnrxPoRnjZJ301eSQvf55sFeYHxTp9h6Q7FEveOM3BtFW/F57Q== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.2.0-rc.1.tgz#6a3ffe6375c408d376f7e71de03fe9dbafc38151" + integrity sha512-dwnmwXRmixQSBZPNhTzpwtmDj3NfnhsA8q5ZotjaKcR7F0V+jsGp6sbTKKeGHaYfVDcXw2Kg3P3a4zxA1pyCcQ== dependencies: + "@abp/moment" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.2.0-rc.1.tgz#bb990c0d270ddee566c15e80df70e17a5c2a4688" + integrity sha512-Htzhib/Bmf1RBuhxJaSnBehEfkEjO6H6t91QXGT30+dO+12R1paN5Ddsg7/DpC0k9Eq+xabcUIKKMKmjbhFScg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-10.2.0-rc.1.tgz#1b095c6c7daa04102b44942bb195145d55e6a722" + integrity sha512-fXcjuZOUer6afvcqsSxhrG2B4c+JuR+dVW9sJKG8Am1Va4Ju7qH0yd81rtD6dzI29CdgaESH0NlrQTBuDFNRnw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.2.0-rc.1.tgz#aa52ef3cea768a0fbb5854d471d7d788575fd60d" + integrity sha512-2z46ob+MorakWb0xBb08Dv/EtzMgNllbYlxn28igcslsasZzKzMQ4QOvPI/6iDPgazgsoxW073AlaD2JW9e45A== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.2.0-rc.1.tgz#6a9564bb9ef20e2549b1367f8df860a3176d169f" + integrity sha512-jtRVPPa8+XSJTFT+9N8bG9TeBNt7PcHjVExglg2DFx18+TCR91Sew/H7BRaDB8+wbablEJNRacP5TIF+vIFxjQ== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.2.0-rc.1.tgz#f15671cf5ef579af8842e80b51bfb365985afe27" + integrity sha512-eA8GyXXcCtLt7IFp9HksL6aDYliA4s3b/6Mv89RUlSg2UJiTwN1fOWxcQucHXqL/UaWRTW0mtoeXx0H/AIUyJA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-10.2.0-rc.1.tgz#2e7da9cba90f96d8f4fbfa8bd9fe329300b54198" + integrity sha512-B+Db3iUFH7OrXwtnrolyi9p9TYh8JkXgXxLBbV900pU6MOPPC3BfF2FmG/ht0Wbqq6LNZVwXqbAWyflxe6hQiQ== 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.2.0-rc.1" + "@abp/clipboard" "~10.2.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~10.2.0-rc.1" + "@abp/popper.js" "~10.2.0-rc.1" + "@abp/prismjs" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.2.0-rc.1.tgz#3346ca6d7b18ce3b973a74fdfbda42cd72240409" + integrity sha512-yvqaih+ZSUtYlEBd7XRK1ZUNILnFGi36xZAiTP0z9E6yxrXmAG2HB3K3VLy33iyr4SstPgUeRHwktKAGaXjorQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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-validation-unobtrusive@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.2.0-rc.1.tgz#2f91a9edf740e417f278dc88c0e5de8a01e18c8e" + integrity sha512-m9LLaFppg2rNAAKykxFMSeu0+kg8GUVEbtyYRrRWa12ezmbvm1hcMV6zzYlwSt+NOeuGJ2X/7ST5BCAgSS9llw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - 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== - dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.2.0-rc.1.tgz#e993ced0cbe2501cce50af9feb5bf7256f1e5d8e" + integrity sha512-w8abcFGyUeY8d09AkSceW4DEO/Y5xkqIA0lZ8qxLy+dS3Di3FhPQ6w6nS2N3Nwt/OZs7p8xW4HZlyEmN1D+rGA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.2.0-rc.1.tgz#04c36aa404b71fff27933b98efa266d83ce941ee" + integrity sha512-mZcHCJU8rjXx59zRf9N/uLP48DEkJOusqfnG1ZHAz36eHrQIoA2SZnsU8DwW/yHQudWno1A8g/w8scxHlYzq+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.2.0-rc.1.tgz#d21b2b60403430a11d4b4f03eace0362bc7d762d" + integrity sha512-6+YMGXvZAu1YK85jnNIxzLlcMqWFDcBHKS/4f37hQr/Vum7cz2iw2orOmY0sDnZp2jY3vBdMtWYKM1H03+lhDA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.2.0-rc.1.tgz#7b0c9669822b223d45a1f11f0414a5a51cc60af9" + integrity sha512-1cRY7kQ/rxNq0JBBBRhVQUExGvU9S9rUC8wmLdPs2lxgg7GRnNPjzIDxFXYYajKXenTBabV8MLWa6QfhgrIeUA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.2.0-rc.1.tgz#410f409c7734d017f0ee42e146bfd3508c693341" + integrity sha512-veQyOqyj/EX5mESj2AZz5HThWde00aBsC9mJ7EfTD+TZy+kyuHOqW9Z/h94hFwgkHLPozrtD5q9UngPS7T4mgw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.2.0-rc.1.tgz#99604ac5f5bdcfe40f93e74e0475a3153502313e" + integrity sha512-pRcujgAJ9zVXoNva1b4dLf5hFwcYPSf2od4Ef3Qpt0S/Q2By9XA8Kp0UqhP1R4e8zYDIGg2LWMQZE+NE2W7B0A== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-10.2.0-rc.1.tgz#ae2ec914100d9a98ca96ebb9e5e94fc0e814b81c" + integrity sha512-jiGpxUSfTIYcEUtyr0lg1NGPnb+7sabzFbR0nNMzEqwhU0CDBVYaqDZrDYQ7GY9Ul3jtZ+6aNnwBIUMpUWjOQw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-10.2.0-rc.1.tgz#c2e4a65bd52e4908de7383783c6ce2892143e714" + integrity sha512-6fjsHiwGWHAvmYyjMZVEa/dKMWGvwgLBFeI5jrsKRftImZgcD1djVdNudNCgAAaA1qf6iD1n0I+lHAh8VZEFxQ== dependencies: - "@abp/clipboard" "~10.1.0-rc.2" - "@abp/core" "~10.1.0-rc.2" + "@abp/clipboard" "~10.2.0-rc.1" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.2.0-rc.1.tgz#ee9876661b92646252ee4f368422c199e60e7b61" + integrity sha512-mk7UFL1yhCh8OEdyKn6sDCaSR5iBmlWd63qv5paXc7WuugEW5pLGbYEorhYBnljRw7Gcavslb2YPduWvwcdE6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.2.0-rc.1.tgz#9b97de09f27370a3795413ccd7b238ccea9d2483" + integrity sha512-98GSYHvRMnS565sg+mxTeIALVDZwAIzssDFrdWsHhF3g+oMo7+dpbhw3CQ0PdBuEF15vUCU1fzmEi0lXzk4+6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.2.0-rc.1.tgz#6254e2c43536dd952bec32107748f5896f84891f" + integrity sha512-tw0uDtlmOVIW2CRiys/me//ratM9JeAjmzPT/gtyCfcrqmNTlbkbYu4UmGDnwGgo9XeL1LbWGbDc22s868UVYA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.2.0-rc.1.tgz#9c23c7c78720077df60f1a3809d9b688016478b5" + integrity sha512-l7spGr0LUYJXGsYYNCYOYCiv7YKyFeBzNcpYqIv+wV6glqpTvF5qa1+NU/T/cbfGCrqch3P/wr+//oqwWEcNIg== dependencies: just-compare "^2.3.0" @@ -304,13 +296,6 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - jquery-mousewheel@>=3.0.6: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -329,7 +314,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0: resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== -jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2: +jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7: version "3.6.4" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor index 321a4774b8..c7e6961ea3 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor @@ -2,8 +2,8 @@ @using Microsoft.Extensions.Localization @inherits AbpFeatureManagementComponentBase - - + + @L["Features"]@ProviderKeyDisplayName @@ -41,9 +41,9 @@ { @GetShownName(feature) - + @if (feature.Description != null) {
@feature.Description
@@ -57,7 +57,7 @@ var selectedValue = SelectionStringValues[feature.Name]; @GetShownName(feature) - @foreach (var item in items) { @@ -75,7 +75,7 @@ if (feature.ValueType is ToggleStringValueType) { - + @GetShownName(feature) @if (feature.Description != null) 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/AbpChangeEmailTokenProvider.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpChangeEmailTokenProvider.cs new file mode 100644 index 0000000000..344c188264 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpChangeEmailTokenProvider.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Volo.Abp.Identity; +using Volo.Abp.Threading; + +namespace Volo.Abp.Identity.AspNetCore; + +/// +/// Change email token provider that enforces only the most recently issued +/// token to be valid, with a configurable expiration period. +/// +public class AbpChangeEmailTokenProvider : AbpSingleActiveTokenProvider +{ + public const string ProviderName = "AbpChangeEmail"; + + public AbpChangeEmailTokenProvider( + IDataProtectionProvider dataProtectionProvider, + IOptions options, + ILogger> logger, + IIdentityUserRepository userRepository, + ICancellationTokenProvider cancellationTokenProvider) + : base(dataProtectionProvider, options, logger, userRepository, cancellationTokenProvider) + { + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpChangeEmailTokenProviderOptions.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpChangeEmailTokenProviderOptions.cs new file mode 100644 index 0000000000..f1e201d240 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpChangeEmailTokenProviderOptions.cs @@ -0,0 +1,13 @@ +using System; +using Microsoft.AspNetCore.Identity; + +namespace Volo.Abp.Identity.AspNetCore; + +public class AbpChangeEmailTokenProviderOptions : DataProtectionTokenProviderOptions +{ + public AbpChangeEmailTokenProviderOptions() + { + Name = AbpChangeEmailTokenProvider.ProviderName; + TokenLifespan = TimeSpan.FromHours(2); + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpEmailConfirmationTokenProvider.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpEmailConfirmationTokenProvider.cs new file mode 100644 index 0000000000..1f99543f8f --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpEmailConfirmationTokenProvider.cs @@ -0,0 +1,40 @@ +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Volo.Abp.Identity; +using Volo.Abp.Threading; + +namespace Volo.Abp.Identity.AspNetCore; + +/// +/// Email confirmation token provider that enforces only the most recently issued +/// token to be valid, with a configurable expiration period. +/// Token reuse is bounded by the token expiry and the single-active policy: +/// generating a new token overwrites the stored hash, invalidating all previous tokens. +/// +/// Unlike password-reset and change-email flows, +/// does not update the security stamp, so the token hash is NOT automatically +/// invalidated after a successful confirmation. Callers that require single-use semantics +/// must explicitly revoke the hash after confirmation: +/// +/// var result = await userManager.ConfirmEmailAsync(user, token); +/// if (result.Succeeded) +/// await userManager.RemoveEmailConfirmationTokenAsync(user); +/// +/// +/// +public class AbpEmailConfirmationTokenProvider : AbpSingleActiveTokenProvider +{ + public const string ProviderName = "AbpEmailConfirmation"; + + public AbpEmailConfirmationTokenProvider( + IDataProtectionProvider dataProtectionProvider, + IOptions options, + ILogger> logger, + IIdentityUserRepository userRepository, + ICancellationTokenProvider cancellationTokenProvider) + : base(dataProtectionProvider, options, logger, userRepository, cancellationTokenProvider) + { + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpEmailConfirmationTokenProviderOptions.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpEmailConfirmationTokenProviderOptions.cs new file mode 100644 index 0000000000..34909360f2 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpEmailConfirmationTokenProviderOptions.cs @@ -0,0 +1,13 @@ +using System; +using Microsoft.AspNetCore.Identity; + +namespace Volo.Abp.Identity.AspNetCore; + +public class AbpEmailConfirmationTokenProviderOptions : DataProtectionTokenProviderOptions +{ + public AbpEmailConfirmationTokenProviderOptions() + { + Name = AbpEmailConfirmationTokenProvider.ProviderName; + TokenLifespan = TimeSpan.FromHours(2); + } +} 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..3284a31601 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; @@ -19,6 +20,9 @@ public class AbpIdentityAspNetCoreModule : AbpModule builder .AddDefaultTokenProviders() .AddTokenProvider(LinkUserTokenProviderConsts.LinkUserTokenProviderName) + .AddTokenProvider(AbpPasswordResetTokenProvider.ProviderName) + .AddTokenProvider(AbpEmailConfirmationTokenProvider.ProviderName) + .AddTokenProvider(AbpChangeEmailTokenProvider.ProviderName) .AddSignInManager() .AddUserValidator(); }); @@ -26,6 +30,13 @@ public class AbpIdentityAspNetCoreModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { + Configure(options => + { + options.Tokens.PasswordResetTokenProvider = AbpPasswordResetTokenProvider.ProviderName; + options.Tokens.EmailConfirmationTokenProvider = AbpEmailConfirmationTokenProvider.ProviderName; + options.Tokens.ChangeEmailTokenProvider = AbpChangeEmailTokenProvider.ProviderName; + }); + //(TODO: Extract an extension method like IdentityBuilder.AddAbpSecurityStampValidator()) context.Services.AddScoped(); context.Services.AddScoped(typeof(SecurityStampValidator), provider => provider.GetService(typeof(AbpSecurityStampValidator))); @@ -47,6 +58,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/AbpPasswordResetTokenProvider.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpPasswordResetTokenProvider.cs new file mode 100644 index 0000000000..cc3c960804 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpPasswordResetTokenProvider.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Volo.Abp.Identity; +using Volo.Abp.Threading; + +namespace Volo.Abp.Identity.AspNetCore; + +/// +/// Password reset token provider that enforces only the most recently issued +/// token to be valid, with a configurable expiration period. +/// +public class AbpPasswordResetTokenProvider : AbpSingleActiveTokenProvider +{ + public const string ProviderName = "AbpPasswordReset"; + + public AbpPasswordResetTokenProvider( + IDataProtectionProvider dataProtectionProvider, + IOptions options, + ILogger> logger, + IIdentityUserRepository userRepository, + ICancellationTokenProvider cancellationTokenProvider) + : base(dataProtectionProvider, options, logger, userRepository, cancellationTokenProvider) + { + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpPasswordResetTokenProviderOptions.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpPasswordResetTokenProviderOptions.cs new file mode 100644 index 0000000000..15b42acad5 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpPasswordResetTokenProviderOptions.cs @@ -0,0 +1,13 @@ +using System; +using Microsoft.AspNetCore.Identity; + +namespace Volo.Abp.Identity.AspNetCore; + +public class AbpPasswordResetTokenProviderOptions : DataProtectionTokenProviderOptions +{ + public AbpPasswordResetTokenProviderOptions() + { + Name = AbpPasswordResetTokenProvider.ProviderName; + TokenLifespan = TimeSpan.FromHours(2); + } +} 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..8fef563b0e 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 FindByEmailAsync(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.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSingleActiveTokenProvider.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSingleActiveTokenProvider.cs new file mode 100644 index 0000000000..aa6454085c --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSingleActiveTokenProvider.cs @@ -0,0 +1,94 @@ +using System; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; +using Volo.Abp.Threading; + +namespace Volo.Abp.Identity.AspNetCore; + +/// +/// Base class for ABP token providers that enforce a "single active token" policy: +/// generating a new token automatically invalidates all previously issued tokens. +/// Token validity is enforced by SecurityStamp verification (via the base class) and +/// by the stored hash, which is overwritten each time a new token is generated. +/// +public abstract class AbpSingleActiveTokenProvider : DataProtectorTokenProvider +{ + /// + /// The internal login provider name used to store token hashes in the user token table. + /// Using a bracketed name clearly distinguishes these internal entries from real external + /// login providers (e.g. Google, GitHub) stored in the same table. + /// + public const string InternalLoginProvider = "[AbpSingleActiveToken]"; + + protected IIdentityUserRepository UserRepository { get; } + + protected ICancellationTokenProvider CancellationTokenProvider { get; } + + protected AbpSingleActiveTokenProvider( + IDataProtectionProvider dataProtectionProvider, + IOptions options, + ILogger> logger, + IIdentityUserRepository userRepository, + ICancellationTokenProvider cancellationTokenProvider) + : base(dataProtectionProvider, options, logger) + { + UserRepository = userRepository; + CancellationTokenProvider = cancellationTokenProvider; + } + + public override async Task GenerateAsync(string purpose, UserManager manager, IdentityUser user) + { + var token = await base.GenerateAsync(purpose, manager, user); + + await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Tokens, CancellationTokenProvider.Token); + var tokenHash = ComputeSha256Hash(token); + user.SetToken(InternalLoginProvider, Options.Name + ":" + purpose, tokenHash); + + await manager.UpdateAsync(user); + + return token; + } + + public override async Task ValidateAsync(string purpose, string token, UserManager manager, IdentityUser user) + { + if (!await base.ValidateAsync(purpose, token, manager, user)) + { + return false; + } + + await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Tokens, CancellationTokenProvider.Token); + + var storedHash = user.FindToken(InternalLoginProvider, Options.Name + ":" + purpose)?.Value; + if (storedHash == null) + { + return false; + } + + var inputHash = ComputeSha256Hash(token); + try + { + var storedHashBytes = Convert.FromHexString(storedHash); + var inputHashBytes = Convert.FromHexString(inputHash); + return CryptographicOperations.FixedTimeEquals(storedHashBytes, inputHashBytes); + } + catch (FormatException) + { + // In case the stored hash is corrupted or not a valid hex string, + // treat the token as invalid rather than throwing. + return false; + } + } + + protected virtual string ComputeSha256Hash(string input) + { + var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(input)); + return Convert.ToHexString(bytes); + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/IdentityUserManagerSingleActiveTokenExtensions.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/IdentityUserManagerSingleActiveTokenExtensions.cs new file mode 100644 index 0000000000..5b721241fd --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/IdentityUserManagerSingleActiveTokenExtensions.cs @@ -0,0 +1,43 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; + +namespace Volo.Abp.Identity.AspNetCore; + +/// +/// Provides extension methods on for invalidating +/// single-active tokens managed by . +/// These helpers live in the AspNetCore layer because they depend on +/// . +/// +public static class IdentityUserManagerSingleActiveTokenExtensions +{ + /// + /// Removes the stored password-reset token hash for , + /// immediately invalidating any previously issued password-reset token. + /// + public static Task RemovePasswordResetTokenAsync(this IdentityUserManager manager, IdentityUser user) + { + var name = manager.Options.Tokens.PasswordResetTokenProvider + ":" + UserManager.ResetPasswordTokenPurpose; + return manager.RemoveAuthenticationTokenAsync(user, AbpSingleActiveTokenProvider.InternalLoginProvider, name); + } + + /// + /// Removes the stored email-confirmation token hash for , + /// immediately invalidating any previously issued email-confirmation token. + /// + public static Task RemoveEmailConfirmationTokenAsync(this IdentityUserManager manager, IdentityUser user) + { + var name = manager.Options.Tokens.EmailConfirmationTokenProvider + ":" + UserManager.ConfirmEmailTokenPurpose; + return manager.RemoveAuthenticationTokenAsync(user, AbpSingleActiveTokenProvider.InternalLoginProvider, name); + } + + /// + /// Removes the stored change-email token hash for , + /// immediately invalidating any previously issued change-email token for . + /// + public static Task RemoveChangeEmailTokenAsync(this IdentityUserManager manager, IdentityUser user, string newEmail) + { + var name = manager.Options.Tokens.ChangeEmailTokenProvider + ":" + UserManager.GetChangeEmailTokenPurpose(newEmail); + return manager.RemoveAuthenticationTokenAsync(user, AbpSingleActiveTokenProvider.InternalLoginProvider, name); + } +} 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..2dcaea5eac 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 @@ -39,9 +39,9 @@ @* ************************* CREATE MODAL ************************* *@ @if (HasCreatePermission) { - - -
+ + + @L["NewRole"] @@ -51,23 +51,23 @@ @L["DisplayName:RoleName"] * - + - + - @L["DisplayName:IsDefault"] - @L["DisplayName:IsPublic"] + @L["DisplayName:IsDefault"] + @L["DisplayName:IsPublic"] - + @@ -76,9 +76,9 @@ @* ************************* EDIT MODAL ************************* *@ @if (HasUpdatePermission) { - - -
+ + + @L["Edit"] @@ -89,23 +89,23 @@ @L["DisplayName:RoleName"] * - + - + - @L["DisplayName:IsDefault"] - @L["DisplayName:IsPublic"] + @L["DisplayName:IsDefault"] + @L["DisplayName:IsPublic"] - + 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..28cb7f0bed 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 @@ -26,7 +26,7 @@
- +
@@ -46,9 +46,9 @@ @* ************************* CREATE MODAL ************************* *@ @if (HasCreatePermission) { - - -
+ + + @L["NewUser"] @@ -65,31 +65,31 @@ @L["DisplayName:UserName"] * - + - + @L["DisplayName:Name"] - + - + @L["DisplayName:Surname"] - + - + @@ -97,8 +97,8 @@ @L["DisplayName:Password"] * - - + + - + @@ -167,9 +167,9 @@ @* ************************* EDIT MODAL ************************* *@ @if (HasUpdatePermission) { - - -
+ + + @L["Edit"] @@ -191,31 +191,31 @@ @L["DisplayName:UserName"] * - + - + @L["DisplayName:Name"] - + - + @L["DisplayName:Surname"] - + - + @@ -223,8 +223,8 @@ @L["DisplayName:Password"] - - + + - + 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.Domain.abppkg.analyze.json b/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.abppkg.analyze.json index ce916cf284..05f8f7d4c0 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.abppkg.analyze.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.abppkg.analyze.json @@ -1747,6 +1747,84 @@ } ] }, + { + "returnType": "Void", + "namespace": "Volo.Abp.Identity", + "name": "SetUserNameWithoutValidation", + "summary": null, + "isAsync": false, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String", + "name": "userName", + "isOptional": false + }, + { + "type": "String", + "name": "normalizedUserName", + "isOptional": false + } + ] + }, + { + "returnType": "Void", + "namespace": "Volo.Abp.Identity", + "name": "SetEmailWithoutValidation", + "summary": null, + "isAsync": false, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String", + "name": "email", + "isOptional": false + }, + { + "type": "String", + "name": "normalizedEmail", + "isOptional": false + } + ] + }, + { + "returnType": "Void", + "namespace": "Volo.Abp.Identity", + "name": "SetPasswordHashWithoutValidation", + "summary": null, + "isAsync": false, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String", + "name": "passwordHash", + "isOptional": false + } + ] + }, + { + "returnType": "Void", + "namespace": "Volo.Abp.Identity", + "name": "SetLeaved", + "summary": null, + "isAsync": false, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "Boolean", + "name": "leaved", + "isOptional": false + } + ] + }, { "returnType": "String", "namespace": "Volo.Abp.Identity", @@ -1917,6 +1995,11 @@ "name": "LastSignInTime", "summary": "Gets or sets the last sign-in time for the user." }, + { + "type": "System.Boolean", + "name": "Leaved", + "summary": "Gets or sets a flag indicating whether this user is leaved from tenant." + }, { "type": "System.Collections.Generic.ICollection`1[Volo.Abp.Identity.IdentityUserRole]", "name": "Roles", @@ -3014,6 +3097,33 @@ } ] }, + { + "returnType": "IdentityResult", + "namespace": "Volo.Abp.Identity", + "name": "CallUpdatePasswordHash", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "IdentityUser", + "name": "user", + "isOptional": false + }, + { + "type": "String", + "name": "newPassword", + "isOptional": false + }, + { + "type": "Boolean", + "name": "validatePassword", + "isOptional": false + } + ] + }, { "returnType": "IdentityUser", "namespace": "Volo.Abp.Identity", @@ -3368,6 +3478,33 @@ } ] }, + { + "returnType": "IdentityResult", + "namespace": "Volo.Abp.Identity", + "name": "ChangePasswordAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "IdentityUser", + "name": "user", + "isOptional": false + }, + { + "type": "String", + "name": "currentPassword", + "isOptional": false + }, + { + "type": "String", + "name": "newPassword", + "isOptional": false + } + ] + }, { "returnType": "Void", "namespace": "Volo.Abp.Identity", @@ -3467,6 +3604,79 @@ "isOptional": false } ] + }, + { + "returnType": "IdentityUser", + "namespace": "Volo.Abp.Identity", + "name": "FindSharedUserByEmailAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String", + "name": "email", + "isOptional": false + } + ] + }, + { + "returnType": "IdentityUser", + "namespace": "Volo.Abp.Identity", + "name": "FindSharedUserByNameAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String", + "name": "userName", + "isOptional": false + } + ] + }, + { + "returnType": "IdentityUser", + "namespace": "Volo.Abp.Identity", + "name": "FindSharedUserByLoginAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String", + "name": "loginProvider", + "isOptional": false + }, + { + "type": "String", + "name": "providerKey", + "isOptional": false + } + ] + }, + { + "returnType": "IdentityUser", + "namespace": "Volo.Abp.Identity", + "name": "FindSharedUserByPasskeyIdAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "Byte[]", + "name": "credentialId", + "isOptional": false + } + ] } ], "implementingInterfaces": [ @@ -5800,6 +6010,237 @@ "isOptional": true } ] + }, + { + "returnType": "List", + "namespace": "Volo.Abp.Identity", + "name": "GetUsersByNormalizedUserNameAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String", + "name": "normalizedUserName", + "isOptional": false + }, + { + "type": "Boolean", + "name": "includeDetails", + "isOptional": true + }, + { + "type": "CancellationToken", + "name": "cancellationToken", + "isOptional": true + } + ] + }, + { + "returnType": "List", + "namespace": "Volo.Abp.Identity", + "name": "GetUsersByNormalizedUserNamesAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String[]", + "name": "normalizedUserNames", + "isOptional": false + }, + { + "type": "Boolean", + "name": "includeDetails", + "isOptional": true + }, + { + "type": "CancellationToken", + "name": "cancellationToken", + "isOptional": true + } + ] + }, + { + "returnType": "List", + "namespace": "Volo.Abp.Identity", + "name": "GetUsersByNormalizedEmailAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String", + "name": "normalizedEmail", + "isOptional": false + }, + { + "type": "Boolean", + "name": "includeDetails", + "isOptional": true + }, + { + "type": "CancellationToken", + "name": "cancellationToken", + "isOptional": true + } + ] + }, + { + "returnType": "List", + "namespace": "Volo.Abp.Identity", + "name": "GetUsersByNormalizedEmailsAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String[]", + "name": "normalizedEmails", + "isOptional": false + }, + { + "type": "Boolean", + "name": "includeDetails", + "isOptional": true + }, + { + "type": "CancellationToken", + "name": "cancellationToken", + "isOptional": true + } + ] + }, + { + "returnType": "List", + "namespace": "Volo.Abp.Identity", + "name": "GetUsersByLoginAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "String", + "name": "loginProvider", + "isOptional": false + }, + { + "type": "String", + "name": "providerKey", + "isOptional": false + }, + { + "type": "Boolean", + "name": "includeDetails", + "isOptional": true + }, + { + "type": "CancellationToken", + "name": "cancellationToken", + "isOptional": true + } + ] + }, + { + "returnType": "List", + "namespace": "Volo.Abp.Identity", + "name": "GetUsersByPasskeyIdAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "Byte[]", + "name": "credentialId", + "isOptional": false + }, + { + "type": "Boolean", + "name": "includeDetails", + "isOptional": true + }, + { + "type": "CancellationToken", + "name": "cancellationToken", + "isOptional": true + } + ] + }, + { + "returnType": "IdentityUser", + "namespace": "Volo.Abp.Identity", + "name": "FindByNormalizedUserNameAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "Nullable", + "name": "tenantId", + "isOptional": false + }, + { + "type": "String", + "name": "normalizedUserName", + "isOptional": false + }, + { + "type": "Boolean", + "name": "includeDetails", + "isOptional": true + }, + { + "type": "CancellationToken", + "name": "cancellationToken", + "isOptional": true + } + ] + }, + { + "returnType": "IdentityUser", + "namespace": "Volo.Abp.Identity", + "name": "FindByNormalizedEmailAsync", + "summary": null, + "isAsync": true, + "isPublic": true, + "isPrivate": false, + "isStatic": false, + "parameters": [ + { + "type": "Nullable", + "name": "tenantId", + "isOptional": false + }, + { + "type": "String", + "name": "normalizedEmail", + "isOptional": false + }, + { + "type": "Boolean", + "name": "includeDetails", + "isOptional": true + }, + { + "type": "CancellationToken", + "name": "cancellationToken", + "isOptional": true + } + ] } ], "contentType": "repositoryInterface", 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.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/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/AbpChangeEmailTokenProvider_Tests.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpChangeEmailTokenProvider_Tests.cs new file mode 100644 index 0000000000..dee4ebe068 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpChangeEmailTokenProvider_Tests.cs @@ -0,0 +1,68 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Options; +using Shouldly; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Identity.AspNetCore; + +public class AbpChangeEmailTokenProvider_Tests : AbpSingleActiveTokenProviderTestBase +{ + private const string NewEmail = "newemail@example.com"; + + protected override Task GenerateTokenAsync(IdentityUser user) + => UserManager.GenerateChangeEmailTokenAsync(user, NewEmail); + + protected override Task VerifyTokenAsync(IdentityUser user, string token) + => UserManager.VerifyUserTokenAsync( + user, + UserManager.Options.Tokens.ChangeEmailTokenProvider, + UserManager.GetChangeEmailTokenPurpose(NewEmail), + token); + + protected override string GetProviderName() + => UserManager.Options.Tokens.ChangeEmailTokenProvider; + + protected override string GetPurpose() + => UserManager.GetChangeEmailTokenPurpose(NewEmail); + + [Fact] + public void AbpChangeEmailTokenProvider_Should_Be_Registered() + { + var identityOptions = GetRequiredService>().Value; + + identityOptions.Tokens.ProviderMap.ShouldContainKey(AbpChangeEmailTokenProvider.ProviderName); + identityOptions.Tokens.ProviderMap[AbpChangeEmailTokenProvider.ProviderName].ProviderType + .ShouldBe(typeof(AbpChangeEmailTokenProvider)); + } + + [Fact] + public void ChangeEmailTokenProvider_Should_Be_Configured_As_Abp() + { + var identityOptions = GetRequiredService>().Value; + + identityOptions.Tokens.ChangeEmailTokenProvider.ShouldBe(AbpChangeEmailTokenProvider.ProviderName); + } + + [Fact] + public async Task Token_Should_Become_Invalid_After_Email_Change() + { + using (var uow = UnitOfWorkManager.Begin()) + { + var john = await UserRepository.GetAsync(TestData.UserJohnId); + + var token = await UserManager.GenerateChangeEmailTokenAsync(john, NewEmail); + + john = await UserRepository.GetAsync(TestData.UserJohnId); + var result = await UserManager.ChangeEmailAsync(john, NewEmail, token); + result.Succeeded.ShouldBeTrue(); + + // SecurityStamp has changed after the email change, so the old token must be invalid. + john = await UserRepository.GetAsync(TestData.UserJohnId); + (await VerifyTokenAsync(john, token)).ShouldBeFalse(); + + await uow.CompleteAsync(); + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpEmailConfirmationTokenProvider_Tests.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpEmailConfirmationTokenProvider_Tests.cs new file mode 100644 index 0000000000..fe8d5c7de8 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpEmailConfirmationTokenProvider_Tests.cs @@ -0,0 +1,69 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Options; +using Shouldly; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Identity.AspNetCore; + +public class AbpEmailConfirmationTokenProvider_Tests : AbpSingleActiveTokenProviderTestBase +{ + protected override Task GenerateTokenAsync(IdentityUser user) + => UserManager.GenerateEmailConfirmationTokenAsync(user); + + protected override Task VerifyTokenAsync(IdentityUser user, string token) + => UserManager.VerifyUserTokenAsync( + user, + UserManager.Options.Tokens.EmailConfirmationTokenProvider, + UserManager.ConfirmEmailTokenPurpose, + token); + + protected override string GetProviderName() + => UserManager.Options.Tokens.EmailConfirmationTokenProvider; + + protected override string GetPurpose() + => UserManager.ConfirmEmailTokenPurpose; + + [Fact] + public void AbpEmailConfirmationTokenProvider_Should_Be_Registered() + { + var identityOptions = GetRequiredService>().Value; + + identityOptions.Tokens.ProviderMap.ShouldContainKey(AbpEmailConfirmationTokenProvider.ProviderName); + identityOptions.Tokens.ProviderMap[AbpEmailConfirmationTokenProvider.ProviderName].ProviderType + .ShouldBe(typeof(AbpEmailConfirmationTokenProvider)); + } + + [Fact] + public void EmailConfirmationTokenProvider_Should_Be_Configured_As_Abp() + { + var identityOptions = GetRequiredService>().Value; + + identityOptions.Tokens.EmailConfirmationTokenProvider.ShouldBe(AbpEmailConfirmationTokenProvider.ProviderName); + } + + [Fact] + public async Task Token_Should_Become_Invalid_After_Email_Confirmation_With_Explicit_Revocation() + { + using (var uow = UnitOfWorkManager.Begin()) + { + var john = await UserRepository.GetAsync(TestData.UserJohnId); + + var token = await UserManager.GenerateEmailConfirmationTokenAsync(john); + + var result = await UserManager.ConfirmEmailAsync(john, token); + result.Succeeded.ShouldBeTrue(); + + // ConfirmEmailAsync does NOT update SecurityStamp, so the hash is not + // automatically invalidated. Callers must explicitly revoke the hash. + john = await UserRepository.GetAsync(TestData.UserJohnId); + (await UserManager.RemoveEmailConfirmationTokenAsync(john)).Succeeded.ShouldBeTrue(); + + john = await UserRepository.GetAsync(TestData.UserJohnId); + (await VerifyTokenAsync(john, token)).ShouldBeFalse(); + + await uow.CompleteAsync(); + } + } +} 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.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpPasswordResetTokenProvider_Tests.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpPasswordResetTokenProvider_Tests.cs new file mode 100644 index 0000000000..870829a975 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpPasswordResetTokenProvider_Tests.cs @@ -0,0 +1,66 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Options; +using Shouldly; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Identity.AspNetCore; + +public class AbpPasswordResetTokenProvider_Tests : AbpSingleActiveTokenProviderTestBase +{ + protected override Task GenerateTokenAsync(IdentityUser user) + => UserManager.GeneratePasswordResetTokenAsync(user); + + protected override Task VerifyTokenAsync(IdentityUser user, string token) + => UserManager.VerifyUserTokenAsync( + user, + UserManager.Options.Tokens.PasswordResetTokenProvider, + UserManager.ResetPasswordTokenPurpose, + token); + + protected override string GetProviderName() + => UserManager.Options.Tokens.PasswordResetTokenProvider; + + protected override string GetPurpose() + => UserManager.ResetPasswordTokenPurpose; + + [Fact] + public void AbpPasswordResetTokenProvider_Should_Be_Registered() + { + var identityOptions = GetRequiredService>().Value; + + identityOptions.Tokens.ProviderMap.ShouldContainKey(AbpPasswordResetTokenProvider.ProviderName); + identityOptions.Tokens.ProviderMap[AbpPasswordResetTokenProvider.ProviderName].ProviderType + .ShouldBe(typeof(AbpPasswordResetTokenProvider)); + } + + [Fact] + public void PasswordResetTokenProvider_Should_Be_Configured_As_Abp() + { + var identityOptions = GetRequiredService>().Value; + + identityOptions.Tokens.PasswordResetTokenProvider.ShouldBe(AbpPasswordResetTokenProvider.ProviderName); + } + + [Fact] + public async Task Token_Should_Become_Invalid_After_Password_Reset() + { + using (var uow = UnitOfWorkManager.Begin()) + { + var john = await UserRepository.GetAsync(TestData.UserJohnId); + + var token = await UserManager.GeneratePasswordResetTokenAsync(john); + + john = await UserRepository.GetAsync(TestData.UserJohnId); + var result = await UserManager.ResetPasswordAsync(john, token, "1q2w3E*NewP@ss!"); + result.Succeeded.ShouldBeTrue(); + + // SecurityStamp has changed after reset, so the old token must be invalid. + john = await UserRepository.GetAsync(TestData.UserJohnId); + (await VerifyTokenAsync(john, token)).ShouldBeFalse(); + + await uow.CompleteAsync(); + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpSingleActiveTokenProviderTestBase.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpSingleActiveTokenProviderTestBase.cs new file mode 100644 index 0000000000..4f42391a05 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpSingleActiveTokenProviderTestBase.cs @@ -0,0 +1,138 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Shouldly; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Identity.AspNetCore; + +/// +/// Abstract base class that exercises the common behaviour of every +/// subclass. +/// Concrete subclasses inject their provider-specific generate/verify helpers +/// so the same test suite runs against each provider. +/// +public abstract class AbpSingleActiveTokenProviderTestBase : AbpIdentityAspNetCoreTestBase +{ + protected IIdentityUserRepository UserRepository { get; } + protected IdentityUserManager UserManager { get; } + protected IdentityTestData TestData { get; } + protected IUnitOfWorkManager UnitOfWorkManager { get; } + + protected AbpSingleActiveTokenProviderTestBase() + { + UserRepository = GetRequiredService(); + UserManager = GetRequiredService(); + TestData = GetRequiredService(); + UnitOfWorkManager = GetRequiredService(); + } + + /// Generates a token for via the provider under test. + protected abstract Task GenerateTokenAsync(IdentityUser user); + + /// Verifies for via the provider under test. + protected abstract Task VerifyTokenAsync(IdentityUser user, string token); + + /// Returns the provider name used to look up the stored hash. + protected abstract string GetProviderName(); + + /// Returns the token purpose used as the hash key prefix. + protected abstract string GetPurpose(); + + private string GetTokenHashName() => GetProviderName() + ":" + GetPurpose(); + + [Fact] + public async Task Generate_And_Verify_Token_Should_Succeed() + { + using (var uow = UnitOfWorkManager.Begin()) + { + var user = await UserRepository.GetAsync(TestData.UserJohnId); + + var token = await GenerateTokenAsync(user); + token.ShouldNotBeNullOrEmpty(); + + user = await UserRepository.GetAsync(TestData.UserJohnId); + (await VerifyTokenAsync(user, token)).ShouldBeTrue(); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task Invalid_Token_Should_Fail_Verification() + { + using (var uow = UnitOfWorkManager.Begin()) + { + var user = await UserRepository.GetAsync(TestData.UserJohnId); + await GenerateTokenAsync(user); + + user = await UserRepository.GetAsync(TestData.UserJohnId); + (await VerifyTokenAsync(user, "invalid-token-value")).ShouldBeFalse(); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task Second_Token_Should_Invalidate_First_Token() + { + using (var uow = UnitOfWorkManager.Begin()) + { + var user = await UserRepository.GetAsync(TestData.UserJohnId); + var firstToken = await GenerateTokenAsync(user); + + user = await UserRepository.GetAsync(TestData.UserJohnId); + var secondToken = await GenerateTokenAsync(user); + + user = await UserRepository.GetAsync(TestData.UserJohnId); + + (await VerifyTokenAsync(user, firstToken)).ShouldBeFalse(); + (await VerifyTokenAsync(user, secondToken)).ShouldBeTrue(); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task Corrupted_Hash_Should_Return_False_Instead_Of_Throwing() + { + using (var uow = UnitOfWorkManager.Begin()) + { + var user = await UserRepository.GetAsync(TestData.UserJohnId); + var token = await GenerateTokenAsync(user); + + // Overwrite with a non-hex string to simulate data corruption. + user = await UserRepository.GetAsync(TestData.UserJohnId); + await UserManager.SetAuthenticationTokenAsync(user, AbpSingleActiveTokenProvider.InternalLoginProvider, GetTokenHashName(), "not-valid-hex!!!"); + + user = await UserRepository.GetAsync(TestData.UserJohnId); + + // ValidateAsync must catch FormatException internally and return false. + (await VerifyTokenAsync(user, token)).ShouldBeFalse(); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task Token_Hash_Should_Persist_Across_UnitOfWork_Boundaries() + { + string token; + + // UoW 1: generate; UpdateAsync inside GenerateAsync must write the hash to the DB. + using (var uow = UnitOfWorkManager.Begin(requiresNew: true)) + { + var user = await UserRepository.GetAsync(TestData.UserJohnId); + token = await GenerateTokenAsync(user); + await uow.CompleteAsync(); + } + + // UoW 2: validate with a fresh DbContext to confirm the hash was persisted. + using (var uow = UnitOfWorkManager.Begin(requiresNew: true)) + { + var user = await UserRepository.GetAsync(TestData.UserJohnId); + (await VerifyTokenAsync(user, token)).ShouldBeTrue(); + await uow.CompleteAsync(); + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/IdentityUserManagerSingleActiveTokenExtensions_Tests.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/IdentityUserManagerSingleActiveTokenExtensions_Tests.cs new file mode 100644 index 0000000000..10beee48dd --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/IdentityUserManagerSingleActiveTokenExtensions_Tests.cs @@ -0,0 +1,89 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Shouldly; +using Volo.Abp.Identity; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Identity.AspNetCore; + +public class IdentityUserManagerSingleActiveTokenExtensions_Tests : AbpIdentityAspNetCoreTestBase +{ + private const string NewEmail = "newemail@example.com"; + + protected IIdentityUserRepository UserRepository { get; } + protected IdentityUserManager UserManager { get; } + protected IdentityTestData TestData { get; } + protected IUnitOfWorkManager UnitOfWorkManager { get; } + + public IdentityUserManagerSingleActiveTokenExtensions_Tests() + { + UserRepository = GetRequiredService(); + UserManager = GetRequiredService(); + TestData = GetRequiredService(); + UnitOfWorkManager = GetRequiredService(); + } + + [Fact] + public async Task Should_Remove_PasswordReset_TokenHash() + { + using (var uow = UnitOfWorkManager.Begin()) + { + var user = await UserRepository.GetAsync(TestData.UserJohnId); + var providerName = AbpSingleActiveTokenProvider.InternalLoginProvider; + var tokenKey = UserManager.Options.Tokens.PasswordResetTokenProvider + ":" + UserManager.ResetPasswordTokenPurpose; + + await UserManager.SetAuthenticationTokenAsync(user, providerName, tokenKey, "hash-value"); + (await UserManager.GetAuthenticationTokenAsync(user, providerName, tokenKey)).ShouldNotBeNull(); + + var result = await UserManager.RemovePasswordResetTokenAsync(user); + result.Succeeded.ShouldBeTrue(); + + (await UserManager.GetAuthenticationTokenAsync(user, providerName, tokenKey)).ShouldBeNull(); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task Should_Remove_EmailConfirmation_TokenHash() + { + using (var uow = UnitOfWorkManager.Begin()) + { + var user = await UserRepository.GetAsync(TestData.UserJohnId); + var providerName = AbpSingleActiveTokenProvider.InternalLoginProvider; + var tokenKey = UserManager.Options.Tokens.EmailConfirmationTokenProvider + ":" + UserManager.ConfirmEmailTokenPurpose; + + await UserManager.SetAuthenticationTokenAsync(user, providerName, tokenKey, "hash-value"); + (await UserManager.GetAuthenticationTokenAsync(user, providerName, tokenKey)).ShouldNotBeNull(); + + var result = await UserManager.RemoveEmailConfirmationTokenAsync(user); + result.Succeeded.ShouldBeTrue(); + + (await UserManager.GetAuthenticationTokenAsync(user, providerName, tokenKey)).ShouldBeNull(); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task Should_Remove_ChangeEmail_TokenHash() + { + using (var uow = UnitOfWorkManager.Begin()) + { + var user = await UserRepository.GetAsync(TestData.UserJohnId); + var providerName = AbpSingleActiveTokenProvider.InternalLoginProvider; + var tokenKey = UserManager.Options.Tokens.ChangeEmailTokenProvider + ":" + UserManager.GetChangeEmailTokenPurpose(NewEmail); + + await UserManager.SetAuthenticationTokenAsync(user, providerName, tokenKey, "hash-value"); + (await UserManager.GetAuthenticationTokenAsync(user, providerName, tokenKey)).ShouldNotBeNull(); + + var result = await UserManager.RemoveChangeEmailTokenAsync(user, NewEmail); + result.Succeeded.ShouldBeTrue(); + + (await UserManager.GetAuthenticationTokenAsync(user, providerName, tokenKey)).ShouldBeNull(); + + await uow.CompleteAsync(); + } + } +} 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/openiddict/app/OpenIddict.Demo.Server/package.json b/modules/openiddict/app/OpenIddict.Demo.Server/package.json index 52a1fc6c21..ca7faa8c46 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.2.0-rc.1" } } diff --git a/modules/openiddict/app/angular/package.json b/modules/openiddict/app/angular/package.json index 0eccde558f..6d5bb9d8e9 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.2.0-rc.1", + "@abp/ng.components": "~10.2.0-rc.1", + "@abp/ng.core": "~10.2.0-rc.1", + "@abp/ng.oauth": "~10.2.0-rc.1", + "@abp/ng.identity": "~10.2.0-rc.1", + "@abp/ng.setting-management": "~10.2.0-rc.1", + "@abp/ng.tenant-management": "~10.2.0-rc.1", + "@abp/ng.theme.shared": "~10.2.0-rc.1", + "@abp/ng.theme.lepton-x": "~5.2.0-rc.1", "@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.2.0-rc.1", "@angular-devkit/build-angular": "^15.0.1", "@angular-eslint/builder": "~15.1.0", "@angular-eslint/eslint-plugin": "~15.1.0", 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 b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor index afbfe52c65..2f81832aa4 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor @@ -1,6 +1,6 @@ @inherits Volo.Abp.AspNetCore.Components.AbpComponentBase - - + + @L["Permissions"] - @_entityDisplayName @@ -17,14 +17,14 @@ - + - + @L["SelectAllInAllTabs"] @@ -68,9 +68,9 @@ @L["SelectAllInThisTab"] @@ -84,8 +84,8 @@ @GetShownName(permission) 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.Blazor/Components/ResourcePermissionManagementModal.razor b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/ResourcePermissionManagementModal.razor index bd12891063..ffc33dbfaf 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/ResourcePermissionManagementModal.razor +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/ResourcePermissionManagementModal.razor @@ -4,8 +4,8 @@ @inherits Volo.Abp.AspNetCore.Components.AbpComponentBase @inject AbpBlazorMessageLocalizerHelper LH - - + + @L["ResourcePermissions"] - @ResourceDisplayName @@ -23,7 +23,7 @@ PageSize="PageSize"> - + @L["Edit"] - + @L["Delete"] @@ -47,17 +47,17 @@ @{ - - @context.ProviderName + + @context.Item.ProviderName - @context.ProviderDisplayName + @context.Item.ProviderDisplayName } @{ - foreach (var permission in context.Permissions) + foreach (var permission in context.Item.Permissions) { @permission.DisplayName } @@ -90,8 +90,8 @@ - - + +
@L["AddResourcePermission"] @@ -101,8 +101,8 @@
+ Value="@CurrentLookupService" + ValueChanged="@OnLookupServiceCheckedValueChanged"> @foreach(var keyLookupService in ResourceProviderKeyLookupServices) { @keyLookupService.DisplayName @@ -122,20 +122,20 @@ class="mt-1"> - + - +

@L["ResourcePermissionPermissions"]

- @L["GrantAllResourcePermissions"] + @L["GrantAllResourcePermissions"]
@foreach (var permission in CreateEntity.Permissions) { - @permission.DisplayName + @permission.DisplayName }
@@ -149,8 +149,8 @@ - - + + @L["UpdateResourcePermission"] @@ -160,11 +160,11 @@

@L["ResourcePermissionPermissions"]

- @L["GrantAllResourcePermissions"] + @L["GrantAllResourcePermissions"]
@foreach (var permission in EditEntity.Permissions) { - @permission.DisplayName + @permission.DisplayName }
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.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..346415f205 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.2.0-rc.1" } } 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..f07a6a1e46 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,177 @@ # 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.2.0-rc.1.tgz#6427f22e77c0d5bcd072babf0bc93ec736b9b8f9" + integrity sha512-XJOKZNguxdT+MqmlPyCezZDiAmsvLqDwUOPilxvaDHPEQkgL28jRV1Jo6YfiOV178eljTukMPKXBR9IXTEAiww== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~10.1.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.2.0-rc.1.tgz#9c54d78dd6d96eb6611b427ef27a159e62f1c835" + integrity sha512-5XcRHqLRsWIMDtyx8LN7M9sLPaIznZwCgtQqk2cC5l0RsT9HLZmjU5QBTxnhenvuDGZ4gqNfkWyuUhtga4jgAg== 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.2.0-rc.1" + "@abp/bootstrap" "~10.2.0-rc.1" + "@abp/bootstrap-datepicker" "~10.2.0-rc.1" + "@abp/bootstrap-daterangepicker" "~10.2.0-rc.1" + "@abp/datatables.net-bs5" "~10.2.0-rc.1" + "@abp/font-awesome" "~10.2.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~10.2.0-rc.1" + "@abp/lodash" "~10.2.0-rc.1" + "@abp/luxon" "~10.2.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~10.2.0-rc.1" + "@abp/moment" "~10.2.0-rc.1" + "@abp/select2" "~10.2.0-rc.1" + "@abp/sweetalert2" "~10.2.0-rc.1" + "@abp/timeago" "~10.2.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.2.0-rc.1.tgz#850043c1442d6f21e9d2908b9f52848e51656bd8" + integrity sha512-C0roQpNBZMjRcPHYodP2yrvGmc4SOw3RnSjReC3p4GVd6qyirBXwAU2mKMDEwvA8jcBMRNcMSD2heY4uNDGUZA== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.2.0-rc.1.tgz#dc38443f1b25ba8a31179b5afa8e2106ddaffdf3" + integrity sha512-o96qRDYhGSU9am8dhcilxZ+gO2BiRuofWyUQEnrxPoRnjZJ301eSQvf55sFeYHxTp9h6Q7FEveOM3BtFW/F57Q== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.2.0-rc.1.tgz#6a3ffe6375c408d376f7e71de03fe9dbafc38151" + integrity sha512-dwnmwXRmixQSBZPNhTzpwtmDj3NfnhsA8q5ZotjaKcR7F0V+jsGp6sbTKKeGHaYfVDcXw2Kg3P3a4zxA1pyCcQ== dependencies: + "@abp/moment" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.2.0-rc.1.tgz#bb990c0d270ddee566c15e80df70e17a5c2a4688" + integrity sha512-Htzhib/Bmf1RBuhxJaSnBehEfkEjO6H6t91QXGT30+dO+12R1paN5Ddsg7/DpC0k9Eq+xabcUIKKMKmjbhFScg== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.2.0-rc.1.tgz#aa52ef3cea768a0fbb5854d471d7d788575fd60d" + integrity sha512-2z46ob+MorakWb0xBb08Dv/EtzMgNllbYlxn28igcslsasZzKzMQ4QOvPI/6iDPgazgsoxW073AlaD2JW9e45A== dependencies: - "@abp/utils" "~10.1.0-rc.2" + "@abp/utils" "~10.2.0-rc.1" -"@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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.2.0-rc.1.tgz#6a9564bb9ef20e2549b1367f8df860a3176d169f" + integrity sha512-jtRVPPa8+XSJTFT+9N8bG9TeBNt7PcHjVExglg2DFx18+TCR91Sew/H7BRaDB8+wbablEJNRacP5TIF+vIFxjQ== dependencies: - "@abp/datatables.net" "~10.1.0-rc.2" + "@abp/datatables.net" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.2.0-rc.1.tgz#f15671cf5ef579af8842e80b51bfb365985afe27" + integrity sha512-eA8GyXXcCtLt7IFp9HksL6aDYliA4s3b/6Mv89RUlSg2UJiTwN1fOWxcQucHXqL/UaWRTW0mtoeXx0H/AIUyJA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.2.0-rc.1.tgz#3346ca6d7b18ce3b973a74fdfbda42cd72240409" + integrity sha512-yvqaih+ZSUtYlEBd7XRK1ZUNILnFGi36xZAiTP0z9E6yxrXmAG2HB3K3VLy33iyr4SstPgUeRHwktKAGaXjorQ== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" "@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-validation-unobtrusive@~10.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.2.0-rc.1.tgz#2f91a9edf740e417f278dc88c0e5de8a01e18c8e" + integrity sha512-m9LLaFppg2rNAAKykxFMSeu0+kg8GUVEbtyYRrRWa12ezmbvm1hcMV6zzYlwSt+NOeuGJ2X/7ST5BCAgSS9llw== dependencies: - "@abp/jquery" "~10.1.0-rc.2" - 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== - dependencies: - "@abp/jquery-validation" "~10.1.0-rc.2" + "@abp/jquery-validation" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.2.0-rc.1.tgz#e993ced0cbe2501cce50af9feb5bf7256f1e5d8e" + integrity sha512-w8abcFGyUeY8d09AkSceW4DEO/Y5xkqIA0lZ8qxLy+dS3Di3FhPQ6w6nS2N3Nwt/OZs7p8xW4HZlyEmN1D+rGA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.2.0-rc.1.tgz#04c36aa404b71fff27933b98efa266d83ce941ee" + integrity sha512-mZcHCJU8rjXx59zRf9N/uLP48DEkJOusqfnG1ZHAz36eHrQIoA2SZnsU8DwW/yHQudWno1A8g/w8scxHlYzq+Q== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.2.0-rc.1.tgz#d21b2b60403430a11d4b4f03eace0362bc7d762d" + integrity sha512-6+YMGXvZAu1YK85jnNIxzLlcMqWFDcBHKS/4f37hQr/Vum7cz2iw2orOmY0sDnZp2jY3vBdMtWYKM1H03+lhDA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.2.0-rc.1.tgz#7b0c9669822b223d45a1f11f0414a5a51cc60af9" + integrity sha512-1cRY7kQ/rxNq0JBBBRhVQUExGvU9S9rUC8wmLdPs2lxgg7GRnNPjzIDxFXYYajKXenTBabV8MLWa6QfhgrIeUA== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.2.0-rc.1.tgz#410f409c7734d017f0ee42e146bfd3508c693341" + integrity sha512-veQyOqyj/EX5mESj2AZz5HThWde00aBsC9mJ7EfTD+TZy+kyuHOqW9Z/h94hFwgkHLPozrtD5q9UngPS7T4mgw== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.2.0-rc.1.tgz#99604ac5f5bdcfe40f93e74e0475a3153502313e" + integrity sha512-pRcujgAJ9zVXoNva1b4dLf5hFwcYPSf2od4Ef3Qpt0S/Q2By9XA8Kp0UqhP1R4e8zYDIGg2LWMQZE+NE2W7B0A== 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.2.0-rc.1.tgz#ee9876661b92646252ee4f368422c199e60e7b61" + integrity sha512-mk7UFL1yhCh8OEdyKn6sDCaSR5iBmlWd63qv5paXc7WuugEW5pLGbYEorhYBnljRw7Gcavslb2YPduWvwcdE6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.2.0-rc.1.tgz#9b97de09f27370a3795413ccd7b238ccea9d2483" + integrity sha512-98GSYHvRMnS565sg+mxTeIALVDZwAIzssDFrdWsHhF3g+oMo7+dpbhw3CQ0PdBuEF15vUCU1fzmEi0lXzk4+6w== dependencies: - "@abp/core" "~10.1.0-rc.2" + "@abp/core" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.2.0-rc.1.tgz#6254e2c43536dd952bec32107748f5896f84891f" + integrity sha512-tw0uDtlmOVIW2CRiys/me//ratM9JeAjmzPT/gtyCfcrqmNTlbkbYu4UmGDnwGgo9XeL1LbWGbDc22s868UVYA== dependencies: - "@abp/jquery" "~10.1.0-rc.2" + "@abp/jquery" "~10.2.0-rc.1" 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.2.0-rc.1": + version "10.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.2.0-rc.1.tgz#9c23c7c78720077df60f1a3809d9b688016478b5" + integrity sha512-l7spGr0LUYJXGsYYNCYOYCiv7YKyFeBzNcpYqIv+wV6glqpTvF5qa1+NU/T/cbfGCrqch3P/wr+//oqwWEcNIg== dependencies: just-compare "^2.3.0" @@ -229,13 +221,6 @@ datatables.net@2.3.4, datatables.net@^2.3.4: dependencies: jquery ">=1.7" -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - jquery-mousewheel@>=3.0.6: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -254,7 +239,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0: resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== -jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2: +jquery@>=1.10, "jquery@>=1.5.0 <4.0", jquery@>=1.7: version "3.6.4" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== 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..e3b5f4b69b 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 @@ -11,79 +11,79 @@ @L["DefaultFromDisplayName"] * - + - + @L["DefaultFromAddress"] * - + - + @L["SmtpHost"] - + - + @L["SmtpPort"] - + - + - @L["SmtpEnableSsl"] + @L["SmtpEnableSsl"] - @L["SmtpUseDefaultCredentials"] + @L["SmtpUseDefaultCredentials"] @if (!EmailSettings.SmtpUseDefaultCredentials) { @L["SmtpDomain"] - + - + @L["SmtpUserName"] - + - + @L["SmtpPassword"] - + - + } @@ -105,9 +105,9 @@ @if (HasSendTestEmailPermission) { - - - + + + @L["SendTestEmail"] @@ -117,48 +117,48 @@ @L["SenderEmailAddress"] - + - + @L["TargetEmailAddress"] - + - + @L["Subject"] - + - + @L["Body"] - + - +
- + @L["Send"]
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/TimeZoneSettingGroup/TimeZoneSettingGroupViewComponent.razor b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/TimeZoneSettingGroup/TimeZoneSettingGroupViewComponent.razor index 36e902c7c3..a614328a16 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/TimeZoneSettingGroup/TimeZoneSettingGroupViewComponent.razor +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/TimeZoneSettingGroup/TimeZoneSettingGroupViewComponent.razor @@ -9,7 +9,7 @@ @L["DisplayName:Timezone"] * - @foreach (var item in TimezoneSettings.TimeZoneItems) { @item.Name diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.analyze.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.analyze.json index 3fffa604d6..bc1f059099 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.analyze.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.analyze.json @@ -83,7 +83,7 @@ { "valueType": "ToggleStringValueType", "defaultValue": "false", - "displayName": "Allow changing email settings.", + "displayName": "Allow changing email settings", "description": "", "isAvailableToHost": false, "isVisibleToClients": true, 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 0ebfa9808f..c1bf81cc39 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 @@ -37,9 +37,9 @@ @* ************************* CREATE MODAL ************************* *@ @if ( HasCreatePermission ) { - - -
+ + + @L["NewTenant"] @@ -49,21 +49,21 @@ @L["TenantName"] * - + - + @L["DisplayName:AdminEmailAddress"] * - + - + @@ -71,8 +71,8 @@ @L["DisplayName:AdminPassword"] * - - + + - + @@ -98,9 +98,9 @@ @* ************************* EDIT MODAL ************************* *@ @if ( HasUpdatePermission ) { - - -
+ + + @L["Edit"] @@ -110,11 +110,11 @@ @L["TenantName"] * - + - + @@ -122,7 +122,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..91b530a41f 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.2.0-rc.1", + "@abp/virtual-file-explorer": "~10.2.0-rc.1" } } diff --git a/npm/lerna.json b/npm/lerna.json index ee02c6794e..a398cd30cb 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "packages": [ "packs/*" ], 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/guides/CMS_KIT_ANGULAR_STRUCTURE.md b/npm/ng-packs/guides/CMS_KIT_ANGULAR_STRUCTURE.md new file mode 100644 index 0000000000..bb29a43622 --- /dev/null +++ b/npm/ng-packs/guides/CMS_KIT_ANGULAR_STRUCTURE.md @@ -0,0 +1,1313 @@ +# CMS Kit - Angular Package Structure Guide + +## Overview + +This guide provides a comprehensive structure for the Angular package (`@abp/ng.cms-kit`) that mirrors the backend MVC architecture. The structure is organized into two main parts: **Admin** and **Public**, matching the backend `Volo.CmsKit.Admin.Web` and `Volo.CmsKit.Public.Web` modules. + +## Backend Structure Reference + +Based on the backend MVC structure, CMS Kit has the following features: + +### Admin Features (Volo.CmsKit.Admin.Web) + +1. **Comments** - Comment approval and management +2. **Tags** - Tag creation and management +3. **Pages** - Page creation and management +4. **Blogs** - Blog management +5. **Blog Posts** - Blog post creation and management +6. **Menus** - Menu item management +7. **Global Resources** - Global script and style resources + +### Public Features (Volo.CmsKit.Public.Web) + +1. **Pages** - Public page viewing +2. **Blogs** - Public blog and blog post viewing +3. **Comments** - Public commenting functionality +4. **Shared Components** - Reusable public components (Commenting, MarkedItemToggle, PopularTags, Rating, ReactionSelection, Tags, GlobalResources) +5. **Menus** - Public menu items + +## Package Structure + +``` +cms-kit/ +├── package.json # Main package metadata +├── ng-package.json # ng-packagr configuration +├── project.json # Nx workspace configuration +├── tsconfig.json # TypeScript root config +├── tsconfig.lib.json # Library-specific TS config +├── tsconfig.lib.prod.json # Production build config +├── tsconfig.spec.json # Test configuration +├── jest.config.ts # Jest test configuration +├── README.md # Package documentation +│ +├── admin/ # Admin sub-package (Admin pages) +│ │── src/ +│ │ ├── components/ # Admin-specific components +│ │ │ ├── comments/ +│ │ │ │ ├── comment-list/ +│ │ │ │ │ ├── comment-list.component.ts +│ │ │ │ │ ├── comment-list.component.html +│ │ │ │ │ └── comment-list.component.spec.ts +│ │ │ │ ├── comment-approve/ +│ │ │ │ │ ├── comment-approve.component.ts +│ │ │ │ │ ├── comment-approve.component.html +│ │ │ │ │ └── comment-approve.component.spec.ts +│ │ │ │ ├── comment-details/ +│ │ │ │ │ ├── comment-details.component.ts +│ │ │ │ │ ├── comment-details.component.html +│ │ │ │ │ └── comment-details.component.spec.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── tags/ +│ │ │ │ ├── tag-list/ +│ │ │ │ │ ├── tag-list.component.ts +│ │ │ │ │ ├── tag-list.component.html +│ │ │ │ │ └── tag-list.component.spec.ts +│ │ │ │ ├── tag-modal/ # manages the create/edit +│ │ │ │ │ ├── tag-modal.component.ts +│ │ │ │ │ ├── tag-modal.component.html +│ │ │ │ │ └── tag-modal.component.spec.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── pages/ +│ │ │ │ ├── page-list/ +│ │ │ │ │ ├── page-list.component.ts +│ │ │ │ │ ├── page-list.component.html +│ │ │ │ │ └── page-list.component.spec.ts +│ │ │ │ ├── page-modal/ # manages the create/edit +│ │ │ │ │ ├── page-modal.component.ts +│ │ │ │ │ ├── page-modal.component.html +│ │ │ │ │ └── page-modal.component.spec.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── blogs/ +│ │ │ │ ├── blog-list/ +│ │ │ │ │ ├── blog-list.component.ts +│ │ │ │ │ ├── blog-list.component.html +│ │ │ │ │ └── blog-list.component.spec.ts +│ │ │ │ ├── blog-create/ +│ │ │ │ │ ├── blog-create.component.ts +│ │ │ │ │ ├── blog-create.component.html +│ │ │ │ │ └── blog-create.component.spec.ts +│ │ │ │ ├── blog-edit/ +│ │ │ │ │ ├── blog-edit.component.ts +│ │ │ │ │ ├── blog-edit.component.html +│ │ │ │ │ └── blog-edit.component.spec.ts +│ │ │ │ ├── blog-features/ +│ │ │ │ │ ├── blog-features.component.ts +│ │ │ │ │ ├── blog-features.component.html +│ │ │ │ │ └── blog-features.component.spec.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── blog-posts/ +│ │ │ │ ├── blog-post-list/ +│ │ │ │ │ ├── blog-post-list.component.ts +│ │ │ │ │ ├── blog-post-list.component.html +│ │ │ │ │ └── blog-post-list.component.spec.ts +│ │ │ │ ├── blog-post-create/ +│ │ │ │ │ ├── blog-post-create.component.ts +│ │ │ │ │ ├── blog-post-create.component.html +│ │ │ │ │ └── blog-post-create.component.spec.ts +│ │ │ │ ├── blog-post-edit/ +│ │ │ │ │ ├── blog-post-edit.component.ts +│ │ │ │ │ ├── blog-post-edit.component.html +│ │ │ │ │ └── blog-post-edit.component.spec.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── menus/ +│ │ │ │ ├── menu-item-list/ +│ │ │ │ │ ├── menu-item-list.component.ts +│ │ │ │ │ ├── menu-item-list.component.html +│ │ │ │ │ └── menu-item-list.component.spec.ts +│ │ │ │ ├── menu-item-modal/ # manages the create/edit +│ │ │ │ │ ├── menu-item-modal.component.ts +│ │ │ │ │ ├── menu-item-modal.component.html +│ │ │ │ │ └── menu-item-modal.component.spec.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── global-resources/ +│ │ │ │ ├── global-resource-list/ +│ │ │ │ │ ├── global-resource-list.component.ts +│ │ │ │ │ ├── global-resource-list.component.html +│ │ │ │ │ └── global-resource-list.component.spec.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ └── index.ts +│ │ │ +│ │ ├── services/ # Admin-specific services +│ │ │ ├── comments/ +│ │ │ │ ├── comment-admin.service.ts +│ │ │ │ └── index.ts +│ │ │ ├── tags/ +│ │ │ │ ├── tag-admin.service.ts +│ │ │ │ └── index.ts +│ │ │ ├── pages/ +│ │ │ │ ├── page-admin.service.ts +│ │ │ │ └── index.ts +│ │ │ ├── blogs/ +│ │ │ │ ├── blog-admin.service.ts +│ │ │ │ └── index.ts +│ │ │ ├── blog-posts/ +│ │ │ │ ├── blog-post-admin.service.ts +│ │ │ │ └── index.ts +│ │ │ ├── menus/ +│ │ │ │ ├── menu-item-admin.service.ts +│ │ │ │ └── index.ts +│ │ │ ├── global-resources/ +│ │ │ │ ├── global-resource-admin.service.ts +│ │ │ │ └── index.ts +│ │ │ └── index.ts +│ │ │ +│ │ ├── models/ # Admin-specific models +│ │ │ ├── config-options.ts +│ │ │ └── index.ts +│ │ │ +│ │ ├── tokens/ # Admin-specific DI tokens +│ │ │ ├── extensions.token.ts +│ │ │ └── index.ts +│ │ │ +│ │ ├── enums/ # Admin-specific enums +│ │ │ ├── components.ts +│ │ │ └── index.ts +│ │ │ +│ │ ├── resolvers/ # Admin-specific resolvers +│ │ │ ├── extensions.resolver.ts +│ │ │ └── index.ts +│ │ │ +│ │ ├── cms-kit-admin.routes.ts +│ │ │ +│ │ └── public-api.ts # Admin public exports +│ └── config/ +│ ├── src/ +│ │ ├── enums/ # Admin-specific enums +│ │ │ ├── policy-names.ts +│ │ │ ├── route-names.ts +│ │ │ └── index.ts +│ │ │ +│ │ ├── providers/ # Admin-specific resolvers +│ │ │ ├── cms-kit-admin-config.provider.ts +│ │ │ ├── route.provider.ts +│ │ │ └── index.ts +│ │ │ +│ │ └── public-api.ts # Admin public config exports +│ │ +│ └── ng-package.json +│ +├── public/ # Public sub-package (Public pages) +│ └── src/ +│ │ ├── lib/ +│ │ │ ├── components/ # Public-specific components +│ │ │ │ ├── pages/ +│ │ │ │ │ ├── page-view/ +│ │ │ │ │ │ ├── page-view.component.ts +│ │ │ │ │ │ ├── page-view.component.html +│ │ │ │ │ │ └── page-view.component.spec.ts +│ │ │ │ │ └── index.ts +│ │ │ │ │ +│ │ │ │ ├── blogs/ +│ │ │ │ │ ├── blog-list/ +│ │ │ │ │ │ ├── blog-list.component.ts +│ │ │ │ │ │ ├── blog-list.component.html +│ │ │ │ │ │ └── blog-list.component.spec.ts +│ │ │ │ │ ├── blog-post-view/ +│ │ │ │ │ │ ├── blog-post-view.component.ts +│ │ │ │ │ │ ├── blog-post-view.component.html +│ │ │ │ │ │ └── blog-post-view.component.spec.ts +│ │ │ │ │ └── index.ts +│ │ │ │ │ +│ │ │ │ ├── comments/ +│ │ │ │ │ ├── commenting/ +│ │ │ │ │ │ ├── commenting.component.ts +│ │ │ │ │ │ ├── commenting.component.html +│ │ │ │ │ │ ├── commenting.component.scss +│ │ │ │ │ │ └── commenting.component.spec.ts +│ │ │ │ │ └── index.ts +│ │ │ │ │ +│ │ │ │ ├── shared/ # Shared public components +│ │ │ │ │ ├── marked-item-toggle/ +│ │ │ │ │ │ ├── marked-item-toggle.component.ts +│ │ │ │ │ │ ├── marked-item-toggle.component.html +│ │ │ │ │ │ ├── marked-item-toggle.component.scss +│ │ │ │ │ │ └── marked-item-toggle.component.spec.ts +│ │ │ │ │ ├── popular-tags/ +│ │ │ │ │ │ ├── popular-tags.component.ts +│ │ │ │ │ │ ├── popular-tags.component.html +│ │ │ │ │ │ ├── popular-tags.component.scss +│ │ │ │ │ │ └── popular-tags.component.spec.ts +│ │ │ │ │ ├── rating/ +│ │ │ │ │ │ ├── rating.component.ts +│ │ │ │ │ │ ├── rating.component.html +│ │ │ │ │ │ ├── rating.component.scss +│ │ │ │ │ │ └── rating.component.spec.ts +│ │ │ │ │ ├── reaction-selection/ +│ │ │ │ │ │ ├── reaction-selection.component.ts +│ │ │ │ │ │ ├── reaction-selection.component.html +│ │ │ │ │ │ ├── reaction-selection.component.scss +│ │ │ │ │ │ └── reaction-selection.component.spec.ts +│ │ │ │ │ ├── tags/ +│ │ │ │ │ │ ├── tags.component.ts +│ │ │ │ │ │ ├── tags.component.html +│ │ │ │ │ │ ├── tags.component.scss +│ │ │ │ │ │ └── tags.component.spec.ts +│ │ │ │ │ └── index.ts +│ │ │ │ │ +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── services/ # Public-specific services +│ │ │ │ ├── pages/ +│ │ │ │ │ ├── page-public.service.ts +│ │ │ │ │ └── index.ts +│ │ │ │ ├── blogs/ +│ │ │ │ │ ├── blog-post-public.service.ts +│ │ │ │ │ └── index.ts +│ │ │ │ ├── comments/ +│ │ │ │ │ ├── comment-public.service.ts +│ │ │ │ │ └── index.ts +│ │ │ │ ├── menus/ +│ │ │ │ │ ├── menu-item-public.service.ts +│ │ │ │ │ └── index.ts +│ │ │ │ ├── global-resources/ +│ │ │ │ │ ├── global-resource-public.service.ts +│ │ │ │ │ └── index.ts +│ │ │ │ ├── marked-items/ +│ │ │ │ │ ├── marked-item-public.service.ts +│ │ │ │ │ └── index.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── models/ # Public-specific models +│ │ │ │ ├── config-options.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── tokens/ # Public-specific DI tokens +│ │ │ │ ├── extensions.token.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── enums/ # Public-specific enums +│ │ │ │ ├── components.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ ├── resolvers/ # Public-specific resolvers +│ │ │ │ ├── extensions.resolver.ts +│ │ │ │ └── index.ts +│ │ │ │ +│ │ │ └── public-api.ts # Public public exports +│ │ │ +│ │ └── public-api.ts # Public root exports +│ └── config/ +│ ├── src/ +│ │ ├── enums/ # Public-specific enums +│ │ │ ├── policy-names.ts +│ │ │ ├── route-names.ts +│ │ │ └── index.ts +│ │ │ +│ │ ├── providers/ # Public-specific resolvers +│ │ │ ├── cms-kit-public-config.provider.ts +│ │ │ ├── route.provider.ts +│ │ │ └── index.ts +│ │ │ +│ │ └── public-api.ts # Public public config exports +│ │ +│ └── public-api.ts # Public root exports +└── proxy/ # API proxy sub-package (Auto-generated - DO NOT TOUCH) + └── src/ + ├── lib/ + │ └── proxy/ + │ ├── admin/ + │ │ ├── comments/ + │ │ │ └── comment-admin.service.ts + │ │ ├── tags/ + │ │ │ └── tag-admin.service.ts + │ │ ├── pages/ + │ │ │ └── page-admin.service.ts + │ │ ├── blogs/ + │ │ │ └── blog-admin.service.ts + │ │ ├── blog-posts/ + │ │ │ └── blog-post-admin.service.ts + │ │ ├── menus/ + │ │ │ └── menu-item-admin.service.ts + │ │ ├── global-resources/ + │ │ │ └── global-resource-admin.service.ts + │ │ └── media-descriptors/ + │ │ └── media-descriptor-admin.service.ts + │ ├── public/ + │ │ ├── pages/ + │ │ │ └── page-public.service.ts + │ │ ├── blogs/ + │ │ │ └── blog-post-public.service.ts + │ │ ├── comments/ + │ │ │ └── comment-public.service.ts + │ │ ├── menus/ + │ │ │ └── menu-item-public.service.ts + │ │ ├── global-resources/ + │ │ │ └── global-resource-public.service.ts + │ │ └── marked-items/ + │ │ └── marked-item-public.service.ts + │ ├── generate-proxy.json + │ └── README.md + │ + └── public-api.ts +``` + +## Feature Breakdown + +### Admin Features + +#### 1. Comments Feature + +**Backend DTOs:** + +- `CommentDto` +- `CommentWithAuthorDto` +- `GetCommentListInput` +- `CommentApprovalDto` + +**Backend Services:** + +- `ICommentAdminAppService` + +**Angular Components:** + +- `CommentListComponent` - List view with filtering +- `CommentApproveComponent` - Comment approval interface +- `CommentDetailsComponent` - Comment details view + +**Angular Services:** + +- `CommentAdminService` - Extends RestService + +#### 2. Tags Feature + +**Backend DTOs:** + +- `TagDto` +- `CreateTagDto` +- `UpdateTagDto` +- `GetTagListInput` + +**Backend Services:** + +- `ITagAdminAppService` + +**Angular Components:** + +- `TagListComponent` - List view with search +- `TagModalComponent` - Create/Edit form + +**Angular Services:** + +- `TagAdminService` - Extends RestService + +#### 3. Pages Feature + +**Backend DTOs:** + +- `PageDto` +- `GetPagesInputDto` +- `CreatePageInputDto` +- `UpdatePageInputDto` + +**Backend Services:** + +- `IPageAdminAppService` + +**Angular Components:** + +- `PageListComponent` - List view with filtering +- `PageModalComponent` - Create/Edit form + +**Angular Services:** + +- `PageAdminService` - Extends RestService + +#### 4. Blogs Feature + +**Backend DTOs:** + +- `BlogDto` +- `CreateBlogDto` +- `UpdateBlogDto` +- `GetBlogListInput` + +**Backend Services:** + +- `IBlogAdminAppService` + +**Angular Components:** + +- `BlogListComponent` - List view +- `BlogCreateComponent` - Create form +- `BlogEditComponent` - Edit form +- `BlogFeaturesComponent` - Feature management + +**Angular Services:** + +- `BlogAdminService` - Extends RestService + +#### 5. Blog Posts Feature + +**Backend DTOs:** + +- `BlogPostDto` +- `BlogPostListDto` +- `BlogPostGetListInput` +- `CreateBlogPostDto` +- `UpdateBlogPostDto` + +**Backend Services:** + +- `IBlogPostAdminAppService` + +**Angular Components:** + +- `BlogPostListComponent` - List view with filtering +- `BlogPostCreateComponent` - Create form +- `BlogPostEditComponent` - Edit form + +**Angular Services:** + +- `BlogPostAdminService` - Extends RestService + +#### 6. Menus Feature + +**Backend DTOs:** + +- `MenuItemDto` +- `MenuItemWithDetailsDto` +- `MenuItemCreateInput` +- `MenuItemUpdateInput` +- `MenuItemMoveInput` +- `PageLookupDto` +- `PageLookupInputDto` +- `PermissionLookupDto` +- `PermissionLookupInputDto` + +**Backend Services:** + +- `IMenuItemAdminAppService` + +**Angular Components:** + +- `MenuItemListComponent` - Tree/list view +- `MenuItemModalComponent` - Create/Edit form + +**Angular Services:** + +- `MenuItemAdminService` - Extends RestService + +#### 7. Global Resources Feature + +**Backend DTOs:** + +- `GlobalResourceDto` +- `CreateGlobalResourceDto` +- `UpdateGlobalResourceDto` +- `GetGlobalResourceListInput` + +**Backend Services:** + +- `IGlobalResourceAdminAppService` + +**Angular Components:** + +- `GlobalResourceListComponent` - List view + +**Angular Services:** + +- `GlobalResourceAdminService` - Extends RestService + +### Public Features + +#### 1. Pages Feature + +**Backend DTOs:** + +- `PageDto` + +**Backend Services:** + +- `IPagePublicAppService` + +**Angular Components:** + +- `PageViewComponent` - Public page display + +**Angular Services:** + +- `PagePublicService` - Extends RestService + +#### 2. Blogs Feature + +**Backend DTOs:** + +- `BlogDto` +- `BlogPostDto` +- `BlogPostGetListInput` + +**Backend Services:** + +- `IBlogPostPublicAppService` + +**Angular Components:** + +- `BlogListComponent` - Public blog list +- `BlogPostViewComponent` - Public blog post display + +**Angular Services:** + +- `BlogPostPublicService` - Extends RestService + +#### 3. Comments Feature + +**Backend DTOs:** + +- `CommentDto` +- `CommentWithAuthorDto` +- `CreateCommentInput` +- `UpdateCommentInput` + +**Backend Services:** + +- `ICommentPublicAppService` + +**Angular Components:** + +- `CommentingComponent` - Public commenting interface + +**Angular Services:** + +- `CommentPublicService` - Extends RestService + +#### 4. Shared Public Components + +**Components:** + +- `MarkedItemToggleComponent` - Favorite/Bookmark/Star/Flag toggle +- `PopularTagsComponent` - Popular tags display +- `RatingComponent` - Rating interface +- `ReactionSelectionComponent` - Reaction selection interface +- `TagsComponent` - Tags display + +#### 5. Menus Feature + +**Backend DTOs:** + +- `MenuItemDto` + +**Backend Services:** + +- `IMenuItemPublicAppService` + +**Angular Services:** + +- `MenuItemPublicService` - Extends RestService + +## Component Structure Examples + +### Admin List Component Pattern + +```typescript +// admin/src/lib/components/pages/page-list/page-list.component.ts + +import { Component, OnInit, inject } from '@angular/core'; +import { ListService } from '@abp/ng.core'; +import { PageAdminService } from '../../services'; +import { PageDto } from '../../models'; + +@Component({ + selector: 'abp-page-list', + templateUrl: './page-list.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eCmsKitAdminComponents.PageList, + }, + ], + imports: [], +}) +export class PageListComponent implements OnInit { + data = this.list.getGrid(); + + public readonly list = inject(ListService); + private pageService = inject(PageAdminService); + + ngOnInit() { + this.hookToQuery(); + } + + private hookToQuery() { + this.list + .hookToQuery(query => this.pageService.getList({ ...query, ...this.filters })) + .subscribe(res => (this.data = res)); + } +} +``` + +### Public View Component Pattern + +```typescript +// public/src/lib/components/pages/page-view/page-view.component.ts + +import { Component, OnInit, inject } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { PagePublicService } from '../../services'; +import { PageDto } from '../../models'; + +@Component({ + selector: 'abp-page-view', + templateUrl: './page-view.component.html', + imports: [], +}) +export class PageViewComponent implements OnInit { + page: PageDto; + slug: string; + + private route = inject(ActivatedRoute); + private pageService = inject(PagePublicService); + + ngOnInit() { + this.route.params.subscribe(params => { + this.slug = params['slug']; + this.loadPage(); + }); + } + + private loadPage() { + this.pageService.findBySlug(this.slug).subscribe(page => { + this.page = page; + }); + } +} +``` + +### Service Pattern + +```typescript +// admin/src/lib/services/pages/page-admin.service.ts + +import { Injectable } from '@angular/core'; +import { RestService } from '@abp/ng.core'; +import { PageDto, GetPagesInputDto, CreatePageInputDto, UpdatePageInputDto } from '../models'; + +@Injectable({ + providedIn: 'root', +}) +export class PageAdminService extends RestService { + protected get url() { + return '/api/cms-kit-admin/pages'; + } + + getList(input?: GetPagesInputDto) { + return this.request>({ + method: 'GET', + url: this.url, + params: input, + }); + } + + getById(id: string) { + return this.request({ + method: 'GET', + url: `${this.url}/${id}`, + }); + } + + create(input: CreatePageInputDto) { + return this.request({ + method: 'POST', + url: this.url, + body: input, + }); + } + + update(id: string, input: UpdatePageInputDto) { + return this.request({ + method: 'PUT', + url: `${this.url}/${id}`, + body: input, + }); + } + + delete(id: string) { + return this.request({ + method: 'DELETE', + url: `${this.url}/${id}`, + }); + } + + setAsHomePage(id: string) { + return this.request({ + method: 'POST', + url: `${this.url}/${id}/set-as-home-page`, + }); + } +} +``` + +## Route Configuration + +### Admin Route Definition + +```typescript +// admin/src/lib/routes/cms-kit-admin.routes.ts + +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, + TagListComponent, + PageListComponent, + BlogListComponent, + BlogPostListComponent, + MenuItemListComponent, + GlobalResourceListComponent, +} from '../components'; + +export interface CmsKitAdminConfigOptions { + // Extension point contributors + commentEntityActionContributors?: any; + tagEntityActionContributors?: any; + // ... other contributors +} + +export function createRoutes(config: CmsKitAdminConfigOptions = {}): Routes { + return [ + { + path: '', + component: RouterOutletComponent, + providers: provideCmsKitAdminContributors(config), + canActivate: [authGuard, permissionGuard], + children: [ + { + path: 'comments', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'CmsKit.Comments', + replaceableComponent: { + key: eCmsKitAdminComponents.CommentList, + defaultComponent: CommentListComponent, + }, + }, + title: 'CmsKit::Comments', + }, + { + path: 'tags', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'CmsKit.Tags', + replaceableComponent: { + key: eCmsKitAdminComponents.TagList, + defaultComponent: TagListComponent, + }, + }, + title: 'CmsKit::Tags', + }, + { + path: 'pages', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'CmsKit.Pages', + replaceableComponent: { + key: eCmsKitAdminComponents.PageList, + defaultComponent: PageListComponent, + }, + }, + title: 'CmsKit::Pages', + }, + { + path: 'pages/create', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'CmsKit.Pages.Create', + replaceableComponent: { + key: eCmsKitAdminComponents.PageCreate, + defaultComponent: PageCreateComponent, + }, + }, + title: 'CmsKit::CreatePage', + }, + { + path: 'pages/:id/edit', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'CmsKit.Pages.Update', + replaceableComponent: { + key: eCmsKitAdminComponents.PageEdit, + defaultComponent: PageEditComponent, + }, + }, + title: 'CmsKit::EditPage', + }, + { + path: 'blogs', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'CmsKit.Blogs', + replaceableComponent: { + key: eCmsKitAdminComponents.BlogList, + defaultComponent: BlogListComponent, + }, + }, + title: 'CmsKit::Blogs', + }, + { + path: 'blog-posts', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'CmsKit.BlogPosts', + replaceableComponent: { + key: eCmsKitAdminComponents.BlogPostList, + defaultComponent: BlogPostListComponent, + }, + }, + title: 'CmsKit::BlogPosts', + }, + { + path: 'menus', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'CmsKit.Menus', + replaceableComponent: { + key: eCmsKitAdminComponents.MenuItemList, + defaultComponent: MenuItemListComponent, + }, + }, + title: 'CmsKit::Menus', + }, + { + path: 'global-resources', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'CmsKit.GlobalResources', + replaceableComponent: { + key: eCmsKitAdminComponents.GlobalResourceList, + defaultComponent: GlobalResourceListComponent, + }, + }, + title: 'CmsKit::GlobalResources', + }, + ], + }, + ]; +} + +function provideCmsKitAdminContributors(options: CmsKitAdminConfigOptions = {}): Provider[] { + return [ + { + provide: COMMENT_ENTITY_ACTION_CONTRIBUTORS, + useValue: options.commentEntityActionContributors, + }, + { + provide: TAG_ENTITY_ACTION_CONTRIBUTORS, + useValue: options.tagEntityActionContributors, + }, + // ... other contributors + ]; +} +``` + +### Admin Route Provider Configuration + +```typescript +// config/src/lib/providers/cms-kit-admin-route-providers.ts + +import { Provider } from '@angular/core'; +import { RoutesService, provideAppInitializer } from '@abp/ng.core'; +import { eCmsKitAdminRouteNames } from '@abp/cms-kit/admin'; + +export const CMS_KIT_ADMIN_ROUTE_PROVIDERS: Provider[] = [ + provideAppInitializer(() => { + configureRoutes(); + }), +]; + +export function configureRoutes() { + const routes = inject(RoutesService); + routes.add([ + { + path: '/cms-kit/comments', + name: eCmsKitAdminRouteNames.Comments, + parentName: eThemeSharedRouteNames.Administration, + order: 100, + layout: eLayoutType.application, + iconClass: 'fa fa-comments', + requiredPolicy: 'CmsKit.Comments', + }, + { + path: '/cms-kit/tags', + name: eCmsKitAdminRouteNames.Tags, + parentName: eThemeSharedRouteNames.Administration, + order: 101, + layout: eLayoutType.application, + iconClass: 'fa fa-tags', + requiredPolicy: 'CmsKit.Tags', + }, + { + path: '/cms-kit/pages', + name: eCmsKitAdminRouteNames.Pages, + parentName: eThemeSharedRouteNames.Administration, + order: 102, + layout: eLayoutType.application, + iconClass: 'fa fa-file', + requiredPolicy: 'CmsKit.Pages', + }, + { + path: '/cms-kit/blogs', + name: eCmsKitAdminRouteNames.Blogs, + parentName: eThemeSharedRouteNames.Administration, + order: 103, + layout: eLayoutType.application, + iconClass: 'fa fa-blog', + requiredPolicy: 'CmsKit.Blogs', + }, + { + path: '/cms-kit/blog-posts', + name: eCmsKitAdminRouteNames.BlogPosts, + parentName: eThemeSharedRouteNames.Administration, + order: 104, + layout: eLayoutType.application, + iconClass: 'fa fa-file-alt', + requiredPolicy: 'CmsKit.BlogPosts', + }, + { + path: '/cms-kit/menus', + name: eCmsKitAdminRouteNames.Menus, + parentName: eThemeSharedRouteNames.Administration, + order: 105, + layout: eLayoutType.application, + iconClass: 'fa fa-bars', + requiredPolicy: 'CmsKit.Menus', + }, + { + path: '/cms-kit/global-resources', + name: eCmsKitAdminRouteNames.GlobalResources, + parentName: eThemeSharedRouteNames.Administration, + order: 106, + layout: eLayoutType.application, + iconClass: 'fa fa-globe', + requiredPolicy: 'CmsKit.GlobalResources', + }, + ]); +} +``` + +## Default Extension Points + +### Entity Actions Example + +```typescript +// admin/src/lib/defaults/pages/default-page-entity-actions.ts + +import { EntityAction } from '@abp/ng.components/extensible'; +import { PageDto } from '../../models'; +import { eCmsKitAdminComponents } from '../../enums'; + +export const DEFAULT_PAGE_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'CmsKit::Edit', + action: data => { + const router = data.getInjected(Router); + router.navigate(['/cms-kit/pages', data.record.id, 'edit']); + }, + permission: 'CmsKit.Pages.Update', + }, + { + text: 'CmsKit::Delete', + action: data => { + const pageService = data.getInjected(PageAdminService); + const confirmation = data.getInjected(ConfirmationService); + + confirmation + .warn('CmsKit::PageDeletionConfirmationMessage', 'CmsKit::AreYouSure', { + yesText: 'AbpUi::Yes', + cancelText: 'AbpUi::Cancel', + }) + .subscribe(status => { + if (status === Confirmation.Status.confirm) { + pageService.delete(data.record.id).subscribe(() => { + data.list.get(); + }); + } + }); + }, + permission: 'CmsKit.Pages.Delete', + }, +]); +``` + +### Entity Props Example + +```typescript +// admin/src/lib/defaults/pages/default-page-entity-props.ts + +import { EntityProp } from '@abp/ng.components/extensible'; +import { ePropType } from '@abp/ng.theme.shared/extensions'; +import { PageDto } from '../../models'; + +export const DEFAULT_PAGE_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'title', + displayName: 'CmsKit::Title', + sortable: true, + columnWidth: 300, + }, + { + type: ePropType.String, + name: 'slug', + displayName: 'CmsKit::Slug', + sortable: true, + columnWidth: 200, + }, + { + type: ePropType.Date, + name: 'creationTime', + displayName: 'AbpIdentity::CreationTime', + sortable: true, + columnWidth: 200, + }, +]); +``` + +## Model Definitions + +### DTO Models + +```typescript +// admin/src/lib/models/pages/page-dto.model.ts + +export interface PageDto { + id: string; + title: string; + slug: string; + content: string; + script: string; + style: string; + layout: string; + seoTitle: string; + seoDescription: string; + seoKeywords: string; + isHomePage: boolean; + creationTime: string; + [key: string]: any; // For extensibility +} + +export interface GetPagesInputDto { + filter?: string; + status?: string; + sorting?: string; + skipCount?: number; + maxResultCount?: number; +} + +export interface CreatePageInputDto { + title: string; + slug: string; + content: string; + script?: string; + style?: string; + layout?: string; + seoTitle?: string; + seoDescription?: string; + seoKeywords?: string; +} + +export interface UpdatePageInputDto extends Partial { + id: string; +} +``` + +## Enums + +```typescript +// admin/src/lib/enums/e-cms-kit-admin-components.enum.ts + +export enum eCmsKitAdminComponents { + CommentList = 'CmsKit.Admin.CommentList', + CommentApprove = 'CmsKit.Admin.CommentApprove', + CommentDetails = 'CmsKit.Admin.CommentDetails', + + TagList = 'CmsKit.Admin.TagList', + TagCreate = 'CmsKit.Admin.TagCreate', + TagEdit = 'CmsKit.Admin.TagEdit', + + PageList = 'CmsKit.Admin.PageList', + PageCreate = 'CmsKit.Admin.PageCreate', + PageEdit = 'CmsKit.Admin.PageEdit', + + BlogList = 'CmsKit.Admin.BlogList', + BlogCreate = 'CmsKit.Admin.BlogCreate', + BlogEdit = 'CmsKit.Admin.BlogEdit', + BlogFeatures = 'CmsKit.Admin.BlogFeatures', + + BlogPostList = 'CmsKit.Admin.BlogPostList', + BlogPostCreate = 'CmsKit.Admin.BlogPostCreate', + BlogPostEdit = 'CmsKit.Admin.BlogPostEdit', + + MenuItemList = 'CmsKit.Admin.MenuItemList', + MenuItemCreate = 'CmsKit.Admin.MenuItemCreate', + MenuItemEdit = 'CmsKit.Admin.MenuItemEdit', + + GlobalResourceList = 'CmsKit.Admin.GlobalResourceList', +} + +// admin/src/lib/enums/e-cms-kit-admin-route-names.enum.ts + +export enum eCmsKitAdminRouteNames { + Comments = 'CmsKit::Menu:Comments', + Tags = 'CmsKit::Menu:Tags', + Pages = 'CmsKit::Menu:Pages', + Blogs = 'CmsKit::Menu:Blogs', + BlogPosts = 'CmsKit::Menu:BlogPosts', + Menus = 'CmsKit::Menu:Menus', + GlobalResources = 'CmsKit::Menu:GlobalResources', +} +``` + +## Implementation Checklist + +### Phase 1: Foundation + +- [x] Create package structure (admin, public, proxy) +- [x] Set up TypeScript configurations +- [x] Set up ng-package.json files +- [x] Create base models and enums +- [x] Set up service base classes + +### Phase 2: Admin - Comments Feature + +- [x] Create CommentListComponent +- [x] Create CommentApproveComponent +- [x] Create CommentDetailsComponent +- [x] Create default extension points +- [x] Add routes and providers + +### Phase 3: Admin - Tags Feature + +- [x] Create Tag components +- [x] Create default extension points +- [x] Add routes and providers + +### Phase 4: Admin - Pages Feature + +- [x] Create Page components +- [x] Create default extension points +- [x] Add routes and providers + +### Phase 5: Admin - Blogs Feature + +- [x] Create Blog components +- [x] Create default extension points +- [x] Add routes and providers + +### Phase 6: Admin - Blog Posts Feature + +- [x] Create BlogPost components +- [x] Create default extension points +- [x] Add routes and providers + +### Phase 7: Admin - Menus Feature + +- [x] Create MenuItem components +- [x] Create default extension points +- [x] Add routes and providers + +### Phase 8: Admin - Global Resources Feature + +- [x] Create GlobalResourceListComponent +- [x] Create default extension points +- [x] Add routes and providers + +### Phase 9: Public - Pages Feature + +- [ ] Create PageViewComponent +- [ ] Add routes + +### Phase 10: Public - Blogs Feature + +- [ ] Create BlogListComponent +- [ ] Create BlogPostViewComponent +- [ ] Add routes + +### Phase 11: Public - Comments Feature + +- [ ] Create CommentingComponent +- [ ] Add routes + +### Phase 12: Public - Shared Components + +- [ ] Create MarkedItemToggleComponent +- [ ] Create PopularTagsComponent +- [ ] Create RatingComponent +- [ ] Create ReactionSelectionComponent +- [ ] Create TagsComponent + +### Phase 13: Testing & Documentation + +- [ ] Write unit tests for services +- [ ] Write unit tests for components +- [ ] Write integration tests + +## Best Practices + +1. **Naming Conventions** + - Files: kebab-case (`page-list.component.ts`) + - Classes: PascalCase (`PageListComponent`) + - Variables/Methods: camelCase (`pageService`, `getList()`) + - Constants: UPPER_SNAKE_CASE (`DEFAULT_PAGE_ENTITY_ACTIONS`) + - Enums: PascalCase with 'e' prefix (`eCmsKitAdminComponents`) + +2. **Service Layer** + - Always extend `RestService` from `@abp/ng.core` + - Use TypeScript interfaces for all DTOs + - Handle errors consistently + - Use observables properly with RxJS + +3. **Component Layer** + - Use `ListService` for list components + - Implement `OnInit` and `OnDestroy` when needed + - Use reactive forms for all forms + - Implement proper validation + +4. **Extension Points** + - Provide default implementations + - Allow customization through contributors + - Use tokens for dependency injection + +5. **Routes** + - Use lazy loading + - Implement guards (auth, permission) + - Use replaceable components + - Follow ABP route naming conventions + +## Dependencies + +### Core Dependencies + +- `@abp/ng.core` - Core ABP Angular functionality +- `@abp/ng.theme.shared` - Shared theme components +- `@abp/ng.components/extensible` - Extensible components + +### Development Dependencies + +- `@angular/` - Angular framework +- `@nx/` - Nx workspace tools +- `ng-packagr` - Package building +- `jest` - Testing framework + +## Notes + +- The `proxy` sub-package is auto-generated and should NOT be manually edited +- All models should match the backend DTOs exactly +- Use the localization keys from the backend (`CmsKit::*`) +- Follow the ABP permission naming convention (`CmsKit.Feature.Action`) +- All components should be replaceable using the extension system +- Admin and Public packages are separate to maintain clear separation of concerns +- The proxy package contains both admin and public API proxies in a common location diff --git a/npm/ng-packs/guides/DEVELOPMENT_GUIDE.md b/npm/ng-packs/guides/DEVELOPMENT_GUIDE.md new file mode 100644 index 0000000000..a44fd2a49d --- /dev/null +++ b/npm/ng-packs/guides/DEVELOPMENT_GUIDE.md @@ -0,0 +1,659 @@ +# ABP Npm Package Development Guide + +## Table of Contents + +1. [Overview](#overview) +2. [Project Structure](#project-structure) +3. [Module Architecture](#module-architecture) +4. [Component Development](#component-development) +5. [Service Layer](#service-layer) +6. [Routing & Navigation](#routing--navigation) +7. [State Management](#state-management) +8. [Form Handling](#form-handling) +9. [Validation](#validation) +10. [Testing](#testing) +11. [Best Practices](#best-practices) +12. [Common Patterns](#common-patterns) +13. [Troubleshooting](#troubleshooting) + +## Overview + +This guide provides comprehensive instructions for developing ABP modules following the established patterns and conventions. The guide is based on the SaaS module structure and can be applied to any ABP module development. + +### Key Principles + +- **Modularity**: Each module should be self-contained with clear boundaries +- **Extensibility**: Modules should support customization through extension points +- **Consistency**: Follow established ABP patterns and conventions +- **Testability**: All components should be easily testable +- **Performance**: Optimize for bundle size and runtime performance + +## Project Structure + +``` +package-name/ +├── package.json # Package metadata and dependencies +├── ng-package.json # ng-packagr configuration +├── project.json # Nx workspace configuration +├── tsconfig.json # TypeScript root config +├── tsconfig.lib.json # Library-specific TS config +├── tsconfig.lib.prod.json # Production build config +├── tsconfig.spec.json # Test configuration +├── jest.config.ts # Jest test configuration +├── tslint.json # (optional) Linting rules +├── README.md # Package documentation +│ +├── src/ # Main library source code +│ ├── lib/ # Core library implementation +│ │ ├── components/ # Angular components +│ │ ├── services/ # Business logic services +│ │ ├── models/ # TypeScript interfaces/models +│ │ ├── enums/ # Enumerations +│ │ ├── guards/ # Route guards +│ │ ├── resolvers/ # Route resolvers +│ │ ├── defaults/ # Default configurations +│ │ ├── tokens/ # Dependency injection tokens +│ │ ├── utils/ # Utility functions +│ │ ├── validators/ # Form validators +│ │ ├── [feature].routes.ts +│ └── public-api.ts # Public exports barrel file +│ +├── config/ # Configuration sub-package (optional) +│ ├── ng-package.json +│ └── src/ +│ ├── components/ # Config-specific components +│ ├── providers/ # Route/setting providers +│ ├── services/ # Config services +│ ├── models/ # Config models +│ ├── enums/ # Config enums +│ └── public-api.ts +│ +├── proxy/ # API proxy sub-package (optional) +│ ├── ng-package.json +│ └── src/ +│ ├── lib/ +│ │ └── proxy/ +│ │ ├── [feature]/ # Generated proxy services +│ │ ├── generate-proxy.json +│ │ └── README.md +│ └── public-api.ts +│ +├── common/ # Common/shared sub-package (optional) +│ ├── ng-package.json +│ └── src/ +│ ├── enums/ +│ ├── tokens/ +│ └── public-api.ts +│ +└── admin/ # Admin-specific sub-package (optional) + ├── ng-package.json + └── src/ + └── ... +``` + +### File Naming Conventions + +- Use kebab-case for file names: `my-component.component.ts` +- Use PascalCase for class names: `MyComponent` +- Use camelCase for variables and methods: `myVariable`, `myMethod()` +- Use UPPER_SNAKE_CASE for constants: `MY_CONSTANT` + +## Package Architecture + +### Configuration Options Pattern + +```typescript +export interface MyConfigOptions { + entityActionContributors?: MyEntityActionContributors; + toolbarActionContributors?: MyToolbarActionContributors; + entityPropContributors?: MyEntityPropContributors; + createFormPropContributors?: MyCreateFormPropContributors; + editFormPropContributors?: MyEditFormPropContributors; +} +``` + +## Component Development + +### Component Structure + +```typescript +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { ListService } from '@abp/ng.core'; +import { MyService } from '../services'; + +@Component({ + selector: 'app-my-component', + templateUrl: './my-component.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eMyComponents.MyComponent, + }, + ], + imports: [], +}) +export class MyComponent implements OnInit, OnDestroy { + // Properties + data = this.list.getGrid(); + isModalVisible = false; + + public readonly list = inject(ListService); + private myService = inject(MyService); + + ngOnInit() { + this.hookToQuery(); + } + + ngOnDestroy() { + this.list.hookToQuery = () => {}; + } + + // Methods + onEdit(id: string) { + // Implementation + } + + onDelete(id: string) { + // Implementation + } + + private hookToQuery() { + this.list + .hookToQuery(query => this.myService.getList({ ...query, ...this.filters })) + .subscribe(res => (this.data = res)); + } +} +``` + +Example HTML template + +```html + +
+
+ + +
+ +
+
+
+
+
+ +
+
+
+ + + +

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

+
+ + + @if (form) { +
+ {{ 'AbpLocalizationKey::MyInfo' | abpLocalization }} + +
+ +
+
+
+ } +
+ + + + + {{ 'AbpUi::Save' | abpLocalization }} + + +
+``` + +### Component Best Practices + +1. **Single Responsibility**: Each component should have one clear purpose +2. **Dependency Injection**: Use constructor injection for services +3. **Lifecycle Management**: Implement `OnInit` and `OnDestroy` when needed +4. **State Management**: Use reactive forms and observables +5. **Error Handling**: Implement proper error boundaries +6. **Accessibility**: Follow ARIA guidelines +7. **Performance**: Use `OnPush` change detection when possible + +## Service Layer + +### Service Structure + +```typescript +import { Injectable } from '@angular/core'; +import { RestService } from '@abp/ng.core'; +import { MyDto } from '../models'; + +@Injectable({ + providedIn: 'root', +}) +export class MyService extends RestService { + protected get url() { + return 'api/my-endpoint'; + } + + getList(query: any) { + return this.request({ + method: 'GET', + params: query, + }); + } + + getById(id: string) { + return this.request({ + method: 'GET', + url: `${this.url}/${id}`, + }); + } + + create(input: Partial) { + return this.request({ + method: 'POST', + body: input, + }); + } + + update(id: string, input: Partial) { + return this.request({ + method: 'PUT', + url: `${this.url}/${id}`, + body: input, + }); + } + + delete(id: string) { + return this.request({ + method: 'DELETE', + url: `${this.url}/${id}`, + }); + } +} +``` + +### Service Best Practices + +1. **Extend RestService**: Use ABP's base service for HTTP operations +2. **Type Safety**: Use TypeScript interfaces for all data structures +3. **Error Handling**: Implement proper error handling and logging +4. **Caching**: Consider caching strategies for frequently accessed data +5. **Observables**: Use RxJS observables for reactive programming + +## Routing & Navigation + +### Route Configuration + +```typescript +import { Routes } from '@angular/router'; +import { Provider } from '@angular/core'; +import { + RouterOutletComponent, + authGuard, + permissionGuard, + ReplaceableRouteContainerComponent, + ReplaceableComponents, +} from '@abp/ng.core'; + +export function createRoutes(config: MyConfigOptions = {}): Routes { + return [ + { path: '', redirectTo: 'my-feature', pathMatch: 'full' }, + { + path: '', + component: RouterOutletComponent, + providers: provideMyContributors(config), + canActivate: [authGuard, permissionGuard], + children: [ + { + path: 'my-feature', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'My.Feature', + replaceableComponent: { + key: eMyComponents.MyFeature, + defaultComponent: MyFeatureComponent, + } as ReplaceableComponents.RouteData, + }, + title: 'My::Feature', + }, + ], + }, + ]; +} + +function provideMyContributors(options: MyConfigOptions = {}): Provider[] { + return [ + // ... providers + ]; +} +``` + +### Route Best Practices + +1. **Lazy Loading**: Use lazy loading for better performance +2. **Guards**: Implement authentication and authorization guards +3. **Permissions**: Use permission-based route protection +4. **Replaceable Components**: Support component replacement for extensibility +5. **SEO**: Use meaningful route titles and metadata + +## State Management + +### State Management Patterns + +```typescript +// Using ABP's ConfigStateService +import { ConfigStateService } from '@abp/ng.core'; + +export class MyComponent { + private configState = inject(ConfigStateService); + + getSettings() { + return this.configState.getSetting('My.Setting'); + } +} + +// Using reactive forms +import { FormBuilder, FormGroup } from '@angular/forms'; + +export class MyComponent { + form: FormGroup; + private fb = inject(FormBuilder); + + constructor() { + this.form = this.fb.group({ + name: ['', Validators.required], + email: ['', [Validators.required, Validators.email]], + }); + } +} +``` + +## Form Handling + +### Form Structure + +```typescript +import { Component } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { MyService } from '../services'; + +@Component({ + selector: 'app-my-form', + template: ` +
+ + + +
+ `, + imports: [], +}) +export class MyFormComponent { + form: FormGroup; + + private fb = inject(FormBuilder); + private myService = inject(MyService); + + constructor() { + this.form = this.fb.group({ + name: ['', Validators.required], + email: ['', [Validators.required, Validators.email]], + }); + } + + onSubmit() { + if (this.form.valid) { + this.myService.create(this.form.value).subscribe( + result => { + // Handle success + }, + error => { + // Handle error + }, + ); + } + } +} +``` + +## Validation + +### Custom Validators + +```typescript +import { Provider } from '@angular/core'; +import { AsyncValidatorFn, FormGroup } from '@angular/forms'; +import { of } from 'rxjs'; + +export const MY_VALIDATOR_PROVIDER: Provider = { + provide: MY_FORM_ASYNC_VALIDATORS_TOKEN, + multi: true, + useFactory: myCustomValidator, +}; + +export function myCustomValidator(): AsyncValidatorFn { + return (group: FormGroup) => { + // Validation logic + const field1 = group?.get('field1'); + const field2 = group?.get('field2'); + + if (!field1 || !field2) { + return of(null); + } + + if (field1.value && !field2.value) { + field2.setErrors({ required: true }); + } + + return of(null); + }; +} +``` + +### Validation Best Practices + +1. **Async Validators**: Use for server-side validation +2. **Cross-field Validation**: Validate relationships between fields +3. **Error Messages**: Provide clear, user-friendly error messages +4. **Performance**: Debounce async validators to avoid excessive API calls +5. **Accessibility**: Ensure validation errors are announced to screen readers + +## Testing + +### Unit Testing Structure + +```typescript +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MyComponent } from './my.component'; +import { MyService } from '../services'; + +describe('MyComponent', () => { + let component: MyComponent; + let fixture: ComponentFixture; + let myService: jasmine.SpyObj; + + beforeEach(async () => { + const spy = jasmine.createSpyObj('MyService', ['getList']); + + await TestBed.configureTestingModule({ + declarations: [MyComponent], + providers: [{ provide: MyService, useValue: spy }], + }).compileComponents(); + + fixture = TestBed.createComponent(MyComponent); + component = fixture.componentInstance; + myService = TestBed.inject(MyService) as jasmine.SpyObj; + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should load data on init', () => { + // Test implementation + }); +}); +``` + +### Testing Best Practices + +1. **Isolation**: Test components in isolation +2. **Mocking**: Mock external dependencies +3. **Coverage**: Aim for high test coverage +4. **Integration Tests**: Test component interactions +5. **E2E Tests**: Test complete user workflows + +## Best Practices + +### Code Organization + +1. **Feature-based Structure**: Organize code by features, not types +2. **Barrel Exports**: Use index files for clean imports +3. **Consistent Naming**: Follow established naming conventions +4. **Documentation**: Document complex logic and public APIs +5. **Type Safety**: Use TypeScript strictly + +### Performance + +1. **Lazy Loading**: Load modules on demand +2. **Change Detection**: Use OnPush strategy when possible +3. **Memory Management**: Unsubscribe from observables +4. **Bundle Size**: Minimize bundle size through tree shaking +5. **Caching**: Implement appropriate caching strategies + +### Security + +1. **Input Validation**: Validate all user inputs +2. **XSS Prevention**: Sanitize user-generated content +3. **CSRF Protection**: Use CSRF tokens for state-changing operations +4. **Authorization**: Check permissions at component and service levels +5. **HTTPS**: Use HTTPS in production + +## Common Patterns + +### Extension Pattern + +```typescript +// Define extension tokens +export const MY_ENTITY_ACTION_CONTRIBUTORS = new InjectionToken( + 'MY_ENTITY_ACTION_CONTRIBUTORS' +); + +// Provide default implementations +export const DEFAULT_MY_ENTITY_ACTIONS = { + [eMyComponents.MyFeature]: DEFAULT_MY_FEATURE_ACTIONS, +}; + +// Use in module +{ + provide: MY_ENTITY_ACTION_CONTRIBUTORS, + useValue: options.entityActionContributors || DEFAULT_MY_ENTITY_ACTIONS, +} +``` + +### Modal Pattern + +```typescript +@Injectable({ + providedIn: 'root', +}) +export class MyModalService { + private modalRef: NgbModalRef; + + private modalService = inject(NgbModal); + + show(data?: any): NgbModalRef { + this.modalRef = this.modalService.open(MyModalComponent, { + size: 'lg', + backdrop: 'static', + }); + + if (data) { + this.modalRef.componentInstance.data = data; + } + + return this.modalRef; + } + + close() { + if (this.modalRef) { + this.modalRef.close(); + } + } +} +``` + +### List Pattern + +```typescript +export class MyListComponent { + data = this.list.getGrid(); + + readonly list = inject(ListService); + + ngOnInit() { + this.hookToQuery(); + } + + private hookToQuery() { + this.list + .hookToQuery(query => this.pageService.getList({ ...query, ...this.filters })) + .subscribe(res => (this.data = res)); + } +} +``` + +## Troubleshooting + +### Common Issues + +1. **Module Not Found**: Check import paths and module declarations +2. **Circular Dependencies**: Use forwardRef() or restructure imports +3. **Memory Leaks**: Ensure proper cleanup in ngOnDestroy +4. **Performance Issues**: Use OnPush change detection and memoization +5. **Type Errors**: Ensure proper TypeScript configuration + +### Debugging Tips + +1. **Angular DevTools**: Use Angular DevTools for component inspection +2. **Console Logging**: Use console.log strategically for debugging +3. **Network Tab**: Monitor API calls in browser dev tools +4. **Error Boundaries**: Implement error boundaries for graceful error handling +5. **Unit Tests**: Use tests to reproduce and fix bugs + +### Performance Optimization + +1. **Bundle Analysis**: Use webpack-bundle-analyzer to identify large dependencies +2. **Lazy Loading**: Implement route-based code splitting +3. **Tree Shaking**: Ensure unused code is eliminated +4. **Caching**: Implement appropriate caching strategies +5. **Minification**: Ensure proper minification in production builds + +--- + +## Conclusion + +This guide provides a comprehensive overview of ABP module development patterns and best practices. Follow these guidelines to create maintainable, extensible, and performant modules that integrate seamlessly with the ABP framework. + +Remember to: + +- Follow established ABP conventions +- Write comprehensive tests +- Document your code +- Consider performance implications +- Implement proper error handling +- Use TypeScript features effectively + +For more information, refer to the official ABP documentation and community resources. diff --git a/npm/ng-packs/guides/QUICK_REFERENCE.md b/npm/ng-packs/guides/QUICK_REFERENCE.md new file mode 100644 index 0000000000..a742e40294 --- /dev/null +++ b/npm/ng-packs/guides/QUICK_REFERENCE.md @@ -0,0 +1,452 @@ +# ABP Package Development - Quick Reference + +## Essential Commands + +### Build & Test + +```bash +# Open a terminal on ng-packs directory +cd /Users/sumeyyekurtulus/Desktop/volosoft/GITHUB/abp/npm/ng-packs + +# Build the package +yarn nx build package-name --skip-nx-cache + +# Run tests +yarn nx test package-name --test-file test-file.spec.ts + +# Lint code +yarn run lint + +# Build for production +yarn nx build package-name --configuration=production +``` + +### Development + +```bash +# Open a terminal on ng-packs directory +cd /Users/sumeyyekurtulus/Desktop/volosoft/GITHUB/abp/npm/ng-packs + +# Start development server +yarn start + +# Watch for changes +yarn run watch + +# Generate component +ng generate component my-component + +# Generate service +ng generate service my-service +``` + +## File Structure Quick Reference + +``` +package-name/ +├── package.json # Package metadata and dependencies +├── ng-package.json # ng-packagr configuration +├── project.json # Nx workspace configuration +├── tsconfig.json # TypeScript root config +├── tsconfig.lib.json # Library-specific TS config +├── tsconfig.lib.prod.json # Production build config +├── tsconfig.spec.json # Test configuration +├── jest.config.ts # Jest test configuration +├── tslint.json # (optional) Linting rules +├── README.md # Package documentation +│ +├── src/ # Main library source code +│ ├── lib/ # Core library implementation +│ │ ├── components/ # Angular components +│ │ ├── services/ # Business logic services +│ │ ├── models/ # TypeScript interfaces/models +│ │ ├── enums/ # Enumerations +│ │ ├── guards/ # Route guards +│ │ ├── resolvers/ # Route resolvers +│ │ ├── defaults/ # Default configurations +│ │ ├── tokens/ # Dependency injection tokens +│ │ ├── utils/ # Utility functions +│ │ ├── validators/ # Form validators +│ │ ├── [feature].routes.ts +│ └── public-api.ts # Public exports barrel file +│ +├── config/ # Configuration sub-package (optional) +│ ├── ng-package.json +│ └── src/ +│ ├── components/ # Config-specific components +│ ├── providers/ # Route/setting providers +│ ├── services/ # Config services +│ ├── models/ # Config models +│ ├── enums/ # Config enums +│ └── public-api.ts +│ +├── proxy/ # API proxy sub-package (optional) [Do not touch while making generation] +│ ├── ng-package.json +│ └── src/ +│ ├── lib/ +│ │ └── proxy/ +│ │ ├── [feature]/ # Generated proxy services +│ │ ├── generate-proxy.json +│ │ └── README.md +│ └── public-api.ts +│ +├── common/ # Common/shared sub-package (optional) +│ ├── ng-package.json +│ └── src/ +│ ├── enums/ +│ ├── tokens/ +│ └── public-api.ts +│ +└── admin/ # Admin-specific sub-package (optional) + ├── ng-package.json + └── src/ + └── ... +``` + +## Common Patterns + +### Component Definition + +```typescript +@Component({ + selector: 'app-my-component', + templateUrl: './my-component.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eMyComponents.MyComponent, + }, + ], + imports: [], +}) +export class MyComponent implements OnInit { + public readonly list = inject(ListService); + private myComponentService = inject(MyComponentService); + + data = this.list.getGrid(); + + ngOnInit() { + this.hookToQuery(); + } + + private hookToQuery() { + this.list + .hookToQuery(query => this.myComponentService.getList({ ...query, ...this.filters })) + .subscribe(res => (this.data = res)); + } +} +``` + +### Default Extension Points + +```typescript +export const DEFAULT_MY_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'AbpPackage::MyElement', + action: data => { + const { piece } = data.record; + if (!piece) { + return; + } + + const router = data.getInjected(Router); + router.navigate(['/package/piece']); + }, + permission: 'AbpPackage.MyElement', + }, +]); +``` + +```typescript +export const DEFAULT_MY_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.PropType, + name: 'propName', + displayName: 'AbpPackage::PropDisplayName', + sortable: true, + columnWidth: 200, + }, +]); +``` + +```typescript +export const DEFAULT_MY_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.PropType, + name: 'propName', + displayName: 'AbpPackage::PropDisplayName', + id: 'propID', + }, +]); +export const DEFAULT_MY_EDIT_FORM_PROPS = DEFAULT_MY_CREATE_FORM_PROPS.filter( + prop => prop.name !== 'propName', +); +``` + +```typescript +export const DEFAULT_MY_TOOLBAR_COMPONENTS = ToolbarComponent.createMany([ + { + permission: 'AbpPermissionKey', + component: MyComponent, + }, +]); + +export const DEFAULT_MY_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'AbpPackage::Text', + action: data => { + const component = data.getInjected(MyComponent); + component.onAdd(); + }, + permission: 'AbpPermissionKey', + icon: 'fa fa-plus', + }, +]); + +export const DEFAULT_USERS_TOOLBAR_ALL = [ + ...DEFAULT_USERS_TOOLBAR_COMPONENTS, + ...DEFAULT_USERS_TOOLBAR_ACTIONS, +]; +``` + +### Route Definition + +```typescript +export function createRoutes(config: MyConfigOptions = {}): Routes { + return [ + { + path: '', + component: RouterOutletComponent, + providers: provideMyContributors(config), + canActivate: [authGuard, permissionGuard], + children: [ + { + path: 'my-feature', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'My.Feature', + replaceableComponent: { + key: eMyComponents.MyFeature, + defaultComponent: MyFeatureComponent, + }, + }, + }, + ], + }, + ]; +} + +function provideMyContributors(options: MyConfigOptions = {}): Provider[] { + return [ + { + provide: MY_ENTITY_ACTION_CONTRIBUTORS, + useValue: options.entityActionContributors, + }, + { + provide: MY_TOOLBAR_ACTION_CONTRIBUTORS, + useValue: options.toolbarActionContributors, + }, + { + provide: MY_ENTITY_PROP_CONTRIBUTORS, + useValue: options.entityPropContributors, + }, + { + provide: MY_CREATE_FORM_PROP_CONTRIBUTORS, + useValue: options.createFormPropContributors, + }, + { + provide: MY_EDIT_FORM_PROP_CONTRIBUTORS, + useValue: options.editFormPropContributors, + }, + ]; +} +``` + +```typescript +export const APP_ROUTES: Routes = [ + { + path: 'my-route', + loadChildren: () => import('my-package').then(c => c.createRoutes()), + }, +]; +``` + +### Provider Definitions + +```typescript +export const MY_ROUTE_PROVIDERS = [ + provideAppInitializer(() => { + configureRoutes(); + }), +]; + +export function configureRoutes() { + const routes = inject(RoutesService); + routes.add([ + { + path: '/my-route', + name: eMyRouteNames.Route, + parentName: eThemeSharedRouteNames.Route, + order: 2, + layout: eLayoutType.application, + iconClass: 'fa fa-id-card-o', + requiredPolicy: eMyPolicyNames.Route, + }, + { + path: '/my-route/my-sub-route', + name: eMyRouteNames.MySubRoute, + parentName: eMyRouteNames.Route, + order: 1, + requiredPolicy: eMyPolicyNames.MySubRoute, + }, + ]); +} +``` + +```typescript +export function provideMyConfig() { + return makeEnvironmentProviders([MY_ROUTE_PROVIDERS]); +} +``` + +```typescript +export const appConfig: ApplicationConfig = { + providers: [provideMyConfig()], +}; +``` + +## Validation Patterns + +### Custom Validator + +```typescript +export const MY_VALIDATOR_PROVIDER: Provider = { + provide: MY_FORM_ASYNC_VALIDATORS_TOKEN, + multi: true, + useFactory: myCustomValidator, +}; + +export function myCustomValidator(): AsyncValidatorFn { + return (group: FormGroup) => { + // Validation logic + return of(null); + }; +} +``` + +## Testing Patterns + +### Component Test + +```typescript +describe('MyComponent', () => { + let component: MyComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [MyComponent], + providers: [{ provide: MyService, useValue: jasmine.createSpyObj('MyService', ['getList']) }], + }).compileComponents(); + + fixture = TestBed.createComponent(MyComponent); + component = fixture.componentInstance; + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); +``` + +## Configuration Options + +### Module Configuration + +```typescript +export interface MyConfigOptions { + entityActionContributors?: MyEntityActionContributors; + toolbarActionContributors?: MyToolbarActionContributors; + entityPropContributors?: MyEntityPropContributors; + createFormPropContributors?: MyCreateFormPropContributors; + editFormPropContributors?: MyEditFormPropContributors; +} +``` + +## Common Imports + +### Common Services + +```typescript +import { ListService, ConfigStateService } from '@abp/ng.core'; +import { RestService } from '@abp/ng.core'; +import { EntityAction, FormProp } from '@abp/ng.components/extensible'; +``` + +### Common Guards & Components + +```typescript +import { authGuard, permissionGuard } from '@abp/ng.core'; +import { RouterOutletComponent, ReplaceableRouteContainerComponent } from '@abp/ng.core'; +``` + +## Naming Conventions + +| Type | Convention | Example | +| ----------------- | -------------------------- | --------------------------- | +| Files | kebab-case | `my-component.component.ts` | +| Classes | PascalCase | `MyComponent` | +| Variables/Methods | camelCase | `myVariable`, `myMethod()` | +| Constants | UPPER_SNAKE_CASE | `MY_CONSTANT` | +| Interfaces | PascalCase with 'I' prefix | `IMyInterface` | +| Enums | PascalCase with 'e' prefix | `eMyEnum` | + +## Best Practices Checklist + +- [ ] Follow single responsibility principle +- [ ] Use dependency injection +- [ ] Implement proper error handling +- [ ] Write unit tests +- [ ] Use TypeScript strictly +- [ ] Follow ABP conventions +- [ ] Document public APIs +- [ ] Optimize for performance +- [ ] Implement proper validation +- [ ] Use reactive forms +- [ ] Handle lifecycle properly +- [ ] Implement proper security + +## Common Issues & Solutions + +### Module Not Found + +- Check import paths +- Verify module declarations +- Ensure proper exports + +### Circular Dependencies + +- Use `forwardRef()` +- Restructure imports +- Move shared code to separate modules + +### Memory Leaks + +- Unsubscribe from observables +- Implement `OnDestroy` +- Use `takeUntil` operator + +### Performance Issues + +- Use `OnPush` change detection +- Implement lazy loading +- Optimize bundle size + +## Useful Resources + +- [ABP Documentation](https://docs.abp.io) +- [Angular Documentation](https://angular.io/docs) +- [TypeScript Handbook](https://www.typescriptlang.org/docs) +- [RxJS Documentation](https://rxjs.dev) +- [ABP Community](https://community.abp.io) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index af6b753ca3..cfed0b85c0 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -48,8 +48,8 @@ }, "private": true, "devDependencies": { - "@abp/ng.theme.lepton-x": "~5.1.0-rc.2", - "@abp/utils": "~10.1.0-rc.2", + "@abp/ng.theme.lepton-x": "~5.2.0-rc.1", + "@abp/utils": "~10.2.0-rc.1", "@angular-devkit/build-angular": "~21.0.0", "@angular-devkit/core": "~21.0.0", "@angular-devkit/schematics": "~21.0.0", @@ -109,6 +109,7 @@ "bootstrap-icons": "~1.13.0", "browser-sync": "~3.0.0", "chart.js": "~4.0.0", + "codemirror": "~6.0.0", "cypress": "^7.0.0", "dotenv": "10.0.0", "eslint": "~8.0.0", @@ -136,6 +137,7 @@ "postcss-url": "10.1.3", "prettier": "^3.0.0", "protractor": "~7.0.0", + "@toast-ui/editor": "~3.0.0", "rxjs": "~7.8.0", "should-quote": "^1.0.0", "ts-jest": "29.4.6", @@ -156,4 +158,4 @@ "dependencies": { "openid-client": "^6.6.4" } -} \ No newline at end of file +} diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index 48749859c2..f01bc488b6 100644 --- a/npm/ng-packs/packages/account-core/package.json +++ b/npm/ng-packs/packages/account-core/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account.core", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~10.1.0-rc.2", - "@abp/ng.theme.shared": "~10.1.0-rc.2", + "@abp/ng.core": "~10.2.0-rc.1", + "@abp/ng.theme.shared": "~10.2.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 8e667e60ee..bff187fbc8 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~10.1.0-rc.2", - "@abp/ng.theme.shared": "~10.1.0-rc.2", + "@abp/ng.account.core": "~10.2.0-rc.1", + "@abp/ng.theme.shared": "~10.2.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { 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..3ac3a5b601 --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/package.json @@ -0,0 +1,20 @@ +{ + "name": "@abp/ng.cms-kit", + "version": "10.2.0-rc.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, + "dependencies": { + "@abp/ng.components": "~10.2.0-rc.1", + "@abp/ng.setting-management": "~10.2.0-rc.1", + "@abp/ng.theme.shared": "~10.2.0-rc.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 2f9df1ae00..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,113 +1,177 @@ - - @switch (getComponent(prop)) { - @case ('template') { - - } + + @switch (getComponent(prop())) { + @case ('template') { + + } }
- @switch (getComponent(prop)) { - @case ('input') { - - - } - @case ('hidden') { - - } - @case ('checkbox') { -
- - -
- } - @case ('select') { - - } - - } - @case ('multiselect') { - - - } - @case ('typeahead') { - -
- - -
- } - @case ('date') { - - - } - @case ('time') { - - - } - @case ('dateTime') { - - - } - @case ('textarea') { - - - } - @case ('passwordinputgroup') { - -
- -
+ +
+ } } - @if (prop.formText) { - {{ prop.formText | abpLocalization }} + @if (prop().formText) { + {{ prop().formText | abpLocalization }} }
- \ No newline at end of file + diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts index 09a29a98a9..a6a85cccee 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts @@ -14,14 +14,11 @@ import { ElementRef, inject, Injector, - Input, - OnChanges, Optional, - SimpleChanges, SkipSelf, - ViewChild, - signal, + viewChild, effect, + input, } from '@angular/core'; import { ControlContainer, @@ -42,7 +39,7 @@ import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; import { DateAdapter, DisabledDirective, TimeAdapter } from '@abp/ng.theme.shared'; import { EXTRA_PROPERTIES_KEY } from '../../constants/extra-properties'; import { FormProp } from '../../models/form-props'; -import { PropData } from '../../models/props'; +import { ReadonlyPropData } from '../../models/props'; import { selfFactory } from '../../utils/factory.util'; import { addTypeaheadTextSuffix } from '../../utils/typeahead.util'; import { eExtensibleComponents } from '../../enums/components'; @@ -72,8 +69,8 @@ import { ExtensibleFormMultiselectComponent } from '../multi-select/extensible-f AsyncPipe, NgComponentOutlet, NgTemplateOutlet, - FormsModule -], + FormsModule, + ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [ExtensibleFormPropService], viewProviders: [ @@ -86,7 +83,7 @@ import { ExtensibleFormMultiselectComponent } from '../multi-select/extensible-f { provide: NgbTimeAdapter, useClass: TimeAdapter }, ], }) -export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { +export class ExtensibleFormPropComponent implements AfterViewInit { protected service = inject(ExtensibleFormPropService); public readonly cdRef = inject(ChangeDetectorRef); public readonly track = inject(TrackByService); @@ -94,11 +91,11 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { private injector = inject(Injector); private readonly form = this.#groupDirective.form; - @Input() data!: PropData; - @Input() prop!: FormProp; - @Input() first?: boolean; - @Input() isFirstGroup?: boolean; - @ViewChild('field') private fieldRef!: ElementRef; + readonly data = input.required(); + readonly prop = input.required(); + readonly first = input(undefined); + readonly isFirstGroup = input(undefined); + private readonly fieldRef = viewChild.required>('field'); injectorForCustomComponent?: Injector; asterisk = ''; @@ -110,10 +107,60 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { typeaheadModel: any; passwordKey = eExtensibleComponents.PasswordComponent; - disabledFn = (data: PropData) => false; + disabledFn = (data: ReadonlyPropData) => false; get disabled() { - return this.disabledFn(this.data); + const data = this.data(); + if (!data) return false; + return this.disabledFn(data); + } + + constructor() { + // Watch prop changes and update state + effect(() => { + const currentProp = this.prop(); + const data = this.data(); + if (!currentProp || !data) return; + + const { options, readonly, disabled, validators, className, template } = currentProp; + + if (template) { + this.injectorForCustomComponent = Injector.create({ + providers: [ + { + provide: EXTENSIONS_FORM_PROP, + useValue: currentProp, + }, + { + provide: EXTENSIONS_FORM_PROP_DATA, + useValue: data?.record, + }, + { provide: ControlContainer, useExisting: FormGroupDirective }, + ], + parent: this.injector, + }); + } + + if (options) this.options$ = options(data); + if (readonly) this.readonly = readonly(data); + + if (disabled) { + this.disabledFn = disabled; + } + if (validators) { + this.validators = validators(data); + this.setAsterisk(); + } + if (className !== undefined) { + this.containerClassName = className; + } + + const [keyControl, valueControl] = this.getTypeaheadControls(); + if (keyControl && valueControl) + this.typeaheadModel = { key: keyControl.value, value: valueControl.value }; + + this.cdRef.markForCheck(); + }); } setTypeaheadValue(selectedOption: ABP.Option) { @@ -130,7 +177,7 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { ? text$.pipe( debounceTime(300), distinctUntilChanged(), - switchMap(text => this.prop?.options?.(this.data, text) || of([])), + switchMap(text => this.prop()?.options?.(this.data(), text) || of([])), ) : of([]); @@ -139,12 +186,12 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { meridian$ = this.service.meridian$; get isInvalid() { - const control = this.form.get(this.prop.name); + const control = this.form.get(this.prop().name); return control?.touched && control.invalid; } private getTypeaheadControls() { - const { name } = this.prop; + const { name } = this.prop(); const extraPropName = `${EXTRA_PROPERTIES_KEY}.${name}`; const keyControl = this.form.get(addTypeaheadTextSuffix(extraPropName)) || @@ -158,9 +205,9 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { } ngAfterViewInit() { - if (this.isFirstGroup && this.first && this.fieldRef) { + if (this.isFirstGroup() && this.first() && this.fieldRef()) { requestAnimationFrame(() => { - this.fieldRef.nativeElement.focus(); + this.fieldRef().nativeElement.focus(); }); } } @@ -172,43 +219,4 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { getType(prop: FormProp): string { return this.service.getType(prop); } - - ngOnChanges({ prop, data }: SimpleChanges) { - const currentProp = prop?.currentValue as FormProp; - const { options, readonly, disabled, validators, className, template } = currentProp || {}; - if (template) { - this.injectorForCustomComponent = Injector.create({ - providers: [ - { - provide: EXTENSIONS_FORM_PROP, - useValue: currentProp, - }, - { - provide: EXTENSIONS_FORM_PROP_DATA, - useValue: (data?.currentValue as PropData)?.record, - }, - { provide: ControlContainer, useExisting: FormGroupDirective }, - ], - parent: this.injector, - }); - } - - if (options) this.options$ = options(this.data); - if (readonly) this.readonly = readonly(this.data); - - if (disabled) { - this.disabledFn = disabled; - } - if (validators) { - this.validators = validators(this.data); - this.setAsterisk(); - } - if (className !== undefined) { - this.containerClassName = className; - } - - const [keyControl, valueControl] = this.getTypeaheadControls(); - if (keyControl && valueControl) - this.typeaheadModel = { key: keyControl.value, value: valueControl.value }; - } } diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html index be937e21ca..cf715f2b27 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html @@ -1,6 +1,6 @@ @if (form) { -@for (groupedProp of groupedPropList.items; track i; let i = $index; let first = $first) { - +@for (groupedProp of groupedPropList()?.items; track i; let i = $index; let first = $first) { + @if (isAnyGroupMemberVisible(i, data) && groupedProp.group?.className) {
diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.ts index 8b5829754d..1f7e3753b1 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.ts @@ -4,11 +4,12 @@ import { ChangeDetectorRef, Component, inject, - Input, Optional, - QueryList, SkipSelf, - ViewChildren, + viewChildren, + input, + signal, + effect } from '@angular/core'; import { ControlContainer, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; import { EXTRA_PROPERTIES_KEY } from '../../constants/extra-properties'; @@ -41,21 +42,24 @@ export class ExtensibleFormComponent { private readonly extensions = inject(ExtensionsService); private readonly identifier = inject(EXTENSIONS_IDENTIFIER); - @ViewChildren(ExtensibleFormPropComponent) - formProps!: QueryList; + readonly formProps = viewChildren(ExtensibleFormPropComponent); - @Input() - set selectedRecord(record: R) { - const type = !record || JSON.stringify(record) === '{}' ? 'create' : 'edit'; - const propList = this.extensions[`${type}FormProps`].get(this.identifier).props; - this.groupedPropList = this.createGroupedList(propList); - this.record = record; - } + readonly selectedRecord = input(undefined); extraPropertiesKey = EXTRA_PROPERTIES_KEY; - groupedPropList!: GroupedFormPropList; + readonly groupedPropList = signal(undefined); groupedPropListOfArray: FormProp[][]; - record!: R; + readonly record = signal(undefined); + + constructor() { + effect(() => { + const recordValue = this.selectedRecord(); + const type = !recordValue || JSON.stringify(recordValue) === '{}' ? 'create' : 'edit'; + const propList = this.extensions[`${type}FormProps`].get(this.identifier).props; + this.groupedPropList.set(this.createGroupedList(propList)); + this.record.set(recordValue); + }); + } get form(): UntypedFormGroup { return (this.container ? this.container.control : { controls: {} }) as UntypedFormGroup; @@ -75,8 +79,10 @@ export class ExtensibleFormComponent { } //TODO: Reactor this method - isAnyGroupMemberVisible(index: number, data) { - const { items } = this.groupedPropList; + isAnyGroupMemberVisible(index: number, data: any) { + const groupedPropListValue = this.groupedPropList(); + if (!groupedPropListValue) return false; + const { items } = groupedPropListValue; const formPropList = items[index].formPropList.toArray(); return formPropList.some(prop => prop.visible(data)); } diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html index 8b0a5744b2..0425c17615 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html @@ -1,119 +1,197 @@ @if (isBrowser) { - - @if (effectiveRowDetailTemplate) { - - - - - + + @if (effectiveRowDetailTemplate) { + + + + + - - - - - - } - @if(selectable) { - - - - @if (_selectionType !== 'single') { -
- -
- } -
- - - @if(_selectionType === 'single') { -
- -
- } - @if (_selectionType !== 'single') { -
- -
- } -
+ + + + + + } + @if (selectable()) { + + + @if (selectionType() !== 'single') { +
+ +
+ } +
-
- } - @if (actionsTemplate || (actionList.length && hasAtLeastOnePermittedAction)) { - - - - - @if (isVisibleActions(row)) { - - } - - - - } - @for (prop of propList; track prop.name; let i = $index) { - - - @if (prop.tooltip) { - - {{ column.name }} - - } @else { - - {{ column.name }} - - } - - - - - @if (!row['_' + prop.name].component) { - @if (prop.type === 'datetime' || prop.type === 'date' || prop.type === 'time') { -
- } @else { -
+ + @if (selectionType() === 'single') { +
+ +
+ } + @if (selectionType() !== 'single') { +
+ +
+ } +
+
+ } + @if (actionsTemplate() || (actionList.length && hasAtLeastOnePermittedAction)) { + + + @if (actionsTemplate(); as template) { + + } @else if (isVisibleActions(row)) { + } + + + } + @for (prop of propList; track prop.name; let i = $index) { + + + @if (prop.tooltip) { + + {{ column.name }} + } @else { - + + {{ column.name }} + } - - - - - } -
-} \ No newline at end of file + + + + + @if (!row['_' + prop.name].component) { + @if (prop.type === 'datetime' || prop.type === 'date' || prop.type === 'time') { +
+ } @else { +
+ } + } @else { + + } +
+
+
+ + } +
+} diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts index 75253b1f02..3112ab0a74 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts @@ -4,21 +4,19 @@ import { ChangeDetectorRef, Component, computed, - ContentChild, - EventEmitter, inject, Injector, - Input, LOCALE_ID, - OnChanges, OnDestroy, - Output, PLATFORM_ID, signal, - SimpleChanges, TemplateRef, TrackByFunction, - ViewChild, + input, + effect, + output, + contentChild, + viewChild, } from '@angular/core'; import { AsyncPipe, isPlatformBrowser, NgComponentOutlet, NgTemplateOutlet } from '@angular/common'; @@ -46,7 +44,7 @@ import { import { ePropType } from '../../enums/props.enum'; import { EntityActionList } from '../../models/entity-actions'; import { EntityProp, EntityPropList } from '../../models/entity-props'; -import { PropData } from '../../models/props'; +import { ReadonlyPropData } from '../../models/props'; import { ExtensionsService } from '../../services/extensions.service'; import { ENTITY_PROP_TYPE_CLASSES, @@ -79,14 +77,16 @@ const DEFAULT_ACTIONS_COLUMN_WIDTH = 150; ], templateUrl: './extensible-table.component.html', changeDetection: ChangeDetectionStrategy.OnPush, - styles: [` - :host ::ng-deep .ngx-datatable.material .datatable-body .datatable-row-detail { - background: none; - padding: 0; - } - `], + styles: [ + ` + :host ::ng-deep .ngx-datatable.material .datatable-body .datatable-row-detail { + background: none; + padding: 0; + } + `, + ], }) -export class ExtensibleTableComponent implements OnChanges, AfterViewInit, OnDestroy { +export class ExtensibleTableComponent implements AfterViewInit, OnDestroy { readonly #injector = inject(Injector); readonly getInjected = this.#injector.get.bind(this.#injector); protected readonly cdr = inject(ChangeDetectorRef); @@ -98,60 +98,68 @@ export class ExtensibleTableComponent implements OnChanges, AfterViewIn private platformId = inject(PLATFORM_ID); protected isBrowser = isPlatformBrowser(this.platformId); - protected _actionsText!: string; - @Input() - set actionsText(value: string) { - this._actionsText = value; - } - - get actionsText(): string { - return this._actionsText ?? (this.actionList.length >= 1 ? 'AbpUi::Actions' : ''); - } - - @Input() data!: R[]; - @Input() list!: ListService; - @Input() recordsTotal!: number; + // Input signals + readonly actionsTextInput = input(undefined, { alias: 'actionsText' }); + readonly dataInput = input([], { alias: 'data' }); + readonly list = input.required(); + readonly recordsTotal = input.required(); + readonly actionsColumnWidthInput = input(undefined, { + alias: 'actionsColumnWidth', + }); + readonly actionsTemplate = input | undefined>(undefined); + readonly selectable = input(false); + readonly selectionTypeInput = input( + SelectionType.multiClick, + { + alias: 'selectionType', + }, + ); + readonly selected = input([]); + readonly infiniteScroll = input(false); + readonly isLoading = input(false); + readonly scrollThreshold = input(10); + readonly tableHeight = input(undefined); + readonly rowDetailTemplate = input> | undefined>(undefined); + readonly rowDetailHeight = input('100%'); + + // Output signals + readonly tableActivate = output(); + readonly selectionChange = output(); + readonly loadMore = output(); + readonly rowDetailToggle = output(); + + // Internal signals + protected readonly _data = signal([]); + private readonly _actionsColumnWidth = signal(DEFAULT_ACTIONS_COLUMN_WIDTH); - @Input() set actionsColumnWidth(width: number) { - this._actionsColumnWidth.set(width ? Number(width) : undefined); - } + readonly rowDetailComponent = contentChild(ExtensibleTableRowDetailComponent); - @Input() actionsTemplate?: TemplateRef; + readonly table = viewChild.required('table'); - @Output() tableActivate = new EventEmitter(); + // Computed values + protected readonly actionsText = computed(() => { + return this.actionsTextInput() ?? (this.actionList.length >= 1 ? 'AbpUi::Actions' : ''); + }); - @Input() selectable = false; + protected readonly selectionType = computed(() => { + const value = this.selectionTypeInput(); + return typeof value === 'string' ? SelectionType[value as keyof typeof SelectionType] : value; + }); - @Input() set selectionType(value: SelectionType | string) { - this._selectionType = typeof value === 'string' ? SelectionType[value] : value; + protected get data(): R[] { + return this._data(); } - _selectionType: SelectionType = SelectionType.multiClick; - - @Input() selected: any[] = []; - @Output() selectionChange = new EventEmitter(); - - // Infinite scroll configuration - @Input() infiniteScroll = false; - @Input() isLoading = false; - @Input() scrollThreshold = 10; - @Output() loadMore = new EventEmitter(); - @Input() tableHeight: number; - - @Input() rowDetailTemplate?: TemplateRef>; - @Input() rowDetailHeight: string | number = '100%'; - @Output() rowDetailToggle = new EventEmitter(); - @ContentChild(ExtensibleTableRowDetailComponent) - rowDetailComponent?: ExtensibleTableRowDetailComponent; - - @ViewChild('table', { static: false }) table!: DatatableComponent; + protected set data(value: R[]) { + this._data.set(value); + } protected get effectiveRowDetailTemplate(): TemplateRef> | undefined { - return this.rowDetailComponent?.template() ?? this.rowDetailTemplate; + return this.rowDetailComponent()?.template() ?? this.rowDetailTemplate(); } protected get effectiveRowDetailHeight(): string | number { - return this.rowDetailComponent?.rowHeight() ?? this.rowDetailHeight; + return this.rowDetailComponent()?.rowHeight() ?? this.rowDetailHeight(); } hasAtLeastOnePermittedAction: boolean; @@ -162,9 +170,6 @@ export class ExtensibleTableComponent implements OnChanges, AfterViewIn readonly trackByFn: TrackByFunction> = (_, item) => item.name; - // Signal for actions column width - private readonly _actionsColumnWidth = signal(DEFAULT_ACTIONS_COLUMN_WIDTH); - // Infinite scroll: debounced load more subject private readonly loadMoreSubject = new Subject(); private readonly loadMoreSubscription = this.loadMoreSubject @@ -186,6 +191,55 @@ export class ExtensibleTableComponent implements OnChanges, AfterViewIn this.permissionService.filterItemsByPolicy( this.actionList.toArray().map(action => ({ requiredPolicy: action.permission })), ).length > 0; + + // Watch actionsColumnWidth input + effect(() => { + const width = this.actionsColumnWidthInput(); + this._actionsColumnWidth.set(width ? Number(width) : undefined); + }); + + // Watch data input changes + effect(() => { + const dataValue = this.dataInput(); + if (!dataValue) return; + + if (dataValue.length < 1) { + this.list().totalCount = this.recordsTotal(); + } + + this._data.set(dataValue.map((record, index) => this.prepareRecord(record, index))); + }); + } + + private prepareRecord(record: any, index: number): any { + this.propList.forEach(prop => { + const propData = { getInjected: this.getInjected, record, index } as ReadonlyPropData; + const value = this.getContent(prop.value, propData); + + const propKey = `_${prop.value.name}`; + record[propKey] = { + visible: prop.value.visible(propData), + value, + }; + if (prop.value.component) { + record[propKey].injector = Injector.create({ + providers: [ + { + provide: PROP_DATA_STREAM, + useValue: value, + }, + { + provide: ROW_RECORD, + useValue: record, + }, + ], + parent: this.#injector, + }); + record[propKey].component = prop.value.component; + } + }); + + return record; } private getIcon(value: boolean) { @@ -200,7 +254,7 @@ export class ExtensibleTableComponent implements OnChanges, AfterViewIn return key; } - getContent(prop: EntityProp, data: PropData): Observable { + getContent(prop: EntityProp, data: ReadonlyPropData): Observable { return prop.valueResolver(data).pipe( map(value => { switch (prop.type) { @@ -216,45 +270,6 @@ export class ExtensibleTableComponent implements OnChanges, AfterViewIn ); } - ngOnChanges({ data }: SimpleChanges) { - if (!data?.currentValue) return; - - if (data.currentValue.length < 1) { - this.list.totalCount = this.recordsTotal; - } - - this.data = data.currentValue.map((record: any, index: number) => { - this.propList.forEach(prop => { - const propData = { getInjected: this.getInjected, record, index } as any; - const value = this.getContent(prop.value, propData); - - const propKey = `_${prop.value.name}`; - record[propKey] = { - visible: prop.value.visible(propData), - value, - }; - if (prop.value.component) { - record[propKey].injector = Injector.create({ - providers: [ - { - provide: PROP_DATA_STREAM, - useValue: value, - }, - { - provide: ROW_RECORD, - useValue: record, - }, - ], - parent: this.#injector, - }); - record[propKey].component = prop.value.component; - } - }); - - return record; - }); - } - isVisibleActions(rowData: any): boolean { const actions = this.actionList.toArray(); const visibleActions = actions.filter(action => { @@ -277,9 +292,10 @@ export class ExtensibleTableComponent implements OnChanges, AfterViewIn return visibleActions.length > 0; } - onSelect({ selected }) { - this.selected.splice(0, this.selected.length); - this.selected.push(...selected); + onSelect({ selected }: { selected: any[] }) { + const selectedValue = this.selected(); + selectedValue.splice(0, selectedValue.length); + selectedValue.push(...selected); this.selectionChange.emit(selected); } @@ -299,12 +315,12 @@ export class ExtensibleTableComponent implements OnChanges, AfterViewIn } private shouldHandleScroll(): boolean { - return this.infiniteScroll && !this.isLoading; + return this.infiniteScroll() && !this.isLoading(); } private isNearScrollBottom(element: HTMLElement): boolean { const { offsetHeight, scrollTop, scrollHeight } = element; - return offsetHeight + scrollTop >= scrollHeight - this.scrollThreshold; + return offsetHeight + scrollTop >= scrollHeight - this.scrollThreshold(); } private triggerLoadMore(): void { @@ -312,24 +328,28 @@ export class ExtensibleTableComponent implements OnChanges, AfterViewIn } getTableHeight() { - if (!this.infiniteScroll) return 'auto'; + if (!this.infiniteScroll()) return 'auto'; - return this.tableHeight ? `${this.tableHeight}px` : 'auto'; + const tableHeight = this.tableHeight(); + return tableHeight ? `${tableHeight}px` : 'auto'; } toggleExpandRow(row: R): void { - if (this.table && this.table.rowDetail) { - this.table.rowDetail.toggleExpandRow(row); + const table = this.table(); + if (table && table.rowDetail) { + table.rowDetail.toggleExpandRow(row); } this.rowDetailToggle.emit(row); } ngAfterViewInit(): void { - if (!this.infiniteScroll) { - this.list?.requestStatus$?.pipe(filter(status => status === 'loading')).subscribe(() => { - this.data = []; - this.cdr.markForCheck(); - }); + if (!this.infiniteScroll()) { + this.list() + ?.requestStatus$?.pipe(filter(status => status === 'loading')) + .subscribe(() => { + this._data.set([]); + this.cdr.markForCheck(); + }); } } diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.html index 57a8b4a7fe..70e22ee3cf 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.html +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.html @@ -1,7 +1,7 @@ @if (actionList.length > 1) {
@for (action of actionList; track action.text) { diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.ts index 9f7c28201e..4336b0f6fd 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.ts @@ -1,8 +1,8 @@ import { ChangeDetectionStrategy, Component, - Input, TrackByFunction, + input } from '@angular/core'; import { EntityAction, EntityActionList } from '../../models/entity-actions'; import { EXTENSIONS_ACTION_TYPE } from '../../tokens/extensions.token'; @@ -33,11 +33,9 @@ import { NgTemplateOutlet } from '@angular/common'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class GridActionsComponent extends AbstractActionsComponent> { - @Input() icon = 'fa fa-cog'; - - @Input() readonly index?: number; - - @Input() text = ''; + readonly icon = input('fa fa-cog'); + readonly index = input(undefined); + readonly text = input(''); readonly trackByFn: TrackByFunction> = (_, item) => item.text; diff --git a/npm/ng-packs/packages/components/extensible/src/lib/directives/prop-data.directive.ts b/npm/ng-packs/packages/components/extensible/src/lib/directives/prop-data.directive.ts index b7a05d314b..6d25e6da6a 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/directives/prop-data.directive.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/directives/prop-data.directive.ts @@ -1,34 +1,34 @@ /* eslint-disable @angular-eslint/no-input-rename */ -import { - Directive, - Injector, - Input, - OnChanges, - OnDestroy, - TemplateRef, - ViewContainerRef, - inject +import { + Directive, + Injector, + OnDestroy, + TemplateRef, + ViewContainerRef, + effect, + inject, + input } from '@angular/core'; import { PropData, PropList } from '../models/props'; +type InferredRecord = L extends PropList ? R : never; + @Directive({ exportAs: 'abpPropData', selector: '[abpPropData]', }) export class PropDataDirective> - extends PropData> - implements OnChanges, OnDestroy + extends PropData> + implements OnDestroy { private tempRef = inject>(TemplateRef); private vcRef = inject(ViewContainerRef); - @Input('abpPropDataFromList') propList?: L; - - @Input('abpPropDataWithRecord') record!: InferredData['record']; + readonly propList = input(undefined, { alias: 'abpPropDataFromList' }); + readonly record = input.required>({ alias: 'abpPropDataWithRecord' }); + readonly index = input(undefined, { alias: 'abpPropDataAtIndex' }); - @Input('abpPropDataAtIndex') index?: number; - - readonly getInjected: InferredData['getInjected']; + readonly getInjected: PropData>['getInjected']; constructor() { const injector = inject(Injector); @@ -36,14 +36,19 @@ export class PropDataDirective> super(); this.getInjected = injector.get.bind(injector); - } - ngOnChanges() { - this.vcRef.clear(); - - this.vcRef.createEmbeddedView(this.tempRef, { - $implicit: this.data, - index: 0, + // Watch for input changes and re-render + effect(() => { + // Read all inputs to track them + this.record(); + this.index(); + this.propList(); + + this.vcRef.clear(); + this.vcRef.createEmbeddedView(this.tempRef, { + $implicit: this.data, + index: 0, + }); }); } @@ -51,6 +56,3 @@ export class PropDataDirective> this.vcRef.clear(); } } - -type InferredData = PropData>; -type InferredRecord = L extends PropList ? R : never; diff --git a/npm/ng-packs/packages/components/extensible/src/lib/models/actions.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/actions.ts index 40938aca44..ed2986f81c 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/models/actions.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/models/actions.ts @@ -1,4 +1,4 @@ -import { InjectionToken, InjectOptions, Type } from '@angular/core'; +import { InjectionToken, InjectOptions, InputSignal, isSignal, Type } from '@angular/core'; import { LinkedList } from '@abp/utils'; export abstract class ActionList> extends LinkedList {} @@ -9,19 +9,28 @@ export abstract class ActionData { notFoundValue?: T, flags?: InjectOptions, ) => T; - index?: number; - abstract record: R; + index?: number | InputSignal; + abstract record: R | InputSignal; get data(): ReadonlyActionData { return { getInjected: this.getInjected, - index: this.index, - record: this.record, + // `record` / `index` may be signals; always use `data.record` / `data.index`. + index: isSignal(this.index) ? this.index() : this.index, + record: isSignal(this.record) ? this.record() : this.record, }; } } -export type ReadonlyActionData = Readonly, 'data'>>; +export type ReadonlyActionData = Readonly<{ + getInjected: ( + token: Type | InjectionToken, + notFoundValue?: T, + flags?: InjectOptions, + ) => T; + index?: number; + record: R; +}>; export abstract class Action { constructor( @@ -33,8 +42,8 @@ export abstract class Action { ) {} } -export type ActionCallback = (data: Omit, 'data'>) => R; -export type ActionPredicate = (data?: Omit, 'data'>) => boolean; +export type ActionCallback = (data: ReadonlyActionData) => R; +export type ActionPredicate = (data?: ReadonlyActionData) => boolean; export abstract class ActionsFactory> { protected abstract _ctor: Type; diff --git a/npm/ng-packs/packages/components/extensible/src/lib/models/form-props.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/form-props.ts index f99aa01623..ee54155b41 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/models/form-props.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/models/form-props.ts @@ -29,6 +29,7 @@ export interface FormPropGroup { export interface FormPropTooltip { text: string; + params?: string[]; placement?: 'top' | 'end' | 'bottom' | 'start'; } diff --git a/npm/ng-packs/packages/components/extensible/src/lib/models/props.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/props.ts index 8a2a29e425..0b9a55209a 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/models/props.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/models/props.ts @@ -1,4 +1,4 @@ -import { InjectionToken, InjectOptions, Type } from '@angular/core'; +import { InjectionToken, InjectOptions, InputSignal, isSignal, Type } from '@angular/core'; import { LinkedList } from '@abp/utils'; import { ePropType } from '../enums/props.enum'; import { FormPropTooltip } from './form-props'; @@ -11,19 +11,28 @@ export abstract class PropData { notFoundValue?: T, options?: InjectOptions, ) => T; - index?: number; - abstract record: R; + index?: number | InputSignal; + abstract record: R | InputSignal; get data(): ReadonlyPropData { return { getInjected: this.getInjected, - index: this.index, - record: this.record, + // `record` / `index` may be signals; always use `data.record` / `data.index`. + index: isSignal(this.index) ? this.index() : this.index, + record: isSignal(this.record) ? this.record() : this.record, }; } } -export type ReadonlyPropData = Readonly, 'data'>>; +export type ReadonlyPropData = Readonly<{ + getInjected: ( + token: Type | InjectionToken, + notFoundValue?: T, + options?: InjectOptions, + ) => T; + index?: number; + record: R; +}>; export abstract class Prop { constructor( @@ -43,9 +52,9 @@ export abstract class Prop { } } -export type PropCallback = (data: Omit, 'data'>, auxData?: any) => R; -export type PropPredicate = (data?: Omit, 'data'>, auxData?: any) => boolean; -export type PropDisplayTextResolver = (data?: Omit, 'data'>) => string; +export type PropCallback = (data: ReadonlyPropData, auxData?: any) => R; +export type PropPredicate = (data?: ReadonlyPropData, auxData?: any) => boolean; +export type PropDisplayTextResolver = (data?: ReadonlyPropData) => string; export abstract class PropsFactory> { protected abstract _ctor: Type; diff --git a/npm/ng-packs/packages/components/extensible/src/lib/utils/form-props.util.ts b/npm/ng-packs/packages/components/extensible/src/lib/utils/form-props.util.ts index 1bd25966fc..bda65957a6 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/utils/form-props.util.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/utils/form-props.util.ts @@ -4,11 +4,13 @@ import { DateTimeAdapter, DateAdapter, TimeAdapter } from '@abp/ng.theme.shared' import { EXTRA_PROPERTIES_KEY } from '../constants/extra-properties'; import { ePropType } from '../enums/props.enum'; import { FormPropList } from '../models/form-props'; -import { PropData } from '../models/props'; +import { PropData, ReadonlyPropData } from '../models/props'; import { ExtensionsService } from '../services/extensions.service'; import { EXTENSIONS_IDENTIFIER } from '../tokens/extensions.token'; -export function generateFormFromProps(data: PropData) { +export function generateFormFromProps(propData: PropData) { + const data: ReadonlyPropData = propData.data; + const extensions = data.getInjected(ExtensionsService); const identifier = data.getInjected(EXTENSIONS_IDENTIFIER); @@ -16,7 +18,7 @@ export function generateFormFromProps(data: PropData) { const extraForm = new UntypedFormGroup({}); form.addControl(EXTRA_PROPERTIES_KEY, extraForm); - const record = data.record || {}; + const record: any = data.record || {}; const type = JSON.stringify(record) === '{}' ? 'create' : 'edit'; const props: FormPropList = extensions[`${type}FormProps`].get(identifier).props; const extraProperties = record[EXTRA_PROPERTIES_KEY] || {}; @@ -33,7 +35,7 @@ export function generateFormFromProps(data: PropData) { value = record[name]; } - if (typeof value === 'undefined') value = prop.defaultValue; + if (typeof value === 'undefined') value = prop.defaultValue as any; if (value) { let adapter: DateAdapter | TimeAdapter | DateTimeAdapter; diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index f991cb13d4..cbd4e2d3b7 100644 --- a/npm/ng-packs/packages/components/package.json +++ b/npm/ng-packs/packages/components/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.components", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=10.1.0-rc.2", - "@abp/ng.theme.shared": ">=10.1.0-rc.2" + "@abp/ng.core": ">=10.2.0-rc.1", + "@abp/ng.theme.shared": ">=10.2.0-rc.1" }, "dependencies": { "chart.js": "^3.5.1", diff --git a/npm/ng-packs/packages/components/page/src/page-part.directive.ts b/npm/ng-packs/packages/components/page/src/page-part.directive.ts index bfaf1e60b6..23c243edc6 100644 --- a/npm/ng-packs/packages/components/page/src/page-part.directive.ts +++ b/npm/ng-packs/packages/components/page/src/page-part.directive.ts @@ -1,24 +1,22 @@ -import { - Directive, - TemplateRef, - ViewContainerRef, - Input, - InjectionToken, - OnInit, - OnDestroy, - Injector, - OnChanges, - SimpleChanges, - SimpleChange, - inject - } from '@angular/core'; +import { + Directive, + TemplateRef, + ViewContainerRef, + InjectionToken, + OnInit, + OnDestroy, + Injector, + inject, + input, + effect +} from '@angular/core'; import { Observable, Subscription, of } from 'rxjs'; export interface PageRenderStrategy { shouldRender(type?: string): boolean | Observable; onInit?(type?: string, injector?: Injector, context?: any): void; onDestroy?(type?: string, injector?: Injector, context?: any): void; - onContextUpdate?(change?: SimpleChange): void; + onContextUpdate?(context?: any): void; } export const PAGE_RENDER_STRATEGY = new InjectionToken('PAGE_RENDER_STRATEGY'); @@ -26,20 +24,34 @@ export const PAGE_RENDER_STRATEGY = new InjectionToken('PAGE @Directive({ selector: '[abpPagePart]', }) -export class PagePartDirective implements OnInit, OnDestroy, OnChanges { +export class PagePartDirective implements OnInit, OnDestroy { private templateRef = inject>(TemplateRef); private viewContainer = inject(ViewContainerRef); private renderLogic = inject(PAGE_RENDER_STRATEGY, { optional: true })!; private injector = inject(Injector); hasRendered = false; - type!: string; subscription!: Subscription; - @Input('abpPagePartContext') context: any; - @Input() set abpPagePart(type: string) { - this.type = type; - this.createRenderStream(type); + readonly context = input(undefined, { alias: 'abpPagePartContext' }); + readonly abpPagePart = input(''); + + constructor() { + // Watch for type changes + effect(() => { + const type = this.abpPagePart(); + if (type) { + this.createRenderStream(type); + } + }); + + // Watch for context changes + effect(() => { + const ctx = this.context(); + if (this.renderLogic?.onContextUpdate) { + this.renderLogic.onContextUpdate(ctx); + } + }); } render = (shouldRender: boolean) => { @@ -52,15 +64,9 @@ export class PagePartDirective implements OnInit, OnDestroy, OnChanges { } }; - ngOnChanges({ context }: SimpleChanges): void { - if (this.renderLogic?.onContextUpdate) { - this.renderLogic.onContextUpdate(context); - } - } - ngOnInit() { if (this.renderLogic?.onInit) { - this.renderLogic.onInit(this.type, this.injector, this.context); + this.renderLogic.onInit(this.abpPagePart(), this.injector, this.context()); } } @@ -68,7 +74,7 @@ export class PagePartDirective implements OnInit, OnDestroy, OnChanges { this.clearSubscription(); if (this.renderLogic?.onDestroy) { - this.renderLogic.onDestroy(this.type, this.injector, this.context); + this.renderLogic.onDestroy(this.abpPagePart(), this.injector, this.context()); } } diff --git a/npm/ng-packs/packages/components/page/src/page.component.html b/npm/ng-packs/packages/components/page/src/page.component.html index ee32f2e5e2..8417c7c6e4 100644 --- a/npm/ng-packs/packages/components/page/src/page.component.html +++ b/npm/ng-packs/packages/components/page/src/page.component.html @@ -1,33 +1,33 @@ @if (shouldRenderRow) {
- @if (customTitle) { + @if (customTitle()) { } @else { - @if (title) { + @if (title()) {

- {{ title }} + {{ title() }}

} } - @if (customBreadcrumb) { + @if (customBreadcrumb()) { } @else { - @if (breadcrumb) { + @if (breadcrumb()) {
} } - @if (customToolbar) { + @if (customToolbar()) { } @else { - @if (toolbarVisible) { -
- + @if (toolbarVisible()) { +
+
} } diff --git a/npm/ng-packs/packages/components/page/src/page.component.ts b/npm/ng-packs/packages/components/page/src/page.component.ts index bd5242651f..24b6e60e0b 100644 --- a/npm/ng-packs/packages/components/page/src/page.component.ts +++ b/npm/ng-packs/packages/components/page/src/page.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, ViewEncapsulation, ContentChild } from '@angular/core'; +import { Component, ViewEncapsulation, input, effect, signal, contentChild } from '@angular/core'; import { PageTitleContainerComponent, PageBreadcrumbContainerComponent, @@ -16,20 +16,12 @@ import { PagePartDirective } from './page-part.directive'; imports: [BreadcrumbComponent, PageToolbarComponent, PagePartDirective], }) export class PageComponent { - @Input() title?: string; + readonly title = input(undefined); + readonly toolbarInput = input(undefined, { alias: 'toolbar' }); + readonly breadcrumb = input(true); - toolbarVisible = false; - _toolbarData: any; - @Input() set toolbar(val: any) { - this._toolbarData = val; - this.toolbarVisible = true; - } - - get toolbarData() { - return this._toolbarData; - } - - @Input() breadcrumb = true; + protected readonly toolbarVisible = signal(false); + protected readonly toolbarData = signal(undefined); pageParts = { title: PageParts.title, @@ -37,19 +29,28 @@ export class PageComponent { toolbar: PageParts.toolbar, }; - @ContentChild(PageTitleContainerComponent) customTitle?: PageTitleContainerComponent; - @ContentChild(PageBreadcrumbContainerComponent) - customBreadcrumb?: PageBreadcrumbContainerComponent; - @ContentChild(PageToolbarContainerComponent) customToolbar?: PageToolbarContainerComponent; + readonly customTitle = contentChild(PageTitleContainerComponent); + readonly customBreadcrumb = contentChild(PageBreadcrumbContainerComponent); + readonly customToolbar = contentChild(PageToolbarContainerComponent); + + constructor() { + effect(() => { + const toolbar = this.toolbarInput(); + if (toolbar !== undefined) { + this.toolbarData.set(toolbar); + this.toolbarVisible.set(true); + } + }); + } get shouldRenderRow() { return !!( - this.title || - this.toolbarVisible || - this.breadcrumb || - this.customTitle || - this.customBreadcrumb || - this.customToolbar || + this.title() || + this.toolbarVisible() || + this.breadcrumb() || + this.customTitle() || + this.customBreadcrumb() || + this.customToolbar() || this.pageParts ); } diff --git a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html index 8cd2058699..e83a419863 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html +++ b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html @@ -1,17 +1,17 @@ @@ -26,13 +26,13 @@
- @if (menu) { + @if (menu()) { } diff --git a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts index 5c320a539b..1cfbbb09f9 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts +++ b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts @@ -2,14 +2,15 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, - ContentChild, - EventEmitter, + contentChild, inject, - Input, OnInit, - Output, TemplateRef, ViewEncapsulation, + input, + output, + signal, + effect } from '@angular/core'; import { NgbDropdown, NgbDropdownMenu, NgbDropdownToggle } from '@ng-bootstrap/ng-bootstrap'; import { @@ -56,32 +57,64 @@ export class TreeComponent implements OnInit { private cdr = inject(ChangeDetectorRef); private disableTreeStyleLoading = inject(DISABLE_TREE_STYLE_LOADING_TOKEN, { optional: true }); - dropPosition: number; + dropPosition!: number; dropdowns = {} as { [key: string]: NgbDropdown }; - @ContentChild('menu') menu: TemplateRef; - @ContentChild(TreeNodeTemplateDirective) customNodeTemplate: TreeNodeTemplateDirective; - @ContentChild(ExpandedIconTemplateDirective) expandedIconTemplate: ExpandedIconTemplateDirective; - @Output() readonly checkedKeysChange = new EventEmitter(); - @Output() readonly expandedKeysChange = new EventEmitter(); - @Output() readonly selectedNodeChange = new EventEmitter(); - @Output() readonly dropOver = new EventEmitter(); - @Output() readonly nzExpandChange = new EventEmitter(); - @Input() noAnimation = true; - @Input() draggable: boolean; - @Input() checkable: boolean; - @Input() checkStrictly: boolean; - @Input() checkedKeys = []; - @Input() nodes = []; - @Input() expandedKeys: string[] = []; - @Input() selectedNode: any; - @Input() changeCheckboxWithNode: boolean; - @Input() isNodeSelected = node => this.selectedNode?.id === node.key; - @Input() beforeDrop = (event: NzFormatBeforeDropEvent) => { - this.dropPosition = event.pos; - return of(false); - }; + readonly menu = contentChild>('menu'); + readonly customNodeTemplate = contentChild(TreeNodeTemplateDirective); + readonly expandedIconTemplate = contentChild(ExpandedIconTemplateDirective); + readonly checkedKeysChange = output(); + readonly expandedKeysChange = output(); + readonly selectedNodeChange = output(); + readonly dropOver = output(); + readonly nzExpandChange = output(); + + // Input signals + readonly noAnimation = input(true); + readonly draggable = input(undefined); + readonly checkable = input(undefined); + readonly checkStrictly = input(undefined); + readonly checkedKeysInput = input([], { alias: 'checkedKeys' }); + readonly nodesInput = input([], { alias: 'nodes' }); + readonly expandedKeysInput = input([], { alias: 'expandedKeys' }); + readonly selectedNodeInput = input(undefined, { alias: 'selectedNode' }); + readonly changeCheckboxWithNode = input(undefined); + readonly isNodeSelectedFn = input<(node: any) => boolean>( + (node) => this._selectedNode()?.id === node.key, + { alias: 'isNodeSelected' } + ); + readonly beforeDropFn = input<(event: NzFormatBeforeDropEvent) => any>( + (event: NzFormatBeforeDropEvent) => { + this.dropPosition = event.pos; + return of(false); + }, + { alias: 'beforeDrop' } + ); + + // Internal signals for two-way binding + protected readonly _checkedKeys = signal([]); + protected readonly _expandedKeys = signal([]); + protected readonly _selectedNode = signal(undefined); + protected readonly _nodes = signal([]); + + // Getters for template access + get checkedKeys() { return this._checkedKeys(); } + get expandedKeys() { return this._expandedKeys(); } + get selectedNode() { return this._selectedNode(); } + get nodes() { return this._nodes(); } + get isNodeSelected() { return this.isNodeSelectedFn(); } + get beforeDrop() { return this.beforeDropFn(); } + + constructor() { + // Sync input signals to internal signals + effect(() => { + this._checkedKeys.set(this.checkedKeysInput()); + this._expandedKeys.set(this.expandedKeysInput()); + this._selectedNode.set(this.selectedNodeInput()); + this._nodes.set(this.nodesInput()); + }); + } ngOnInit() { this.loadStyle(); @@ -97,13 +130,13 @@ export class TreeComponent implements OnInit { this.subscriptionService.addOne(loaded$); } - private findNode(target: any, nodes: any[]) { + private findNode(target: any, nodes: any[]): any { for (const node of nodes) { if (node.key === target.id) { return node; } if (node.children) { - const res = this.findNode(target, node.children); + const res: any = this.findNode(target, node.children); if (res) { return res; } @@ -113,36 +146,37 @@ export class TreeComponent implements OnInit { } onSelectedNodeChange(node: NzTreeNode) { - this.selectedNode = node.origin.entity; - if (this.changeCheckboxWithNode) { + this._selectedNode.set(node.origin.entity); + if (this.changeCheckboxWithNode()) { + const keys = this._checkedKeys(); let newVal; if (node.isChecked) { - newVal = this.checkedKeys.filter(x => x !== node.key); + newVal = keys.filter(x => x !== node.key); } else { - newVal = [...this.checkedKeys, node.key]; + newVal = [...keys, node.key]; } this.selectedNodeChange.emit(node); - this.checkedKeys = newVal; + this._checkedKeys.set(newVal); this.checkedKeysChange.emit(newVal); } else { this.selectedNodeChange.emit(node.origin.entity); } } - onCheckboxChange(event) { - this.checkedKeys = [...event.keys]; + onCheckboxChange(event: { keys: any[] }) { + this._checkedKeys.set([...event.keys]); this.checkedKeysChange.emit(event.keys); } - onExpandedKeysChange(event) { - this.expandedKeys = [...event.keys]; + onExpandedKeysChange(event: { keys: string[] } & NzFormatEmitEvent) { + this._expandedKeys.set([...event.keys]); this.expandedKeysChange.emit(event.keys); this.nzExpandChange.emit(event); } onDrop(event: DropEvent) { - event.event.stopPropagation(); - event.event.preventDefault(); + event.event?.stopPropagation(); + event.event?.preventDefault(); event.pos = this.dropPosition; this.dropOver.emit(event); @@ -160,12 +194,14 @@ export class TreeComponent implements OnInit { dropdown.close(); } }); - this.dropdowns[dropdownKey]?.toggle(); + if (dropdownKey) { + this.dropdowns[dropdownKey]?.toggle(); + } } setSelectedNode(node: any) { - const newSelectedNode = this.findNode(node, this.nodes); - this.selectedNode = { ...newSelectedNode }; + const newSelectedNode = this.findNode(node, this._nodes()); + this._selectedNode.set({ ...newSelectedNode }); this.cdr.markForCheck(); } } diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index da1307759c..ad31dfb05a 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.core", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~10.1.0-rc.2", + "@abp/utils": "~10.2.0-rc.1", "just-clone": "^6.0.0", "just-compare": "^2.0.0", "ts-toolbelt": "^9.0.0", diff --git a/npm/ng-packs/packages/core/src/lib/abstracts/ng-model.component.ts b/npm/ng-packs/packages/core/src/lib/abstracts/ng-model.component.ts index 8e8ed6e66e..889143c9ed 100644 --- a/npm/ng-packs/packages/core/src/lib/abstracts/ng-model.component.ts +++ b/npm/ng-packs/packages/core/src/lib/abstracts/ng-model.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectorRef, Component, inject, Input } from '@angular/core'; +import { ChangeDetectorRef, Component, inject, input } from '@angular/core'; import { ControlValueAccessor } from '@angular/forms'; // Not an abstract class on purpose. Do not change! @@ -11,23 +11,20 @@ export class AbstractNgModelComponent implements ControlValueAcc onChange?: (value: T) => void; onTouched?: () => void; - @Input() + // Note: disabled needs to remain as a regular property because setDisabledState assigns to it disabled?: boolean; - @Input() - readonly?: boolean; + readonly readonly = input(undefined); - @Input() - valueFn: (value: U, previousValue?: T) => T = value => value as any as T; + readonly valueFn = input<(value: U, previousValue?: T) => T>(value => value as any as T); - @Input() - valueLimitFn: (value: T, previousValue?: T) => any = value => false; + readonly valueLimitFn = input<(value: T, previousValue?: T) => any>(value => false); - @Input() + // Note: value needs getter/setter for ControlValueAccessor and two-way binding set value(value: T) { - value = this.valueFn(value as any as U, this._value); + value = this.valueFn()(value as any as U, this._value); - if (this.valueLimitFn(value, this._value) !== false || this.readonly) return; + if (this.valueLimitFn()(value, this._value) !== false || this.readonly()) return; this._value = value; this.notifyValueChange(); @@ -48,7 +45,7 @@ export class AbstractNgModelComponent implements ControlValueAcc } writeValue(value: T): void { - this._value = this.valueLimitFn(value, this._value) || value; + this._value = this.valueLimitFn()(value, this._value) || value; this.cdRef.markForCheck(); } diff --git a/npm/ng-packs/packages/core/src/lib/directives/autofocus.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/autofocus.directive.ts index 398eaef9cc..4400c6d5af 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/autofocus.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/autofocus.directive.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Directive, ElementRef, Input, inject } from '@angular/core'; +import { AfterViewInit, Directive, ElementRef, inject, input } from '@angular/core'; @Directive({ selector: '[autofocus]', @@ -6,18 +6,12 @@ import { AfterViewInit, Directive, ElementRef, Input, inject } from '@angular/co export class AutofocusDirective implements AfterViewInit { private elRef = inject(ElementRef); - private _delay = 0; - - @Input('autofocus') - set delay(val: number | string | undefined) { - this._delay = Number(val) || 0; - } - - get delay() { - return this._delay; - } + readonly delay = input(0, { + alias: 'autofocus', + transform: (v: unknown) => Number(v) || 0, + }); ngAfterViewInit(): void { - setTimeout(() => this.elRef.nativeElement.focus(), this.delay as number); + setTimeout(() => this.elRef.nativeElement.focus(), this.delay()); } } diff --git a/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts index 99bfcebb92..792b671962 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts @@ -1,10 +1,10 @@ -import { Directive, EventEmitter, HostListener, Output } from '@angular/core'; +import { Directive, HostListener, output } from '@angular/core'; @Directive({ selector: '[abpCapsLock]', }) export class TrackCapsLockDirective { - @Output('abpCapsLock') capsLock = new EventEmitter(); + readonly capsLock = output({ alias: 'abpCapsLock' }); @HostListener('window:keydown', ['$event']) onKeyDown(event: KeyboardEvent): void { diff --git a/npm/ng-packs/packages/core/src/lib/directives/debounce.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/debounce.directive.ts index 239aed688d..e2b023a3af 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/debounce.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/debounce.directive.ts @@ -1,4 +1,4 @@ -import { Directive, ElementRef, EventEmitter, Input, OnInit, Output, inject } from '@angular/core'; +import { Directive, ElementRef, OnInit, inject, input, output } from '@angular/core'; import { fromEvent } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import { SubscriptionService } from '../services/subscription.service'; @@ -11,13 +11,13 @@ export class InputEventDebounceDirective implements OnInit { private el = inject(ElementRef); private subscription = inject(SubscriptionService); - @Input() debounce = 300; + readonly debounce = input(300); - @Output('input.debounce') readonly debounceEvent = new EventEmitter(); + readonly debounceEvent = output({ alias: 'input.debounce' }); ngOnInit(): void { const input$ = fromEvent(this.el.nativeElement, 'input').pipe( - debounceTime(this.debounce), + debounceTime(this.debounce()), ); this.subscription.addOne(input$, (event: Event) => { diff --git a/npm/ng-packs/packages/core/src/lib/directives/for.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/for.directive.ts index f26c12b706..0e3f1c8179 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/for.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/for.directive.ts @@ -1,7 +1,6 @@ import { Directive, EmbeddedViewRef, - Input, IterableChangeRecord, IterableChanges, IterableDiffer, @@ -11,6 +10,7 @@ import { TrackByFunction, ViewContainerRef, inject, + input } from '@angular/core'; import clone from 'just-clone'; import compare from 'just-compare'; @@ -42,29 +42,21 @@ export class ForDirective implements OnChanges { private differs = inject(IterableDiffers); // eslint-disable-next-line @angular-eslint/no-input-rename - @Input('abpForOf') - items!: any[]; + readonly items = input.required({ alias: "abpForOf" }); - @Input('abpForOrderBy') - orderBy?: string; + readonly orderBy = input(undefined, { alias: "abpForOrderBy" }); - @Input('abpForOrderDir') - orderDir?: 'ASC' | 'DESC'; + readonly orderDir = input<'ASC' | 'DESC'>(undefined, { alias: "abpForOrderDir" }); - @Input('abpForFilterBy') - filterBy?: string; + readonly filterBy = input(undefined, { alias: "abpForFilterBy" }); - @Input('abpForFilterVal') - filterVal: any; + readonly filterVal = input(undefined, { alias: "abpForFilterVal" }); - @Input('abpForTrackBy') - trackBy?: TrackByFunction; + readonly trackBy = input>(undefined, { alias: "abpForTrackBy" }); - @Input('abpForCompareBy') - compareBy?: CompareFn; + readonly compareBy = input(undefined, { alias: "abpForCompareBy" }); - @Input('abpForEmptyRef') - emptyRef?: TemplateRef; + readonly emptyRef = input>(undefined, { alias: "abpForEmptyRef" }); private differ!: IterableDiffer | null; private lastItemsRef: any[] | null = null; @@ -72,11 +64,11 @@ export class ForDirective implements OnChanges { private isShowEmptyRef!: boolean; get compareFn(): CompareFn { - return this.compareBy || compare; + return this.compareBy() || compare; } get trackByFn(): TrackByFunction { - return this.trackBy || ((index: number, item: any) => (item as any).id || index); + return this.trackBy() || ((index: number, item: any) => (item as any).id || index); } private iterateOverAppliedOperations(changes: IterableChanges) { @@ -91,7 +83,7 @@ export class ForDirective implements OnChanges { if (record.previousIndex == null) { const view = this.vcRef.createEmbeddedView( this.tempRef, - new AbpForContext(null, -1, -1, this.items), + new AbpForContext(null, -1, -1, this.items()), currentIndex || 0, ); @@ -120,7 +112,7 @@ export class ForDirective implements OnChanges { const viewRef = this.vcRef.get(i) as EmbeddedViewRef; viewRef.context.index = i; viewRef.context.count = l; - viewRef.context.list = this.items; + viewRef.context.list = this.items(); } changes.forEachIdentityChange((record: IterableChangeRecord) => { @@ -132,9 +124,10 @@ export class ForDirective implements OnChanges { } private projectItems(items: any[]): void { - if (!items.length && this.emptyRef) { + const emptyRef = this.emptyRef(); + if (!items.length && emptyRef) { this.vcRef.clear(); - this.vcRef.createEmbeddedView(this.emptyRef).rootNodes; + this.vcRef.createEmbeddedView(emptyRef).rootNodes; this.isShowEmptyRef = true; this.differ = null; this.lastItemsRef = null; @@ -142,7 +135,7 @@ export class ForDirective implements OnChanges { return; } - if (this.emptyRef && this.isShowEmptyRef) { + if (emptyRef && this.isShowEmptyRef) { this.vcRef.clear(); this.isShowEmptyRef = false; } @@ -162,7 +155,7 @@ export class ForDirective implements OnChanges { } private sortItems(items: any[]) { - const orderBy = this.orderBy; + const orderBy = this.orderBy(); if (orderBy) { items.sort((a, b) => (a[orderBy] > b[orderBy] ? 1 : a[orderBy] < b[orderBy] ? -1 : 0)); } else { @@ -171,28 +164,31 @@ export class ForDirective implements OnChanges { } ngOnChanges() { - if (!this.items) return; + const itemsValue = this.items(); + if (!itemsValue) return; // Recreate differ if items array reference changed - if (this.lastItemsRef !== this.items) { + if (this.lastItemsRef !== itemsValue) { + this.vcRef.clear(); this.differ = null; - this.lastItemsRef = this.items; + this.lastItemsRef = itemsValue; } - let items = clone(this.items) as any[]; + let items = clone(itemsValue) as any[]; if (!Array.isArray(items)) return; const compareFn = this.compareFn; - const filterBy = this.filterBy; + const filterBy = this.filterBy(); + const filterVal = this.filterVal(); if ( typeof filterBy !== 'undefined' && - typeof this.filterVal !== 'undefined' && - this.filterVal !== '' + typeof filterVal !== 'undefined' && + filterVal !== '' ) { - items = items.filter(item => compareFn(item[filterBy], this.filterVal)); + items = items.filter(item => compareFn(item[filterBy], this.filterVal())); } - switch (this.orderDir) { + switch (this.orderDir()) { case 'ASC': this.sortItems(items); this.projectItems(items); diff --git a/npm/ng-packs/packages/core/src/lib/directives/form-submit.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/form-submit.directive.ts index 879fbdf780..b6ecbedec5 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/form-submit.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/form-submit.directive.ts @@ -1,12 +1,11 @@ -import { - ChangeDetectorRef, - Directive, - ElementRef, - EventEmitter, - Input, - OnInit, - Output, - inject +import { + ChangeDetectorRef, + Directive, + ElementRef, + OnInit, + inject, + input, + output } from '@angular/core'; import { FormGroupDirective, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { fromEvent } from 'rxjs'; @@ -27,23 +26,20 @@ export class FormSubmitDirective implements OnInit { private cdRef = inject(ChangeDetectorRef); private subscription = inject(SubscriptionService); - @Input() - debounce = 200; + readonly debounce = input(200); // TODO: Remove unused input - @Input() - notValidateOnSubmit?: string | boolean; + readonly notValidateOnSubmit = input(undefined); - @Input() - markAsDirtyWhenSubmit = true; + readonly markAsDirtyWhenSubmit = input(true); - @Output() readonly ngSubmit = new EventEmitter(); + readonly ngSubmit = output(); executedNgSubmit = false; ngOnInit() { this.subscription.addOne(this.formGroupDirective.ngSubmit, () => { - if (this.markAsDirtyWhenSubmit) { + if (this.markAsDirtyWhenSubmit()) { this.markAsDirty(); } @@ -51,7 +47,7 @@ export class FormSubmitDirective implements OnInit { }); const keyup$ = fromEvent(this.host.nativeElement as HTMLElement, 'keyup').pipe( - debounceTime(this.debounce), + debounceTime(this.debounce()), filter(event => !(event.target instanceof HTMLTextAreaElement)), filter(event => event && event.key === 'Enter'), ); diff --git a/npm/ng-packs/packages/core/src/lib/directives/init.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/init.directive.ts index 1271f031ba..e4033f9f16 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/init.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/init.directive.ts @@ -1,4 +1,4 @@ -import { Directive, Output, EventEmitter, ElementRef, AfterViewInit, inject } from '@angular/core'; +import { Directive, ElementRef, AfterViewInit, inject, output } from '@angular/core'; @Directive({ selector: '[abpInit]', @@ -6,7 +6,7 @@ import { Directive, Output, EventEmitter, ElementRef, AfterViewInit, inject } fr export class InitDirective implements AfterViewInit { private elRef = inject(ElementRef); - @Output('abpInit') readonly init = new EventEmitter>(); + readonly init = output>({ alias: 'abpInit' }); ngAfterViewInit() { this.init.emit(this.elRef); diff --git a/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts index 2c17885984..b12782288d 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts @@ -2,12 +2,12 @@ import { AfterViewInit, ChangeDetectorRef, Directive, - Input, OnChanges, OnDestroy, TemplateRef, ViewContainerRef, inject, + input } from '@angular/core'; import { ReplaySubject, Subscription } from 'rxjs'; import { distinctUntilChanged, take } from 'rxjs/operators'; @@ -25,9 +25,9 @@ export class PermissionDirective implements OnDestroy, OnChanges, AfterViewInit private cdRef = inject(ChangeDetectorRef); queue = inject(QUEUE_MANAGER); - @Input('abpPermission') condition: string | undefined; + readonly condition = input(undefined, { alias: "abpPermission" }); - @Input('abpPermissionRunChangeDetection') runChangeDetection = true; + readonly runChangeDetection = input(true, { alias: "abpPermissionRunChangeDetection" }); subscription!: Subscription; @@ -41,14 +41,14 @@ export class PermissionDirective implements OnDestroy, OnChanges, AfterViewInit } this.subscription = this.permissionService - .getGrantedPolicy$(this.condition || '') + .getGrantedPolicy$(this.condition() || '') .pipe(distinctUntilChanged()) .subscribe(isGranted => { this.vcRef.clear(); if (isGranted && this.templateRef) { this.vcRef.createEmbeddedView(this.templateRef); } - if (this.runChangeDetection) { + if (this.runChangeDetection()) { if (!this.rendered) { this.cdrSubject.next(); } else { diff --git a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts index 7e948cc20f..f39ba1fdd3 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts @@ -1,14 +1,15 @@ -import { - Directive, - Injector, - Input, - OnChanges, - OnInit, - SimpleChanges, - TemplateRef, - Type, - ViewContainerRef, - inject +import { + Directive, + effect, + Injector, + OnChanges, + OnInit, + SimpleChanges, + TemplateRef, + Type, + ViewContainerRef, + inject, + input } from '@angular/core'; import compare from 'just-compare'; import { Subscription } from 'rxjs'; @@ -29,8 +30,7 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges { private replaceableComponents = inject(ReplaceableComponentsService); private subscription = inject(SubscriptionService); - @Input('abpReplaceableTemplate') - data!: ReplaceableComponents.ReplaceableTemplateDirectiveInput; + readonly data = input.required>({ alias: "abpReplaceableTemplate" }); providedData = { inputs: {}, @@ -55,11 +55,18 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges { this.setDefaultComponentInputs(); }, }; + + effect(() => { + const data = this.data(); + if (data?.inputs && this.defaultComponentRef) { + this.setDefaultComponentInputs(); + } + }); } ngOnInit() { const component$ = this.replaceableComponents - .get$(this.data.componentKey) + .get$(this.data().componentKey) .pipe( filter( (res = {} as ReplaceableComponents.ReplaceableComponent) => @@ -102,25 +109,26 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges { } setDefaultComponentInputs() { - if (!this.defaultComponentRef || (!this.data.inputs && !this.data.outputs)) return; - - if (this.data.inputs) { - for (const key in this.data.inputs) { - if (Object.prototype.hasOwnProperty.call(this.data.inputs, key)) { - if (!compare(this.defaultComponentRef[key], this.data.inputs[key].value)) { - this.defaultComponentRef[key] = this.data.inputs[key].value; + const data = this.data(); + if (!this.defaultComponentRef || (!data.inputs && !data.outputs)) return; + + if (data.inputs) { + for (const key in data.inputs) { + if (Object.prototype.hasOwnProperty.call(data.inputs, key)) { + if (!compare(this.defaultComponentRef[key], data.inputs[key].value)) { + this.defaultComponentRef[key] = data.inputs[key].value; } } } } - if (this.data.outputs) { - for (const key in this.data.outputs) { - if (Object.prototype.hasOwnProperty.call(this.data.outputs, key)) { + if (data.outputs) { + for (const key in data.outputs) { + if (Object.prototype.hasOwnProperty.call(data.outputs, key)) { if (!this.defaultComponentSubscriptions[key]) { this.defaultComponentSubscriptions[key] = this.defaultComponentRef[key].subscribe( (value: any) => { - this.data.outputs?.[key](value); + this.data().outputs?.[key](value); }, ); } @@ -130,24 +138,26 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges { } setProvidedData() { - this.providedData = { outputs: {}, ...this.data, inputs: {} }; + this.providedData = { outputs: {}, ...this.data(), inputs: {} }; - if (!this.data.inputs) return; + const data = this.data(); + if (!data.inputs) return; Object.defineProperties(this.providedData.inputs, { - ...Object.keys(this.data.inputs).reduce( + ...Object.keys(data.inputs).reduce( (acc, key) => ({ ...acc, [key]: { enumerable: true, configurable: true, - get: () => this.data.inputs?.[key]?.value, - ...(this.data.inputs?.[key]?.twoWay && { + get: () => this.data().inputs?.[key]?.value, + ...(this.data().inputs?.[key]?.twoWay && { set: (newValue: any) => { - if (this.data.inputs?.[key]) { - this.data.inputs[key].value = newValue; + const dataValue = this.data(); + if (dataValue.inputs?.[key]) { + dataValue.inputs[key].value = newValue; } - if (this.data.outputs?.[`${key}Change`]) { - this.data.outputs[`${key}Change`](newValue); + if (dataValue.outputs?.[`${key}Change`]) { + dataValue.outputs[`${key}Change`](newValue); } }, }), diff --git a/npm/ng-packs/packages/core/src/lib/directives/show-password.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/show-password.directive.ts index a8d8addd6c..367f483b21 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/show-password.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/show-password.directive.ts @@ -1,4 +1,4 @@ -import { Directive, ElementRef, Input, inject } from '@angular/core'; +import { Directive, ElementRef, effect, inject, input } from '@angular/core'; @Directive({ selector: '[abpShowPassword]', @@ -6,10 +6,15 @@ import { Directive, ElementRef, Input, inject } from '@angular/core'; export class ShowPasswordDirective { protected readonly elementRef = inject(ElementRef); - @Input() set abpShowPassword(visible: boolean) { - const element = this.elementRef.nativeElement as HTMLInputElement; - if (!element) return; + readonly abpShowPassword = input(false); - element.type = visible ? 'text' : 'password'; + constructor() { + effect(() => { + const visible = this.abpShowPassword(); + const element = this.elementRef.nativeElement as HTMLInputElement; + if (!element) return; + + element.type = visible ? 'text' : 'password'; + }); } } diff --git a/npm/ng-packs/packages/core/src/lib/directives/stop-propagation.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/stop-propagation.directive.ts index a1af9bf07e..2a3c8f0a80 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/stop-propagation.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/stop-propagation.directive.ts @@ -1,4 +1,4 @@ -import { Directive, ElementRef, EventEmitter, OnInit, Output, inject } from '@angular/core'; +import { Directive, ElementRef, OnInit, inject, output } from '@angular/core'; import { fromEvent } from 'rxjs'; import { SubscriptionService } from '../services/subscription.service'; @@ -10,7 +10,7 @@ export class StopPropagationDirective implements OnInit { private el = inject(ElementRef); private subscription = inject(SubscriptionService); - @Output('click.stop') readonly stopPropEvent = new EventEmitter(); + readonly stopPropEvent = output({ alias: 'click.stop' }); ngOnInit(): void { this.subscription.addOne(fromEvent(this.el.nativeElement, 'click'), event => { diff --git a/npm/ng-packs/packages/core/src/lib/tests/environment-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/environment-utils.spec.ts index bc1af8e5f4..353f1ebe69 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/environment-utils.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/environment-utils.spec.ts @@ -1,7 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { Component, Injector } from '@angular/core'; import { createComponentFactory, Spectator } from '@ngneat/spectator/vitest'; -import { BehaviorSubject } from 'rxjs'; +import { BehaviorSubject, throwError } from 'rxjs'; import { Environment, RemoteEnv } from '../models/environment'; import { EnvironmentService } from '../services/environment.service'; import { getRemoteEnv } from '../utils/environment-utils'; @@ -85,7 +85,6 @@ describe('EnvironmentUtils', () => { injectorSpy.mockReturnValueOnce(environmentService); injectorSpy.mockReturnValueOnce(http); - injectorSpy.mockReturnValueOnce({}); requestSpy.mockReturnValue(new BehaviorSubject(customEnv)); @@ -95,5 +94,24 @@ describe('EnvironmentUtils', () => { expect(requestSpy).toHaveBeenCalledWith('GET', '/assets/appsettings.json', { headers: {} }); expect(setStateSpy).toHaveBeenCalledWith(expectedValue); } + + it('should handle request error gracefully and use local environment', async () => { + const injector = spectator.inject(Injector); + const injectorSpy = jest.spyOn(injector, 'get'); + const http = spectator.inject(HttpClient); + const requestSpy = jest.spyOn(http, 'request'); + const environmentService = spectator.inject(EnvironmentService); + const setStateSpy = jest.spyOn(environmentService, 'setState'); + + injectorSpy.mockReturnValueOnce(environmentService); + injectorSpy.mockReturnValueOnce(http); + + requestSpy.mockReturnValue(throwError(() => new Error('Network error'))); + + environment.remoteEnv.mergeStrategy = 'deepmerge'; + await getRemoteEnv(injector, environment); + + expect(setStateSpy).toHaveBeenCalledWith(deepMerge(environment, {})); + }); }); }); diff --git a/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts index 08075ee7f4..3cd625cd3c 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, Output, inject } from '@angular/core'; +import { Component, Input, inject, output } from '@angular/core'; import { Router } from '@angular/router'; import { createDirectiveFactory, SpectatorDirective } from '@ngneat/spectator/vitest'; import { BehaviorSubject } from 'rxjs'; @@ -18,11 +18,9 @@ class DefaultComponent { @Input() twoWay: boolean; - @Output() - readonly twoWayChange = new EventEmitter(); + readonly twoWayChange = output(); - @Output() - readonly someOutput = new EventEmitter(); + readonly someOutput = output(); setTwoWay(value) { this.twoWay = value; diff --git a/npm/ng-packs/packages/core/src/lib/utils/environment-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/environment-utils.ts index 8db9b5e02f..ae11ef002a 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/environment-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/environment-utils.ts @@ -1,10 +1,9 @@ import { HttpClient } from '@angular/common/http'; -import { Injector } from '@angular/core'; +import { Injector, isDevMode } from '@angular/core'; import { of } from 'rxjs'; import { catchError, tap } from 'rxjs/operators'; import { Environment, RemoteEnv } from '../models/environment'; import { EnvironmentService } from '../services/environment.service'; -import { HttpErrorReporterService } from '../services/http-error-reporter.service'; import { deepMerge } from './object-utils'; export function getRemoteEnv(injector: Injector, environment: Partial) { @@ -15,15 +14,20 @@ export function getRemoteEnv(injector: Injector, environment: Partial(method, url, { headers }) .pipe( catchError(err => { - httpErrorReporter.reportError(err); + if (isDevMode()) { + console.warn( + `[ABP Environment] Failed to fetch remote environment from "${url}". ` + + `Error: ${err.message || err}\n` + + `See https://abp.io/docs/latest/framework/ui/angular/environment#example-remoteenv-configuration for configuration details.`, + ); + } return of(null); - }), // TODO: Consider get handle function from a provider + }), tap(env => environmentService.setState( mergeEnvironments(environment, env || ({} as Environment), remoteEnv as RemoteEnv), diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index 1b847655e7..330ae6320a 100644 --- a/npm/ng-packs/packages/feature-management/package.json +++ b/npm/ng-packs/packages/feature-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.feature-management", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~10.1.0-rc.2", + "@abp/ng.theme.shared": "~10.2.0-rc.1", "tslib": "^2.0.0" }, "peerDependencies": { diff --git a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html index f59a66b6a5..bd08cbb7b7 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html +++ b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html @@ -3,8 +3,8 @@

{{ 'AbpFeatureManagement::Features' | abpLocalization }} - @if (providerTitle) { - - {{ providerTitle }} + @if (providerTitle()) { + - {{ providerTitle() }} }

@@ -38,7 +38,7 @@ @for (feature of features[group.name]; track feature.id || i; let i = $index) { @let provider = feature.provider.name; @let isFeatureDisabled = !feature.parentName ? isParentDisabled(feature.name, group.name, provider) : - (provider !== providerName && provider !== defaultProviderName); + (provider !== providerName() && provider !== defaultProviderName);
@switch (feature.valueType?.name) { diff --git a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts index 5feac210e5..0ba6880036 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, Output, inject, DOCUMENT } from '@angular/core'; +import { Component, inject, DOCUMENT, input, output, signal, effect } from '@angular/core'; import { NgTemplateOutlet } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { ConfigStateService, LocalizationPipe, TrackByService } from '@abp/ng.core'; @@ -20,7 +20,6 @@ import { import { Tabs, TabList, Tab, TabPanel, TabContent } from '@angular/aria/tabs'; import { finalize } from 'rxjs/operators'; import { FreeTextInputDirective } from '../../directives'; -import { FeatureManagement } from '../../models'; enum ValueTypes { ToggleStringValueType = 'ToggleStringValueType', @@ -49,11 +48,7 @@ const DEFAULT_PROVIDER_NAME = 'D'; ModalCloseDirective, ], }) -export class FeatureManagementComponent - implements - FeatureManagement.FeatureManagementComponentInputs, - FeatureManagement.FeatureManagementComponentOutputs -{ +export class FeatureManagementComponent { protected readonly track = inject(TrackByService); protected readonly toasterService = inject(ToasterService); protected readonly service = inject(FeaturesService); @@ -61,14 +56,17 @@ export class FeatureManagementComponent protected readonly confirmationService = inject(ConfirmationService); private document = inject(DOCUMENT); - @Input() - providerKey: string; + // Signal inputs + readonly providerKey = input(undefined); + readonly providerName = input(undefined); + readonly providerTitle = input(undefined); + readonly visibleInput = input(false, { alias: 'visible' }); - @Input() - providerName: string; + // Output signals + readonly visibleChange = output(); - @Input({ required: false }) - providerTitle: string; + // Internal state + protected readonly _visible = signal(false); selectedGroupDisplayName: string; @@ -82,33 +80,41 @@ export class FeatureManagementComponent defaultProviderName = DEFAULT_PROVIDER_NAME; - protected _visible; + modalBusy = false; - @Input() + // Getter/setter for backward compatibility get visible(): boolean { - return this._visible; + return this._visible(); } set visible(value: boolean) { - if (this._visible === value) { + if (this._visible() === value) { return; } - this._visible = value; + this._visible.set(value); this.visibleChange.emit(value); if (value) { this.openModal(); - return; } } - @Output() readonly visibleChange = new EventEmitter(); - - modalBusy = false; + constructor() { + // Sync visible input to internal signal + effect(() => { + const inputValue = this.visibleInput(); + if (this._visible() !== inputValue) { + this._visible.set(inputValue); + if (inputValue) { + this.openModal(); + } + } + }); + } openModal() { - if (!this.providerName) { + if (!this.providerName()) { throw new Error('providerName is required.'); } @@ -116,7 +122,7 @@ export class FeatureManagementComponent } getFeatures() { - this.service.get(this.providerName, this.providerKey).subscribe(res => { + this.service.get(this.providerName()!, this.providerKey()).subscribe(res => { if (!res.groups?.length) return; this.groups = res.groups.map(({ name, displayName }) => ({ name, displayName })); this.selectedGroupDisplayName = this.groups[0].displayName; @@ -149,13 +155,13 @@ export class FeatureManagementComponent this.modalBusy = true; this.service - .update(this.providerName, this.providerKey, { features: changedFeatures }) + .update(this.providerName()!, this.providerKey(), { features: changedFeatures }) .pipe(finalize(() => (this.modalBusy = false))) .subscribe(() => { this.visible = false; this.toasterService.success('AbpUi::SavedSuccessfully'); - if (!this.providerKey) { + if (!this.providerKey()) { // to refresh host's features this.configState.refreshAppState().subscribe(); } @@ -167,11 +173,11 @@ export class FeatureManagementComponent .warn('AbpFeatureManagement::AreYouSureToResetToDefault', 'AbpFeatureManagement::AreYouSure') .subscribe((status: Confirmation.Status) => { if (status === Confirmation.Status.confirm) { - this.service.delete(this.providerName, this.providerKey).subscribe(() => { + this.service.delete(this.providerName()!, this.providerKey()).subscribe(() => { this.toasterService.success('AbpFeatureManagement::ResetedToDefault'); this.visible = false; - if (!this.providerKey) { + if (!this.providerKey()) { // to refresh host's features this.configState.refreshAppState().subscribe(); } @@ -190,17 +196,18 @@ export class FeatureManagementComponent isParentDisabled(parentName: string, groupName: string, provider: string): boolean { const children = this.features[groupName]?.filter(f => f.parentName === parentName); + const providerNameValue = this.providerName(); if (children?.length) { return children.some(child => { const childProvider = child.provider?.name; return ( - (childProvider !== this.providerName && childProvider !== this.defaultProviderName) || - (provider !== this.providerName && provider !== this.defaultProviderName) + (childProvider !== providerNameValue && childProvider !== this.defaultProviderName) || + (provider !== providerNameValue && provider !== this.defaultProviderName) ); }); } else { - return provider !== this.providerName && provider !== this.defaultProviderName; + return provider !== providerNameValue && provider !== this.defaultProviderName; } } diff --git a/npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts b/npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts index 6b6556dcfa..b341879995 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts @@ -1,4 +1,4 @@ -import { Directive, HostBinding, Input } from '@angular/core'; +import { Directive, effect, inject, input, ElementRef, Renderer2 } from '@angular/core'; // TODO: improve this type export interface FreeTextType { @@ -9,7 +9,7 @@ export interface FreeTextType { }; } -export const INPUT_TYPES = { +export const INPUT_TYPES: Record = { numeric: 'number', default: 'text', }; @@ -19,21 +19,25 @@ export const INPUT_TYPES = { exportAs: 'inputAbpFeatureManagementFreeText', }) export class FreeTextInputDirective { - _feature: FreeTextType; - // eslint-disable-next-line @angular-eslint/no-input-rename - @Input('abpFeatureManagementFreeText') set feature(val: FreeTextType) { - this._feature = val; - this.setInputType(); - } + private readonly elRef = inject(ElementRef); + private readonly renderer = inject(Renderer2); - get feature() { - return this._feature; - } + readonly feature = input(undefined, { + alias: 'abpFeatureManagementFreeText', + }); - @HostBinding('type') type: string; + constructor() { + effect(() => { + const feature = this.feature(); + if (feature) { + this.setInputType(feature); + } + }); + } - private setInputType() { - const validatorType = this.feature?.valueType?.validator?.name.toLowerCase(); - this.type = INPUT_TYPES[validatorType] ?? INPUT_TYPES.default; + private setInputType(feature: FreeTextType) { + const validatorType = feature?.valueType?.validator?.name?.toLowerCase(); + const type = INPUT_TYPES[validatorType] ?? INPUT_TYPES['default']; + this.renderer.setAttribute(this.elRef.nativeElement, 'type', type); } } diff --git a/npm/ng-packs/packages/feature-management/src/lib/models/feature-management.ts b/npm/ng-packs/packages/feature-management/src/lib/models/feature-management.ts index c04d917515..6337eea163 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/models/feature-management.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/models/feature-management.ts @@ -1,4 +1,4 @@ -import { EventEmitter } from '@angular/core'; +import { EventEmitter, OutputEmitterRef } from '@angular/core'; export namespace FeatureManagement { export interface FeatureManagementComponentInputs { @@ -8,6 +8,6 @@ export namespace FeatureManagement { } export interface FeatureManagementComponentOutputs { - readonly visibleChange: EventEmitter; + readonly visibleChange: EventEmitter | OutputEmitterRef; } } diff --git a/npm/ng-packs/packages/generators/package.json b/npm/ng-packs/packages/generators/package.json index ff1932f9e0..a4fc5bb05e 100644 --- a/npm/ng-packs/packages/generators/package.json +++ b/npm/ng-packs/packages/generators/package.json @@ -1,6 +1,6 @@ { "name": "@abp/nx.generators", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "generators": "./generators.json", "type": "commonjs", diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index 140c739280..decdbe6259 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -1,15 +1,15 @@ { "name": "@abp/ng.identity", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~10.1.0-rc.2", - "@abp/ng.permission-management": "~10.1.0-rc.2", - "@abp/ng.theme.shared": "~10.1.0-rc.2", + "@abp/ng.components": "~10.2.0-rc.1", + "@abp/ng.permission-management": "~10.2.0-rc.1", + "@abp/ng.theme.shared": "~10.2.0-rc.1", "tslib": "^2.0.0" }, "peerDependencies": { diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts index 7ff04cf679..ada580059d 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts @@ -39,7 +39,7 @@ import { OnInit, TemplateRef, TrackByFunction, - ViewChild, + viewChild } from '@angular/core'; import { AbstractControl, @@ -99,8 +99,7 @@ export class UsersComponent implements OnInit { data: PagedResultDto = { items: [], totalCount: 0 }; - @ViewChild('modalContent', { static: false }) - modalContent!: TemplateRef; + readonly modalContent = viewChild.required>('modalContent'); form!: UntypedFormGroup; diff --git a/npm/ng-packs/packages/oauth/package.json b/npm/ng-packs/packages/oauth/package.json index 98bc02a772..bfa11749ad 100644 --- a/npm/ng-packs/packages/oauth/package.json +++ b/npm/ng-packs/packages/oauth/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.oauth", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~10.1.0-rc.2", - "@abp/utils": "~10.1.0-rc.2", + "@abp/ng.core": "~10.2.0-rc.1", + "@abp/utils": "~10.2.0-rc.1", "angular-oauth2-oidc": "^20.0.0", "just-clone": "^6.0.0", "just-compare": "^2.0.0", diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index 3eb2efbfda..e818c9610b 100644 --- a/npm/ng-packs/packages/permission-management/package.json +++ b/npm/ng-packs/packages/permission-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.permission-management", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~10.1.0-rc.2", + "@abp/ng.theme.shared": "~10.2.0-rc.1", "tslib": "^2.0.0" }, "peerDependencies": { diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html index 0224f3d45a..3190d5216c 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html @@ -1,9 +1,9 @@ - @if (data.entityDisplayName || entityDisplayName) { + @if (data.entityDisplayName || entityDisplayName()) {

{{ 'AbpPermissionManagement::Permissions' | abpLocalization }} - - {{ entityDisplayName || data.entityDisplayName }} + {{ entityDisplayName() || data.entityDisplayName }}

diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts index b2612e9aaf..3ed4794990 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts @@ -1,3 +1,4 @@ +import { NgStyle } from '@angular/common'; import { ConfigStateService, CurrentUserDto, LocalizationPipe } from '@abp/ng.core'; import { ButtonComponent, @@ -15,21 +16,23 @@ import { UpdatePermissionDto, } from '@abp/ng.permission-management/proxy'; import { + afterNextRender, Component, computed, DOCUMENT, + effect, ElementRef, - EventEmitter, inject, - Input, - Output, - QueryList, + Injector, + input, + output, signal, TrackByFunction, - ViewChildren, + untracked, + viewChildren, } from '@angular/core'; -import { concat, of } from 'rxjs'; -import { finalize, switchMap, take, tap } from 'rxjs/operators'; +import { of } from 'rxjs'; +import { finalize, switchMap, tap } from 'rxjs/operators'; import { PermissionManagement } from '../models'; import { FormsModule } from '@angular/forms'; @@ -97,6 +100,7 @@ type PermissionWithGroupName = PermissionGrantInfoDto & { ], imports: [ FormsModule, + NgStyle, ModalComponent, LocalizationPipe, ButtonComponent, @@ -108,64 +112,53 @@ type PermissionWithGroupName = PermissionGrantInfoDto & { TabContent, ], }) -export class PermissionManagementComponent - implements - PermissionManagement.PermissionManagementComponentInputs, - PermissionManagement.PermissionManagementComponentOutputs -{ +export class PermissionManagementComponent { protected readonly service = inject(PermissionsService); protected readonly configState = inject(ConfigStateService); protected readonly toasterService = inject(ToasterService); + private readonly injector = inject(Injector); private document = inject(DOCUMENT); - @Input() - readonly providerName!: string; - @Input() - readonly providerKey!: string; + readonly providerNameInput = input('', { alias: 'providerName' }); + readonly providerKeyInput = input('', { alias: 'providerKey' }); + readonly hideBadgesInput = input(false, { alias: 'hideBadges' }); + readonly entityDisplayName = input(undefined); + readonly visibleInput = input(false, { alias: 'visible' }); - @Input() - readonly hideBadges = false; + // Output signals + readonly visibleChange = output(); - protected _visible = false; + // Internal state + protected readonly _visible = signal(false); - @Input() - entityDisplayName: string | undefined; - - @Input() - get visible(): boolean { - return this._visible; + // Backward-compatible getters/setters for ReplaceableTemplateDirective. + private _providerNameOverride?: string; + get providerName(): string { + return this._providerNameOverride ?? this.providerNameInput(); + } + set providerName(value: string) { + this._providerNameOverride = value; } - set visible(value: boolean) { - if (value === this._visible) { - return; - } - - if (value) { - this.openModal().subscribe(() => { - this._visible = true; - this.visibleChange.emit(true); - concat(this.selectAllInAllTabsRef.changes, this.selectAllInThisTabsRef.changes) - .pipe(take(1)) - .subscribe(() => { - this.initModal(); - }); - }); - } else { - this.setSelectedGroup(null); - this._visible = false; - this.visibleChange.emit(false); - this.filter.set(''); - } + private _providerKeyOverride?: string; + get providerKey(): string { + return this._providerKeyOverride ?? this.providerKeyInput(); + } + set providerKey(value: string) { + this._providerKeyOverride = value; } - @Output() readonly visibleChange = new EventEmitter(); + private _hideBadgesOverride?: boolean; + get hideBadges(): boolean { + return this._hideBadgesOverride ?? this.hideBadgesInput(); + } + set hideBadges(value: boolean) { + this._hideBadgesOverride = value; + } - @ViewChildren('selectAllInThisTabsRef') - selectAllInThisTabsRef!: QueryList>; - @ViewChildren('selectAllInAllTabsRef') - selectAllInAllTabsRef!: QueryList>; + selectAllInThisTabsRef = viewChildren>('selectAllInThisTabsRef'); + selectAllInAllTabsRef = viewChildren>('selectAllInAllTabsRef'); data: GetPermissionListResultDto = { groups: [], entityDisplayName: '' }; @@ -216,6 +209,54 @@ export class PermissionManagementComponent trackByFn: TrackByFunction = (_, item) => item.name; + // Getter/setter for visible - used by ReplaceableTemplateDirective and internal code + get visible(): boolean { + return this._visible(); + } + + set visible(value: boolean) { + if (value === this._visible()) { + return; + } + + if (value) { + this.openModal().subscribe(() => { + this._visible.set(true); + this.visibleChange.emit(true); + afterNextRender(() => { + this.initModal(); + }, { injector: this.injector }); + }); + } else { + this.setSelectedGroup(null); + this._visible.set(false); + this.visibleChange.emit(false); + this.filter.set(''); + } + } + + constructor() { + effect(() => { + const inputValue = this.visibleInput(); + untracked(() => { + if (this._visible() !== inputValue) { + if (inputValue) { + this.openModal().subscribe(() => { + this._visible.set(true); + afterNextRender(() => { + this.initModal(); + }, { injector: this.injector }); + }); + } else { + this.setSelectedGroup(null); + this._visible.set(false); + this.filter.set(''); + } + } + }); + }); + } + getChecked(name: string) { return (this.permissions.find(per => per.name === name) || { isGranted: false }).isGranted; } @@ -347,8 +388,9 @@ export class PermissionManagementComponent } setTabCheckboxState() { + const providerName = this.providerName; const selectablePermissions = this.selectedGroupPermissions.filter(per => - per.grantedProviders.every(p => p.providerName === this.providerName), + per.grantedProviders.every(p => p.providerName === providerName), ); const selectedPermissions = selectablePermissions.filter(per => per.isGranted); @@ -369,8 +411,9 @@ export class PermissionManagementComponent } setGrantCheckboxState() { + const providerName = this.providerName; const selectablePermissions = this.permissions.filter(per => - per.grantedProviders.every(p => p.providerName === this.providerName), + per.grantedProviders.every(p => p.providerName === providerName), ); const selectedAllPermissions = selectablePermissions.filter(per => per.isGranted); const checkboxElement = this.document.querySelector('#select-all-in-all-tabs') as any; @@ -470,11 +513,14 @@ export class PermissionManagementComponent } openModal() { - if (!this.providerKey || !this.providerName) { + const providerName = this.providerName; + const providerKey = this.providerKey; + + if (!providerKey || !providerName) { throw new Error('Provider Key and Provider Name are required.'); } - return this.service.get(this.providerName, this.providerKey).pipe( + return this.service.get(providerName, providerKey).pipe( tap((permissionRes: GetPermissionListResultDto) => { const { groups } = permissionRes || {}; @@ -486,7 +532,7 @@ export class PermissionManagementComponent this.disabledSelectAllInAllTabs = this.permissions.every( per => per.isGranted && - per.grantedProviders.every(provider => provider.providerName !== this.providerName), + per.grantedProviders.every(provider => provider.providerName !== providerName), ); }), ); @@ -510,10 +556,12 @@ export class PermissionManagementComponent shouldFetchAppConfig() { const currentUser = this.configState.getOne('currentUser') as CurrentUserDto; + const providerName = this.providerName; + const providerKey = this.providerKey; - if (this.providerName === 'R') return currentUser.roles.some(role => role === this.providerKey); + if (providerName === 'R') return currentUser.roles.some(role => role === providerKey); - if (this.providerName === 'U') return currentUser.id === this.providerKey; + if (providerName === 'U') return currentUser.id === providerKey; return false; } diff --git a/npm/ng-packs/packages/permission-management/src/lib/models/permission-management.ts b/npm/ng-packs/packages/permission-management/src/lib/models/permission-management.ts index 7909de0db9..58d7d95232 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/models/permission-management.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/models/permission-management.ts @@ -1,5 +1,5 @@ import { GetPermissionListResultDto } from '@abp/ng.permission-management/proxy'; -import { EventEmitter } from '@angular/core'; +import { EventEmitter, OutputEmitterRef } from '@angular/core'; export namespace PermissionManagement { export interface State { @@ -14,6 +14,6 @@ export namespace PermissionManagement { } export interface PermissionManagementComponentOutputs { - readonly visibleChange: EventEmitter; + readonly visibleChange: EventEmitter | OutputEmitterRef; } } diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index 199be73f20..2b8e9b4d8a 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -1,6 +1,6 @@ { "name": "@abp/ng.schematics", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "author": "", "schematics": "./collection.json", "dependencies": { diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index b182196ce9..c30d52d716 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.setting-management", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~10.1.0-rc.2", - "@abp/ng.theme.shared": "~10.1.0-rc.2", + "@abp/ng.components": "~10.2.0-rc.1", + "@abp/ng.theme.shared": "~10.2.0-rc.1", "tslib": "^2.0.0" }, "peerDependencies": { @@ -31,4 +31,4 @@ "csharp", "webapp" ] -} \ No newline at end of file +} diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index 1ced045022..82cb1be45b 100644 --- a/npm/ng-packs/packages/tenant-management/package.json +++ b/npm/ng-packs/packages/tenant-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.tenant-management", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~10.1.0-rc.2", - "@abp/ng.theme.shared": "~10.1.0-rc.2", + "@abp/ng.feature-management": "~10.2.0-rc.1", + "@abp/ng.theme.shared": "~10.2.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index e6e08aa95f..4fd658d379 100644 --- a/npm/ng-packs/packages/theme-basic/package.json +++ b/npm/ng-packs/packages/theme-basic/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.theme.basic", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~10.1.0-rc.2", - "@abp/ng.theme.shared": "~10.1.0-rc.2", + "@abp/ng.account.core": "~10.2.0-rc.1", + "@abp/ng.theme.shared": "~10.2.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.html index a29fb3323e..afc498d5ac 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.html +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.html @@ -30,7 +30,7 @@
@@ -60,7 +60,7 @@ diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts index a6afd37b12..8ec0681e52 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts @@ -10,11 +10,10 @@ import { Component, ElementRef, inject, - Input, - QueryList, Renderer2, TrackByFunction, - ViewChildren, + input, + viewChildren } from '@angular/core'; import { NgTemplateOutlet, AsyncPipe } from '@angular/common'; import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; @@ -39,9 +38,9 @@ export class RoutesComponent { public readonly routesService = inject(RoutesService); protected renderer = inject(Renderer2); - @Input() smallScreen?: boolean; + readonly smallScreen = input(undefined); - @ViewChildren('childrenContainer') childrenContainers!: QueryList>; + readonly childrenContainers = viewChildren>('childrenContainer'); rootDropdownExpand = {} as { [key: string]: boolean }; @@ -52,7 +51,7 @@ export class RoutesComponent { } closeDropdown() { - this.childrenContainers.forEach(({ nativeElement }) => { + this.childrenContainers().forEach(({ nativeElement }) => { this.renderer.addClass(nativeElement, 'd-none'); setTimeout(() => this.renderer.removeClass(nativeElement, 'd-none'), 0); }); diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index dc42e452a3..e3d394eea8 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.theme.shared", - "version": "10.1.0-rc.2", + "version": "10.2.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~10.1.0-rc.2", + "@abp/ng.core": "~10.2.0-rc.1", "@fortawesome/fontawesome-free": "^6.0.0", "@ng-bootstrap/ng-bootstrap": "~20.0.0", "@ngx-validate/core": "^0.2.0", diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb-items/breadcrumb-items.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb-items/breadcrumb-items.component.html index 4b2dbf611d..4480e34c96 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb-items/breadcrumb-items.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb-items/breadcrumb-items.component.html @@ -1,9 +1,9 @@ -@if (items.length) { +@if (items().length) {