From 967735039c3e2214f1506dfde84c94614e4bb866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 14 Oct 2025 15:29:55 +0300 Subject: [PATCH 01/10] Create workflow to auto-add SEO descriptions This workflow automatically adds SEO descriptions to modified markdown files in the 'docs/en/' directory when a pull request is merged. It checks for existing descriptions, generates new ones using OpenAI, and commits the updates in a new branch. --- .github/workflows/auto-add-seo.yml | 359 +++++++++++++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 .github/workflows/auto-add-seo.yml diff --git a/.github/workflows/auto-add-seo.yml b/.github/workflows/auto-add-seo.yml new file mode 100644 index 0000000000..ba10e6ac59 --- /dev/null +++ b/.github/workflows/auto-add-seo.yml @@ -0,0 +1,359 @@ +name: Auto Add SEO Descriptions + +on: + pull_request: + paths: + - 'docs/en/**/*.md' + branches: + - 'rel-*' + - 'dev' + types: [closed] + +jobs: + add-seo-descriptions: + if: | + github.event.pull_request.merged == true && + !startsWith(github.event.pull_request.head.ref, 'auto-seo/') + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.merge_commit_sha }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + pip install openai + + - name: Create new branch for SEO updates + run: | + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + + # Checkout base branch first + git checkout ${{ github.event.pull_request.base.ref }} + + # Create new branch from base + BRANCH_NAME="auto-seo/${{ github.event.pull_request.number }}" + git checkout -b $BRANCH_NAME + echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV + + - name: Get changed markdown files from merged PR + id: changed-files + run: | + # Get files changed in the merged PR (only Added and Modified, exclude Deleted) + FILES=$(git diff --name-only --diff-filter=AM ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.merge_commit_sha }} | grep 'docs/en/.*\.md$' || true) + + echo "Files changed in the merged PR (added/modified only):" + echo "$FILES" + echo "" + + echo "changed_files<> $GITHUB_OUTPUT + echo "$FILES" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + if [ -z "$FILES" ]; then + echo "has_files=false" >> $GITHUB_OUTPUT + echo "No markdown files changed in docs/en/" + else + echo "has_files=true" >> $GITHUB_OUTPUT + + # Checkout the changed files from merge commit to get the merged content + echo "" + echo "Checking out changed files from merge commit..." + while IFS= read -r file; do + if [ -n "$file" ]; then + echo " Checking out: $file" + # Create directory if it doesn't exist + mkdir -p "$(dirname "$file")" + # Checkout the file from merge commit + git show "${{ github.event.pull_request.merge_commit_sha }}:$file" > "$file" 2>/dev/null || echo " Warning: Could not checkout $file" + fi + done <<< "$FILES" + + echo "" + echo "Files now in working directory:" + git status --short + fi + + - name: Process changed files and add SEO descriptions + if: steps.changed-files.outputs.has_files == 'true' + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + run: | + python3 << 'PYTHON_SCRIPT' + import os + import sys + import re + from openai import OpenAI + + client = OpenAI(api_key=os.environ['OPENAI_API_KEY']) + + def has_seo_description(content): + """Check if content already has SEO description""" + return content.strip().startswith('```json') and '//[doc-seo]' in content + + def is_content_too_short(content): + """Check if content is less than 200 characters""" + # Remove SEO tags if present for accurate count + clean_content = content + if '//[doc-seo]' in clean_content: + parts = clean_content.split('```', 2) + if len(parts) > 2: + clean_content = parts[2].strip() + + return len(clean_content.strip()) < 200 + + def get_content_preview(content, max_length=1000): + """Get preview of content for OpenAI""" + # Remove existing SEO tags if present + clean_content = content + if '//[doc-seo]' in clean_content: + parts = clean_content.split('```', 2) + if len(parts) > 2: + clean_content = parts[2].strip() + + return clean_content[:max_length].strip() + + def generate_description(content, filename): + """Generate SEO description using OpenAI with system prompt from OpenAIService.cs""" + try: + preview = get_content_preview(content) + + response = client.chat.completions.create( + model="gpt-4o-mini", + messages=[ + {"role": "system", "content": """Create a short and engaging summary (1–2 sentences) for sharing this documentation link on Discord, LinkedIn, Reddit, Twitter and Facebook. Clearly describe what the page explains or teaches. + Highlight the value for developers using ABP Framework. + Be written in a friendly and professional tone. + Stay under 200 characters. + --> https://abp.io/docs/latest <--"""}, + {"role": "user", "content": f"""Generate a concise, informative meta description for this documentation page. + + File: {filename} + Content Preview: + {preview} + + Requirements: + - Maximum 200 characters + + Generate only the description text, nothing else:"""} + ], + max_tokens=150, + temperature=0.7 + ) + + description = response.choices[0].message.content.strip() + + # Ensure max length + if len(description) > 200: + description = description[:197] + "..." + + return description + except Exception as e: + print(f"āŒ Error generating description: {e}") + return f"Learn about {os.path.splitext(filename)[0]} in ABP Framework documentation." + + def add_seo_description(content, description): + """Add SEO description to content""" + # Escape special characters for JSON + escaped_desc = description.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n') + + seo_tag = f'''```json + //[doc-seo] + {{ + "Description": "{escaped_desc}" + }} + ``` + + ''' + return seo_tag + content + + # Ignored folders from appsettings.json + IGNORED_FOLDERS = ['Blog-Posts', 'Community-Articles', '_deleted', '_resources'] + + def is_file_ignored(filepath): + """Check if file is in an ignored folder""" + path_parts = filepath.split('/') + for ignored in IGNORED_FOLDERS: + if ignored in path_parts: + return True + return False + + # Process changed files + changed_files_str = """${{ steps.changed-files.outputs.changed_files }}""" + changed_files = [f.strip() for f in changed_files_str.strip().split('\n') if f.strip()] + processed_count = 0 + skipped_count = 0 + skipped_too_short = 0 + skipped_ignored = 0 + updated_files = [] # Track actually updated files + + print("šŸ¤– Processing changed markdown files...\n") + print(f"🚫 Ignored folders: {', '.join(IGNORED_FOLDERS)}\n") + + for filepath in changed_files: + if not filepath.endswith('.md'): + continue + + # Check if file is in ignored folder + if is_file_ignored(filepath): + print(f"šŸ“„ Processing: {filepath}") + print(f" 🚫 Skipped (ignored folder)\n") + skipped_ignored += 1 + skipped_count += 1 + continue + + print(f"šŸ“„ Processing: {filepath}") + + try: + # Read file + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # Check if content is too short (less than 200 characters) + if is_content_too_short(content): + print(f" ā­ļø Skipped (content less than 200 characters)\n") + skipped_too_short += 1 + skipped_count += 1 + continue + + # Check if already has SEO description + if has_seo_description(content): + print(f" ā­ļø Skipped (already has SEO description)\n") + skipped_count += 1 + continue + + # Generate description + filename = os.path.basename(filepath) + print(f" šŸ¤– Generating description...") + description = generate_description(content, filename) + print(f" šŸ’” Generated: {description}") + + # Add SEO tag + updated_content = add_seo_description(content, description) + + # Write back + with open(filepath, 'w', encoding='utf-8') as f: + f.write(updated_content) + + print(f" āœ… Updated successfully\n") + processed_count += 1 + updated_files.append(filepath) # Track this file as updated + + except Exception as e: + print(f" āŒ Error: {e}\n") + + print(f"\nšŸ“Š Summary:") + print(f" āœ… Updated: {processed_count}") + print(f" ā­ļø Skipped (total): {skipped_count}") + print(f" ā­ļø Skipped (too short): {skipped_too_short}") + print(f" 🚫 Skipped (ignored folder): {skipped_ignored}") + + # Save counts and updated files list for next step + with open('/tmp/seo_stats.txt', 'w') as f: + f.write(f"{processed_count}\n{skipped_count}\n{skipped_too_short}\n{skipped_ignored}") + + # Save updated files list + with open('/tmp/seo_updated_files.txt', 'w') as f: + f.write('\n'.join(updated_files)) + + PYTHON_SCRIPT + + + - name: Commit and push changes + if: steps.changed-files.outputs.has_files == 'true' + run: | + git add -A docs/en/ + + if git diff --staged --quiet; then + echo "No changes to commit" + echo "has_commits=false" >> $GITHUB_ENV + else + git commit -m "docs: Add SEO descriptions to modified documentation files" -m "Related to PR #${{ github.event.pull_request.number }}" + git push origin ${{ env.BRANCH_NAME }} + echo "has_commits=true" >> $GITHUB_ENV + fi + + - name: Create Pull Request + if: env.has_commits == 'true' + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const stats = fs.readFileSync('/tmp/seo_stats.txt', 'utf8').split('\n'); + const processedCount = parseInt(stats[0]) || 0; + const skippedCount = parseInt(stats[1]) || 0; + const skippedTooShort = parseInt(stats[2]) || 0; + const skippedIgnored = parseInt(stats[3]) || 0; + const prNumber = ${{ github.event.pull_request.number }}; + const baseRef = '${{ github.event.pull_request.base.ref }}'; + const branchName = '${{ env.BRANCH_NAME }}'; + + if (processedCount > 0) { + // Read the actually updated files list (not all changed files) + const updatedFilesStr = fs.readFileSync('/tmp/seo_updated_files.txt', 'utf8'); + const updatedFiles = updatedFilesStr.trim().split('\n').filter(f => f.trim()); + + let prBody = 'šŸ¤– **Automated SEO Descriptions**\n\n'; + prBody += `This PR automatically adds SEO descriptions to documentation files that were modified in PR #${prNumber}.\n\n`; + prBody += '## šŸ“Š Summary\n'; + prBody += `- āœ… **Updated:** ${processedCount} file(s)\n`; + prBody += `- ā­ļø **Skipped (total):** ${skippedCount} file(s)\n`; + if (skippedTooShort > 0) { + prBody += ` - ā­ļø Content < 200 chars: ${skippedTooShort} file(s)\n`; + } + if (skippedIgnored > 0) { + prBody += ` - 🚫 Ignored folders: ${skippedIgnored} file(s)\n`; + } + prBody += '\n## šŸ“ Modified Files\n'; + prBody += updatedFiles.slice(0, 20).map(f => `- \`${f}\``).join('\n'); + if (updatedFiles.length > 20) { + prBody += `\n- ... and ${updatedFiles.length - 20} more`; + } + prBody += '\n\n## šŸ”§ Details\n'; + prBody += `- **Related PR:** #${prNumber}\n\n`; + prBody += 'These descriptions were automatically generated to improve SEO and search engine visibility. šŸš€'; + + const { data: pr } = await github.rest.pulls.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: `docs: Add SEO descriptions (from PR ${prNumber})`, + head: branchName, + base: baseRef, + body: prBody + }); + + console.log(`āœ… Created PR: ${pr.html_url}`); + + // Add reviewers to the PR + const reviewers = ['maliming']; //GitHub usernames + if (reviewers.length === 0) { + console.log('āš ļø No reviewers specified.'); + return; + } + try { + await github.rest.pulls.requestReviewers({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pr.number, + reviewers: reviewers, + team_reviewers: [] + }); + console.log(`āœ… Added reviewers to PR ${pr.number}`); + } catch (error) { + console.log(`āš ļø Could not add reviewers: ${error.message}`); + } + } + From e419163f337bc8f52bfd12a048fc2231099f1f91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 14 Oct 2025 15:58:27 +0300 Subject: [PATCH 02/10] Rename branch and update SEO description limits --- .github/workflows/auto-add-seo.yml | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/workflows/auto-add-seo.yml b/.github/workflows/auto-add-seo.yml index ba10e6ac59..97edec5e76 100644 --- a/.github/workflows/auto-add-seo.yml +++ b/.github/workflows/auto-add-seo.yml @@ -13,7 +13,7 @@ jobs: add-seo-descriptions: if: | github.event.pull_request.merged == true && - !startsWith(github.event.pull_request.head.ref, 'auto-seo/') + !startsWith(github.event.pull_request.head.ref, 'auto-docs-seo/') runs-on: ubuntu-latest permissions: contents: write @@ -45,7 +45,7 @@ jobs: git checkout ${{ github.event.pull_request.base.ref }} # Create new branch from base - BRANCH_NAME="auto-seo/${{ github.event.pull_request.number }}" + BRANCH_NAME="auto-docs-seo/${{ github.event.pull_request.number }}" git checkout -b $BRANCH_NAME echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV @@ -91,6 +91,7 @@ jobs: if: steps.changed-files.outputs.has_files == 'true' env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + IGNORED_FOLDERS: ${{ vars.DOCS_SEO_IGNORED_FOLDERS }} run: | python3 << 'PYTHON_SCRIPT' import os @@ -137,7 +138,7 @@ jobs: {"role": "system", "content": """Create a short and engaging summary (1–2 sentences) for sharing this documentation link on Discord, LinkedIn, Reddit, Twitter and Facebook. Clearly describe what the page explains or teaches. Highlight the value for developers using ABP Framework. Be written in a friendly and professional tone. - Stay under 200 characters. + Stay under 150 characters. --> https://abp.io/docs/latest <--"""}, {"role": "user", "content": f"""Generate a concise, informative meta description for this documentation page. @@ -146,7 +147,7 @@ jobs: {preview} Requirements: - - Maximum 200 characters + - Maximum 150 characters Generate only the description text, nothing else:"""} ], @@ -156,10 +157,6 @@ jobs: description = response.choices[0].message.content.strip() - # Ensure max length - if len(description) > 200: - description = description[:197] + "..." - return description except Exception as e: print(f"āŒ Error generating description: {e}") @@ -180,8 +177,9 @@ jobs: ''' return seo_tag + content - # Ignored folders from appsettings.json - IGNORED_FOLDERS = ['Blog-Posts', 'Community-Articles', '_deleted', '_resources'] + # Ignored folders from GitHub variable (or default values) + IGNORED_FOLDERS_STR = os.environ.get('IGNORED_FOLDERS', 'Blog-Posts,Community-Articles,_deleted,_resources') + IGNORED_FOLDERS = [folder.strip() for folder in IGNORED_FOLDERS_STR.split(',') if folder.strip()] def is_file_ignored(filepath): """Check if file is in an ignored folder""" @@ -337,12 +335,15 @@ jobs: console.log(`āœ… Created PR: ${pr.html_url}`); - // Add reviewers to the PR - const reviewers = ['maliming']; //GitHub usernames + // Add reviewers to the PR (from GitHub variable) + const reviewersStr = '${{ vars.DOCS_SEO_REVIEWERS || '' }}'; + const reviewers = reviewersStr.split(',').map(r => r.trim()).filter(r => r); + if (reviewers.length === 0) { - console.log('āš ļø No reviewers specified.'); + console.log('āš ļø No reviewers specified in DOCS_SEO_REVIEWERS variable.'); return; } + try { await github.rest.pulls.requestReviewers({ owner: context.repo.owner, @@ -351,7 +352,7 @@ jobs: reviewers: reviewers, team_reviewers: [] }); - console.log(`āœ… Added reviewers to PR ${pr.number}`); + console.log(`āœ… Added reviewers (${reviewers.join(', ')}) to PR ${pr.number}`); } catch (error) { console.log(`āš ļø Could not add reviewers: ${error.message}`); } From 0bea592b77e9f3f2ae6998b80f76588328e1ceb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 14 Oct 2025 16:28:49 +0300 Subject: [PATCH 03/10] Refactor SEO description script to standalone Python file Moved the SEO description generation logic from an inline script in the GitHub Actions workflow to a dedicated Python script at .github/scripts/add_seo_descriptions.py. Updated the workflow to call this script directly, improving maintainability and readability. --- .github/scripts/add_seo_descriptions.py | 178 ++++++++++++++++++++++++ .github/workflows/auto-add-seo.yml | 177 +---------------------- 2 files changed, 180 insertions(+), 175 deletions(-) create mode 100644 .github/scripts/add_seo_descriptions.py diff --git a/.github/scripts/add_seo_descriptions.py b/.github/scripts/add_seo_descriptions.py new file mode 100644 index 0000000000..08ef581965 --- /dev/null +++ b/.github/scripts/add_seo_descriptions.py @@ -0,0 +1,178 @@ +import os +import sys +import re +from openai import OpenAI + +client = OpenAI(api_key=os.environ['OPENAI_API_KEY']) + +def has_seo_description(content): + """Check if content already has SEO description""" + # Match SEO description block with 3 or more backticks + pattern = r'```+json\s*//\[doc-seo\].*?```+' + return re.search(pattern, content, flags=re.DOTALL) is not None + +def is_content_too_short(content): + """Check if content is less than 200 characters""" + # Remove SEO tags if present for accurate count + # Match SEO description block with 3 or more backticks + clean_content = re.sub(r'```+json\s*//\[doc-seo\].*?```+\s*', '', content, flags=re.DOTALL) + + return len(clean_content.strip()) < 200 + +def get_content_preview(content, max_length=1000): + """Get preview of content for OpenAI""" + # Remove existing SEO tags if present + # Match SEO description block with 3 or more backticks + clean_content = re.sub(r'```+json\s*//\[doc-seo\].*?```+\s*', '', content, flags=re.DOTALL) + + return clean_content[:max_length].strip() + +def generate_description(content, filename): + """Generate SEO description using OpenAI with system prompt from OpenAIService.cs""" + try: + preview = get_content_preview(content) + + response = client.chat.completions.create( + model="gpt-4o-mini", + messages=[ + {"role": "system", "content": """Create a short and engaging summary (1–2 sentences) for sharing this documentation link on Discord, LinkedIn, Reddit, Twitter and Facebook. Clearly describe what the page explains or teaches. +Highlight the value for developers using ABP Framework. +Be written in a friendly and professional tone. +Stay under 150 characters. +--> https://abp.io/docs/latest <--"""}, + {"role": "user", "content": f"""Generate a concise, informative meta description for this documentation page. + +File: {filename} +Content Preview: +{preview} + +Requirements: +- Maximum 150 characters + +Generate only the description text, nothing else:"""} + ], + max_tokens=150, + temperature=0.7 + ) + + description = response.choices[0].message.content.strip() + + return description + except Exception as e: + print(f"āŒ Error generating description: {e}") + return f"Learn about {os.path.splitext(filename)[0]} in ABP Framework documentation." + +def add_seo_description(content, description): + """Add SEO description to content""" + # Escape special characters for JSON + escaped_desc = description.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n') + + seo_tag = f'''```json +//[doc-seo] +{{ + "Description": "{escaped_desc}" +}} +``` + +''' + return seo_tag + content + +def is_file_ignored(filepath, ignored_folders): + """Check if file is in an ignored folder""" + path_parts = filepath.split('/') + for ignored in ignored_folders: + if ignored in path_parts: + return True + return False + +def main(): + # Ignored folders from GitHub variable (or default values) + IGNORED_FOLDERS_STR = os.environ.get('IGNORED_FOLDERS', 'Blog-Posts,Community-Articles,_deleted,_resources') + IGNORED_FOLDERS = [folder.strip() for folder in IGNORED_FOLDERS_STR.split(',') if folder.strip()] + + # Get changed files from environment or command line + if len(sys.argv) > 1: + # Files passed as command line arguments + changed_files = sys.argv[1:] + else: + # Files from environment variable (for GitHub Actions) + changed_files_str = os.environ.get('CHANGED_FILES', '') + changed_files = [f.strip() for f in changed_files_str.strip().split('\n') if f.strip()] + + processed_count = 0 + skipped_count = 0 + skipped_too_short = 0 + skipped_ignored = 0 + updated_files = [] # Track actually updated files + + print("šŸ¤– Processing changed markdown files...\n") + print(f"🚫 Ignored folders: {', '.join(IGNORED_FOLDERS)}\n") + + for filepath in changed_files: + if not filepath.endswith('.md'): + continue + + # Check if file is in ignored folder + if is_file_ignored(filepath, IGNORED_FOLDERS): + print(f"šŸ“„ Processing: {filepath}") + print(f" 🚫 Skipped (ignored folder)\n") + skipped_ignored += 1 + skipped_count += 1 + continue + + print(f"šŸ“„ Processing: {filepath}") + + try: + # Read file + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # Check if content is too short (less than 200 characters) + if is_content_too_short(content): + print(f" ā­ļø Skipped (content less than 200 characters)\n") + skipped_too_short += 1 + skipped_count += 1 + continue + + # Check if already has SEO description + if has_seo_description(content): + print(f" ā­ļø Skipped (already has SEO description)\n") + skipped_count += 1 + continue + + # Generate description + filename = os.path.basename(filepath) + print(f" šŸ¤– Generating description...") + description = generate_description(content, filename) + print(f" šŸ’” Generated: {description}") + + # Add SEO tag + updated_content = add_seo_description(content, description) + + # Write back + with open(filepath, 'w', encoding='utf-8') as f: + f.write(updated_content) + + print(f" āœ… Updated successfully\n") + processed_count += 1 + updated_files.append(filepath) # Track this file as updated + + except Exception as e: + print(f" āŒ Error: {e}\n") + + print(f"\nšŸ“Š Summary:") + print(f" āœ… Updated: {processed_count}") + print(f" ā­ļø Skipped (total): {skipped_count}") + print(f" ā­ļø Skipped (too short): {skipped_too_short}") + print(f" 🚫 Skipped (ignored folder): {skipped_ignored}") + + # Save counts and updated files list for next step + with open('/tmp/seo_stats.txt', 'w') as f: + f.write(f"{processed_count}\n{skipped_count}\n{skipped_too_short}\n{skipped_ignored}") + + # Save updated files list + with open('/tmp/seo_updated_files.txt', 'w') as f: + f.write('\n'.join(updated_files)) + +if __name__ == '__main__': + main() diff --git a/.github/workflows/auto-add-seo.yml b/.github/workflows/auto-add-seo.yml index 97edec5e76..8440585151 100644 --- a/.github/workflows/auto-add-seo.yml +++ b/.github/workflows/auto-add-seo.yml @@ -92,182 +92,9 @@ jobs: env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} IGNORED_FOLDERS: ${{ vars.DOCS_SEO_IGNORED_FOLDERS }} + CHANGED_FILES: ${{ steps.changed-files.outputs.changed_files }} run: | - python3 << 'PYTHON_SCRIPT' - import os - import sys - import re - from openai import OpenAI - - client = OpenAI(api_key=os.environ['OPENAI_API_KEY']) - - def has_seo_description(content): - """Check if content already has SEO description""" - return content.strip().startswith('```json') and '//[doc-seo]' in content - - def is_content_too_short(content): - """Check if content is less than 200 characters""" - # Remove SEO tags if present for accurate count - clean_content = content - if '//[doc-seo]' in clean_content: - parts = clean_content.split('```', 2) - if len(parts) > 2: - clean_content = parts[2].strip() - - return len(clean_content.strip()) < 200 - - def get_content_preview(content, max_length=1000): - """Get preview of content for OpenAI""" - # Remove existing SEO tags if present - clean_content = content - if '//[doc-seo]' in clean_content: - parts = clean_content.split('```', 2) - if len(parts) > 2: - clean_content = parts[2].strip() - - return clean_content[:max_length].strip() - - def generate_description(content, filename): - """Generate SEO description using OpenAI with system prompt from OpenAIService.cs""" - try: - preview = get_content_preview(content) - - response = client.chat.completions.create( - model="gpt-4o-mini", - messages=[ - {"role": "system", "content": """Create a short and engaging summary (1–2 sentences) for sharing this documentation link on Discord, LinkedIn, Reddit, Twitter and Facebook. Clearly describe what the page explains or teaches. - Highlight the value for developers using ABP Framework. - Be written in a friendly and professional tone. - Stay under 150 characters. - --> https://abp.io/docs/latest <--"""}, - {"role": "user", "content": f"""Generate a concise, informative meta description for this documentation page. - - File: {filename} - Content Preview: - {preview} - - Requirements: - - Maximum 150 characters - - Generate only the description text, nothing else:"""} - ], - max_tokens=150, - temperature=0.7 - ) - - description = response.choices[0].message.content.strip() - - return description - except Exception as e: - print(f"āŒ Error generating description: {e}") - return f"Learn about {os.path.splitext(filename)[0]} in ABP Framework documentation." - - def add_seo_description(content, description): - """Add SEO description to content""" - # Escape special characters for JSON - escaped_desc = description.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n') - - seo_tag = f'''```json - //[doc-seo] - {{ - "Description": "{escaped_desc}" - }} - ``` - - ''' - return seo_tag + content - - # Ignored folders from GitHub variable (or default values) - IGNORED_FOLDERS_STR = os.environ.get('IGNORED_FOLDERS', 'Blog-Posts,Community-Articles,_deleted,_resources') - IGNORED_FOLDERS = [folder.strip() for folder in IGNORED_FOLDERS_STR.split(',') if folder.strip()] - - def is_file_ignored(filepath): - """Check if file is in an ignored folder""" - path_parts = filepath.split('/') - for ignored in IGNORED_FOLDERS: - if ignored in path_parts: - return True - return False - - # Process changed files - changed_files_str = """${{ steps.changed-files.outputs.changed_files }}""" - changed_files = [f.strip() for f in changed_files_str.strip().split('\n') if f.strip()] - processed_count = 0 - skipped_count = 0 - skipped_too_short = 0 - skipped_ignored = 0 - updated_files = [] # Track actually updated files - - print("šŸ¤– Processing changed markdown files...\n") - print(f"🚫 Ignored folders: {', '.join(IGNORED_FOLDERS)}\n") - - for filepath in changed_files: - if not filepath.endswith('.md'): - continue - - # Check if file is in ignored folder - if is_file_ignored(filepath): - print(f"šŸ“„ Processing: {filepath}") - print(f" 🚫 Skipped (ignored folder)\n") - skipped_ignored += 1 - skipped_count += 1 - continue - - print(f"šŸ“„ Processing: {filepath}") - - try: - # Read file - with open(filepath, 'r', encoding='utf-8') as f: - content = f.read() - - # Check if content is too short (less than 200 characters) - if is_content_too_short(content): - print(f" ā­ļø Skipped (content less than 200 characters)\n") - skipped_too_short += 1 - skipped_count += 1 - continue - - # Check if already has SEO description - if has_seo_description(content): - print(f" ā­ļø Skipped (already has SEO description)\n") - skipped_count += 1 - continue - - # Generate description - filename = os.path.basename(filepath) - print(f" šŸ¤– Generating description...") - description = generate_description(content, filename) - print(f" šŸ’” Generated: {description}") - - # Add SEO tag - updated_content = add_seo_description(content, description) - - # Write back - with open(filepath, 'w', encoding='utf-8') as f: - f.write(updated_content) - - print(f" āœ… Updated successfully\n") - processed_count += 1 - updated_files.append(filepath) # Track this file as updated - - except Exception as e: - print(f" āŒ Error: {e}\n") - - print(f"\nšŸ“Š Summary:") - print(f" āœ… Updated: {processed_count}") - print(f" ā­ļø Skipped (total): {skipped_count}") - print(f" ā­ļø Skipped (too short): {skipped_too_short}") - print(f" 🚫 Skipped (ignored folder): {skipped_ignored}") - - # Save counts and updated files list for next step - with open('/tmp/seo_stats.txt', 'w') as f: - f.write(f"{processed_count}\n{skipped_count}\n{skipped_too_short}\n{skipped_ignored}") - - # Save updated files list - with open('/tmp/seo_updated_files.txt', 'w') as f: - f.write('\n'.join(updated_files)) - - PYTHON_SCRIPT + python3 .github/scripts/add_seo_descriptions.py - name: Commit and push changes From fec0ee858a06f428516ff6545c31d7df06d8acbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 14 Oct 2025 16:44:22 +0300 Subject: [PATCH 04/10] Improve SEO description handling in script Enhanced the detection and updating of SEO description blocks in add_seo_descriptions.py. The script now checks for the presence and non-emptiness of the Description field, and updates or inserts the SEO block as needed, handling invalid JSON gracefully. --- .github/scripts/add_seo_descriptions.py | 52 +++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/.github/scripts/add_seo_descriptions.py b/.github/scripts/add_seo_descriptions.py index 08ef581965..4475c809bf 100644 --- a/.github/scripts/add_seo_descriptions.py +++ b/.github/scripts/add_seo_descriptions.py @@ -6,10 +6,23 @@ from openai import OpenAI client = OpenAI(api_key=os.environ['OPENAI_API_KEY']) def has_seo_description(content): - """Check if content already has SEO description""" + """Check if content already has SEO description with Description field""" + import json + # Match SEO description block with 3 or more backticks - pattern = r'```+json\s*//\[doc-seo\].*?```+' - return re.search(pattern, content, flags=re.DOTALL) is not None + pattern = r'```+json\s*//\[doc-seo\]\s*(\{.*?\})\s*```+' + match = re.search(pattern, content, flags=re.DOTALL) + + if not match: + return False + + # Check if Description field exists and is not empty + try: + json_str = match.group(1) + seo_data = json.loads(json_str) + return 'Description' in seo_data and seo_data['Description'] + except json.JSONDecodeError: + return False def is_content_too_short(content): """Check if content is less than 200 characters""" @@ -63,10 +76,41 @@ Generate only the description text, nothing else:"""} return f"Learn about {os.path.splitext(filename)[0]} in ABP Framework documentation." def add_seo_description(content, description): - """Add SEO description to content""" + """Add or update SEO description in content""" + import json + # Escape special characters for JSON escaped_desc = description.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n') + # Check if SEO block already exists + pattern = r'(```+)json\s*//\[doc-seo\]\s*(\{.*?\})\s*\1' + match = re.search(pattern, content, flags=re.DOTALL) + + if match: + # SEO block exists, update Description field + backticks = match.group(1) + json_str = match.group(2) + + try: + # Parse existing JSON + seo_data = json.loads(json_str) + # Update Description + seo_data['Description'] = description + # Convert back to formatted JSON + updated_json = json.dumps(seo_data, indent=4, ensure_ascii=False) + + # Replace the old block with updated one + new_block = f'''{backticks}json +//[doc-seo] +{updated_json} +{backticks}''' + + return re.sub(pattern, new_block, content, count=1, flags=re.DOTALL) + except json.JSONDecodeError: + # If JSON is invalid, replace the whole block + pass + + # No existing block or invalid JSON, add new block at the beginning seo_tag = f'''```json //[doc-seo] {{ From b76961e0a20bd59614599aa53d6363035f667679 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 18 Oct 2025 11:05:21 +0800 Subject: [PATCH 05/10] Update template project migrations. --- ...ial.Designer.cs => 20251018030306_Initial.Designer.cs} | 8 ++++---- ...0250717081711_Initial.cs => 20251018030306_Initial.cs} | 2 +- .../Migrations/MyProjectNameDbContextModelSnapshot.cs | 6 +++--- ...ial.Designer.cs => 20251018030505_Initial.Designer.cs} | 8 ++++---- .../Server/Migrations/20251018030505_Initial.cs} | 2 +- .../Migrations/MyProjectNameDbContextModelSnapshot.cs | 6 +++--- ...ial.Designer.cs => 20251018030220_Initial.Designer.cs} | 8 ++++---- ...0250717081619_Initial.cs => 20251018030220_Initial.cs} | 2 +- .../Migrations/MyProjectNameDbContextModelSnapshot.cs | 6 +++--- ...ial.Designer.cs => 20251018030239_Initial.Designer.cs} | 8 ++++---- ...0250717081642_Initial.cs => 20251018030239_Initial.cs} | 2 +- .../Migrations/MyProjectNameDbContextModelSnapshot.cs | 6 +++--- ...ial.Designer.cs => 20251018030326_Initial.Designer.cs} | 8 ++++---- ...0250717081721_Initial.cs => 20251018030326_Initial.cs} | 2 +- .../Migrations/MyProjectNameDbContextModelSnapshot.cs | 6 +++--- ...ial.Designer.cs => 20251018030413_Initial.Designer.cs} | 8 ++++---- .../Migrations/20251018030413_Initial.cs} | 2 +- .../Migrations/AuthServerDbContextModelSnapshot.cs | 6 +++--- ...ial.Designer.cs => 20251018030355_Initial.Designer.cs} | 8 ++++---- ...0250717081744_Initial.cs => 20251018030355_Initial.cs} | 2 +- .../Migrations/UnifiedDbContextModelSnapshot.cs | 6 +++--- ...ial.Designer.cs => 20251018030425_Initial.Designer.cs} | 4 ++-- ...0250717081812_Initial.cs => 20251018030425_Initial.cs} | 0 ...jectNameHttpApiHostMigrationsDbContextModelSnapshot.cs | 2 +- ...ial.Designer.cs => 20251018030439_Initial.Designer.cs} | 8 ++++---- ...0250717081828_Initial.cs => 20251018030439_Initial.cs} | 2 +- .../Migrations/UnifiedDbContextModelSnapshot.cs | 6 +++--- 27 files changed, 67 insertions(+), 67 deletions(-) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/{20250717081711_Initial.Designer.cs => 20251018030306_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/{20250717081711_Initial.cs => 20251018030306_Initial.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/{20250717081855_Initial.Designer.cs => 20251018030505_Initial.Designer.cs} (99%) rename templates/{module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250717081803_Initial.cs => app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/{20250717081619_Initial.Designer.cs => 20251018030220_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/{20250717081619_Initial.cs => 20251018030220_Initial.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/{20250717081642_Initial.Designer.cs => 20251018030239_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/{20250717081642_Initial.cs => 20251018030239_Initial.cs} (99%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/{20250717081721_Initial.Designer.cs => 20251018030326_Initial.Designer.cs} (99%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/{20250717081721_Initial.cs => 20251018030326_Initial.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/{20250717081803_Initial.Designer.cs => 20251018030413_Initial.Designer.cs} (99%) rename templates/{app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250717081855_Initial.cs => module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/{20250717081744_Initial.Designer.cs => 20251018030355_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/{20250717081744_Initial.cs => 20251018030355_Initial.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/{20250717081812_Initial.Designer.cs => 20251018030425_Initial.Designer.cs} (89%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/{20250717081812_Initial.cs => 20251018030425_Initial.cs} (100%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20250717081828_Initial.Designer.cs => 20251018030439_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20250717081828_Initial.cs => 20251018030439_Initial.cs} (99%) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250717081711_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250717081711_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.Designer.cs index db85e2f5d5..464df99845 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250717081711_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20250717081711_Initial")] + [Migration("20251018030306_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -699,8 +699,8 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250717081711_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250717081711_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.cs index ca5e31e7c4..a12bda8536 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250717081711_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.cs @@ -279,7 +279,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations Id = table.Column(type: "uniqueidentifier", nullable: false), SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + DeviceInfo = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), TenantId = table.Column(type: "uniqueidentifier", nullable: true), UserId = table.Column(type: "uniqueidentifier", nullable: false), ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index aa06ad1bbe..fbc22830a6 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -696,8 +696,8 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250717081855_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250717081855_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.Designer.cs index 961580c3c6..fa4835edf9 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250717081855_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20250717081855_Initial")] + [Migration("20251018030505_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -699,8 +699,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250717081803_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250717081803_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.cs index d4990d59a7..dbb195e630 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250717081803_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.cs @@ -279,7 +279,7 @@ namespace MyCompanyName.MyProjectName.Migrations Id = table.Column(type: "uniqueidentifier", nullable: false), SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + DeviceInfo = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), TenantId = table.Column(type: "uniqueidentifier", nullable: true), UserId = table.Column(type: "uniqueidentifier", nullable: false), ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index d216c5d155..55578009e4 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -696,8 +696,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250717081619_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250717081619_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.Designer.cs index c90ff0bb2e..13d2d8db08 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250717081619_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Host.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20250717081619_Initial")] + [Migration("20251018030220_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -699,8 +699,8 @@ namespace MyCompanyName.MyProjectName.Host.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250717081619_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250717081619_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.cs index b08f2c0b80..f99a7def2b 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250717081619_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.cs @@ -279,7 +279,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations Id = table.Column(type: "uniqueidentifier", nullable: false), SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + DeviceInfo = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), TenantId = table.Column(type: "uniqueidentifier", nullable: true), UserId = table.Column(type: "uniqueidentifier", nullable: false), ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs index fffa45164c..9834feb25b 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -696,8 +696,8 @@ namespace MyCompanyName.MyProjectName.Host.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250717081642_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250717081642_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.Designer.cs index 5e5d98d72e..4e2899748f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250717081642_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Mvc.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20250717081642_Initial")] + [Migration("20251018030239_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -699,8 +699,8 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250717081642_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250717081642_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.cs index fa3bbe7aed..4890e38f15 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250717081642_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.cs @@ -279,7 +279,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations Id = table.Column(type: "uniqueidentifier", nullable: false), SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + DeviceInfo = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), TenantId = table.Column(type: "uniqueidentifier", nullable: true), UserId = table.Column(type: "uniqueidentifier", nullable: false), ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs index 5df74a87ff..93ef905cd2 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -696,8 +696,8 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250717081721_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.Designer.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250717081721_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.Designer.cs index 4ee8dc1ff3..d15b011131 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250717081721_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20250717081721_Initial")] + [Migration("20251018030326_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -758,8 +758,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250717081721_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250717081721_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.cs index 579fe19395..1a80428132 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250717081721_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.cs @@ -301,7 +301,7 @@ namespace MyCompanyName.MyProjectName.Migrations Id = table.Column(type: "uniqueidentifier", nullable: false), SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + DeviceInfo = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), TenantId = table.Column(type: "uniqueidentifier", nullable: true), UserId = table.Column(type: "uniqueidentifier", nullable: false), ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs index 51c2b336bc..6e98993158 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -755,8 +755,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250717081803_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250717081803_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.Designer.cs index 0d0867486b..7683184975 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250717081803_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(AuthServerDbContext))] - [Migration("20250717081803_Initial")] + [Migration("20251018030413_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -699,8 +699,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250717081855_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250717081855_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.cs index d4990d59a7..dbb195e630 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250717081855_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.cs @@ -279,7 +279,7 @@ namespace MyCompanyName.MyProjectName.Migrations Id = table.Column(type: "uniqueidentifier", nullable: false), SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + DeviceInfo = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), TenantId = table.Column(type: "uniqueidentifier", nullable: true), UserId = table.Column(type: "uniqueidentifier", nullable: false), ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs index a9dc5b7efa..210845ea27 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -696,8 +696,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250717081744_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250717081744_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.Designer.cs index 956e6e89d1..78b36c2829 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250717081744_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20250717081744_Initial")] + [Migration("20251018030355_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -699,8 +699,8 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250717081744_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250717081744_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.cs index c89e81810c..68406126d4 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250717081744_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.cs @@ -279,7 +279,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations Id = table.Column(type: "uniqueidentifier", nullable: false), SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + DeviceInfo = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), TenantId = table.Column(type: "uniqueidentifier", nullable: true), UserId = table.Column(type: "uniqueidentifier", nullable: false), ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs index f055a4e99b..502a7cb2d5 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -696,8 +696,8 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20250717081812_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251018030425_Initial.Designer.cs similarity index 89% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20250717081812_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251018030425_Initial.Designer.cs index 3cd1db524a..27316ed042 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20250717081812_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251018030425_Initial.Designer.cs @@ -12,7 +12,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameHttpApiHostMigrationsDbContext))] - [Migration("20250717081812_Initial")] + [Migration("20251018030425_Initial")] partial class Initial { /// @@ -21,7 +21,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20250717081812_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251018030425_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20250717081812_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251018030425_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs index 66cac82aa6..ca715e35a7 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs @@ -18,7 +18,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250717081828_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250717081828_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.Designer.cs index 0746c415d6..86eeae428f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250717081828_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20250717081828_Initial")] + [Migration("20251018030439_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -699,8 +699,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250717081828_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250717081828_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.cs index cbe91752d6..4b66431160 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250717081828_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.cs @@ -279,7 +279,7 @@ namespace MyCompanyName.MyProjectName.Migrations Id = table.Column(type: "uniqueidentifier", nullable: false), SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + DeviceInfo = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), TenantId = table.Column(type: "uniqueidentifier", nullable: true), UserId = table.Column(type: "uniqueidentifier", nullable: false), ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 4501348b9c..f40d34b2ac 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("ProductVersion", "10.0.0-rc.2.25502.107") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -696,8 +696,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(64)"); b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") .HasColumnType("nvarchar(max)") From bf12f5bf5ffc16a27fc12edb4d837d283361e44e Mon Sep 17 00:00:00 2001 From: blackWinds <745673576@qq.com> Date: Sun, 19 Oct 2025 20:30:35 +0800 Subject: [PATCH 06/10] Add label and info to AbpRadioInput --- .../TagHelpers/Form/AbpRadioInputTagHelper.cs | 5 + .../Form/AbpRadioInputTagHelperService.cs | 153 ++++++++++++++++-- 2 files changed, 148 insertions(+), 10 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs index 0135d136ba..c97b7c1e69 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs @@ -12,6 +12,11 @@ public class AbpRadioInputTagHelper : AbpTagHelper { private readonly IAbpTagHelperLocalizer _tagHelperLocalizer; - - public AbpRadioInputTagHelperService(IAbpTagHelperLocalizer tagHelperLocalizer) + private readonly IHtmlGenerator _generator; + private readonly HtmlEncoder _encoder; + private readonly IStringLocalizerFactory _stringLocalizerFactory; + private readonly IAbpEnumLocalizer _abpEnumLocalizer; + + public AbpRadioInputTagHelperService( + IAbpTagHelperLocalizer tagHelperLocalizer, + IHtmlGenerator generator, + HtmlEncoder encoder, + IStringLocalizerFactory stringLocalizerFactory, + IAbpEnumLocalizer abpEnumLocalizer) { _tagHelperLocalizer = tagHelperLocalizer; + _generator = generator; + _encoder = encoder; + _stringLocalizerFactory = stringLocalizerFactory; + _abpEnumLocalizer = abpEnumLocalizer; } - public override void Process(TagHelperContext context, TagHelperOutput output) + public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { var selectItems = GetSelectItems(context, output); SetSelectedValue(context, output, selectItems); var order = TagHelper.AspFor.ModelExplorer.GetDisplayOrder(); - var html = GetHtml(context, output, selectItems); + var html = await GetRadioInputGroupAsHtmlAsync(context, output, selectItems); AddGroupToFormGroupContents(context, TagHelper.AspFor.Name, html, order, out var suppress); @@ -44,6 +62,21 @@ public class AbpRadioInputTagHelperService : AbpTagHelperService GetRadioInputGroupAsHtmlAsync(TagHelperContext context, TagHelperOutput output, List selectItems) + { + var radioGroupHtml = GetHtml(context, output, selectItems); + var label = await GetLabelAsHtmlAsync(context, output); + var infoText = GetInfoAsHtml(context, output); + + var tagBuilder = new TagBuilder("div"); + tagBuilder.AddCssClass("mb-3"); + tagBuilder.InnerHtml.AppendHtml(label); + tagBuilder.InnerHtml.AppendHtml(radioGroupHtml); + tagBuilder.InnerHtml.AppendHtml(infoText); + + return tagBuilder.ToHtmlString(); + } + protected virtual string GetHtml(TagHelperContext context, TagHelperOutput output, List selectItems) { var html = new StringBuilder(""); @@ -77,14 +110,92 @@ public class AbpRadioInputTagHelperService : AbpTagHelperService GetLabelAsHtmlAsync(TagHelperContext context, TagHelperOutput output) + { + if (TagHelper.SuppressLabel) + { + return string.Empty; + } + + if (string.IsNullOrEmpty(TagHelper.Label)) + { + return await GetLabelAsHtmlUsingTagHelperAsync(context, output); + } + + var label = new TagBuilder("label"); + label.AddCssClass("form-label"); + label.InnerHtml.AppendHtml(TagHelper.Label); + label.InnerHtml.AppendHtml(GetRequiredSymbol(context, output)); + + return label.ToHtmlString(); + } + + protected virtual async Task GetLabelAsHtmlUsingTagHelperAsync(TagHelperContext context, TagHelperOutput output) + { + var labelTagHelper = new LabelTagHelper(_generator) + { + For = TagHelper.AspFor, + ViewContext = TagHelper.ViewContext, + }; + + var innerOutput = await labelTagHelper.ProcessAndGetOutputAsync( + new TagHelperAttributeList { { "class", "form-label" } }, + context, + "label", + TagMode.StartTagAndEndTag); + + innerOutput.Content.AppendHtml(GetRequiredSymbol(context, output)); + + return innerOutput.Render(_encoder); + } + + protected virtual string GetRequiredSymbol(TagHelperContext context, TagHelperOutput output) + { + var isHaveRequiredAttribute = context.AllAttributes.Any(a => a.Name == "required"); + + return TagHelper.AspFor.ModelExplorer.GetAttribute() != null || isHaveRequiredAttribute + ? " * " + : ""; + } + + protected virtual string GetInfoAsHtml(TagHelperContext context, TagHelperOutput output) + { + var text = string.Empty; + var infoAttribute = TagHelper.AspFor.ModelExplorer.GetAttribute(); + + if (!string.IsNullOrEmpty(TagHelper.InfoText)) + { + text = TagHelper.InfoText!; + } + else if (infoAttribute != null) + { + text = _tagHelperLocalizer.GetLocalizedText(infoAttribute.Text, TagHelper.AspFor.ModelExplorer); + } + else + { + return ""; + } + + var small = new TagBuilder("small"); + small.Attributes.Add("id", TagHelper.AspFor.Name.Replace('.', '_') + "InfoText"); + small.AddCssClass("form-text"); + small.InnerHtml.Append(text); + + return small.ToHtmlString(); } protected virtual List GetSelectItems(TagHelperContext context, TagHelperOutput output) @@ -110,10 +221,32 @@ public class AbpRadioInputTagHelperService : AbpTagHelperService GetSelectItemsFromEnum(TagHelperContext context, TagHelperOutput output, ModelExplorer explorer) { - var localizer = _tagHelperLocalizer.GetLocalizerOrNull(explorer); + var selectItems = new List(); + var isNullableType = Nullable.GetUnderlyingType(explorer.ModelType) != null; + var enumType = explorer.ModelType; + + if (isNullableType) + { + enumType = Nullable.GetUnderlyingType(explorer.ModelType)!; + selectItems.Add(new SelectListItem()); + } + + var containerLocalizer = _tagHelperLocalizer.GetLocalizerOrNull(explorer.Container.ModelType.Assembly); - var selectItems = explorer.Metadata.IsEnum ? explorer.ModelType.GetTypeInfo().GetMembers(BindingFlags.Public | BindingFlags.Static) - .Select((t, i) => new SelectListItem { Value = i.ToString(), Text = GetLocalizedPropertyName(localizer, explorer.ModelType, t.Name) }).ToList() : new List(); + foreach (var enumValue in enumType.GetEnumValuesAsUnderlyingType()) + { + var localizedMemberName = _abpEnumLocalizer.GetString(enumType, enumValue, + new[] + { + containerLocalizer, + _stringLocalizerFactory.CreateDefaultOrNull() + }!); + selectItems.Add(new SelectListItem + { + Value = enumValue.ToString(), + Text = localizedMemberName + }); + } return selectItems; } From cc19a9a8b398477cfc90ef76d7913047a1dc2614 Mon Sep 17 00:00:00 2001 From: Ma Liming Date: Mon, 20 Oct 2025 09:27:15 +0800 Subject: [PATCH 07/10] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/auto-add-seo.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/auto-add-seo.yml b/.github/workflows/auto-add-seo.yml index 8440585151..993196cb86 100644 --- a/.github/workflows/auto-add-seo.yml +++ b/.github/workflows/auto-add-seo.yml @@ -78,7 +78,10 @@ jobs: # Create directory if it doesn't exist mkdir -p "$(dirname "$file")" # Checkout the file from merge commit - git show "${{ github.event.pull_request.merge_commit_sha }}:$file" > "$file" 2>/dev/null || echo " Warning: Could not checkout $file" + if ! git show "${{ github.event.pull_request.merge_commit_sha }}:$file" > "$file" 2>err.log; then + echo " Warning: Could not checkout $file" + echo " Reason: $(cat err.log)" + fi fi done <<< "$FILES" From cf4289bfaf78409b8760e7f32a38b17eb36bc8e0 Mon Sep 17 00:00:00 2001 From: Ma Liming Date: Mon, 20 Oct 2025 09:28:59 +0800 Subject: [PATCH 08/10] Update CLI documentation to test Action --- docs/en/cli/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/cli/index.md b/docs/en/cli/index.md index 0fefe60b62..92b46da56d 100644 --- a/docs/en/cli/index.md +++ b/docs/en/cli/index.md @@ -3,7 +3,7 @@ ABP CLI (Command Line Interface) is a command line tool to perform some common operations for ABP based solutions or ABP Studio features. > With **v8.2+**, the old/legacy ABP CLI has been replaced with a new CLI system to align with the new templating system and [ABP Studio](../studio/index.md). The new ABP CLI commands are explained in this documentation. However, if you want to learn more about the differences between the old and new CLIs, want to learn the reason for the change, or need guidance to use the old ABP CLI, please refer to the [Old vs New CLI](differences-between-old-and-new-cli.md) documentation. -> + > You may need to remove the Old CLI before installing the New CLI, by running the following command: `dotnet tool uninstall -g Volo.Abp.Cli` ## Installation From 0f8a1b2d4ce2a69413f71f934c1a21dbe273e809 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 20 Oct 2025 11:33:20 +0800 Subject: [PATCH 09/10] Remove default value for SuppressLabel property --- .../TagHelpers/Form/AbpRadioInputTagHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs index c97b7c1e69..a9cdd76200 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs @@ -12,7 +12,7 @@ public class AbpRadioInputTagHelper : AbpTagHelper Date: Mon, 20 Oct 2025 14:38:38 +0800 Subject: [PATCH 10/10] Update template project migrations. --- ....cs => 20251020063503_Initial.Designer.cs} | 34 ++++++++++++++++++- ...6_Initial.cs => 20251020063503_Initial.cs} | 23 +++++++++++++ .../MyProjectNameDbContextModelSnapshot.cs | 32 +++++++++++++++++ ....cs => 20251020063648_Initial.Designer.cs} | 34 ++++++++++++++++++- .../Migrations/20251020063648_Initial.cs} | 23 +++++++++++++ .../MyProjectNameDbContextModelSnapshot.cs | 32 +++++++++++++++++ ....cs => 20251020063409_Initial.Designer.cs} | 34 ++++++++++++++++++- ...0_Initial.cs => 20251020063409_Initial.cs} | 23 +++++++++++++ .../MyProjectNameDbContextModelSnapshot.cs | 32 +++++++++++++++++ ....cs => 20251020063438_Initial.Designer.cs} | 34 ++++++++++++++++++- ...9_Initial.cs => 20251020063438_Initial.cs} | 23 +++++++++++++ .../MyProjectNameDbContextModelSnapshot.cs | 32 +++++++++++++++++ ....cs => 20251020063514_Initial.Designer.cs} | 34 ++++++++++++++++++- ...6_Initial.cs => 20251020063514_Initial.cs} | 23 +++++++++++++ .../MyProjectNameDbContextModelSnapshot.cs | 32 +++++++++++++++++ ....cs => 20251020063552_Initial.Designer.cs} | 34 ++++++++++++++++++- .../Migrations/20251020063552_Initial.cs} | 23 +++++++++++++ .../AuthServerDbContextModelSnapshot.cs | 32 +++++++++++++++++ ....cs => 20251020063536_Initial.Designer.cs} | 34 ++++++++++++++++++- ...5_Initial.cs => 20251020063536_Initial.cs} | 23 +++++++++++++ .../UnifiedDbContextModelSnapshot.cs | 32 +++++++++++++++++ ....cs => 20251020063606_Initial.Designer.cs} | 2 +- ...5_Initial.cs => 20251020063606_Initial.cs} | 0 ....cs => 20251020063621_Initial.Designer.cs} | 34 ++++++++++++++++++- ...9_Initial.cs => 20251020063621_Initial.cs} | 23 +++++++++++++ .../UnifiedDbContextModelSnapshot.cs | 32 +++++++++++++++++ 26 files changed, 705 insertions(+), 9 deletions(-) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/{20251018030306_Initial.Designer.cs => 20251020063503_Initial.Designer.cs} (98%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/{20251018030306_Initial.cs => 20251020063503_Initial.cs} (98%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/{20251018030505_Initial.Designer.cs => 20251020063648_Initial.Designer.cs} (98%) rename templates/{module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.cs => app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251020063648_Initial.cs} (98%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/{20251018030220_Initial.Designer.cs => 20251020063409_Initial.Designer.cs} (98%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/{20251018030220_Initial.cs => 20251020063409_Initial.cs} (98%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/{20251018030239_Initial.Designer.cs => 20251020063438_Initial.Designer.cs} (98%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/{20251018030239_Initial.cs => 20251020063438_Initial.cs} (98%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/{20251018030326_Initial.Designer.cs => 20251020063514_Initial.Designer.cs} (98%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/{20251018030326_Initial.cs => 20251020063514_Initial.cs} (98%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/{20251018030413_Initial.Designer.cs => 20251020063552_Initial.Designer.cs} (98%) rename templates/{app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.cs => module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251020063552_Initial.cs} (98%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/{20251018030355_Initial.Designer.cs => 20251020063536_Initial.Designer.cs} (97%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/{20251018030355_Initial.cs => 20251020063536_Initial.cs} (97%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/{20251018030425_Initial.Designer.cs => 20251020063606_Initial.Designer.cs} (96%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/{20251018030425_Initial.cs => 20251020063606_Initial.cs} (100%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20251018030439_Initial.Designer.cs => 20251020063621_Initial.Designer.cs} (97%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20251018030439_Initial.cs => 20251020063621_Initial.cs} (97%) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251020063503_Initial.Designer.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251020063503_Initial.Designer.cs index 464df99845..6a2f32045a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251020063503_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20251018030306_Initial")] + [Migration("20251020063503_Initial")] partial class Initial { /// @@ -1017,6 +1017,27 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1824,6 +1845,15 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1922,6 +1952,8 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251020063503_Initial.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251020063503_Initial.cs index a12bda8536..8538b6a79a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251018030306_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20251020063503_Initial.cs @@ -658,6 +658,26 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "AbpUserPasswordHistories", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + Password = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreatedAt = table.Column(type: "datetimeoffset", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserPasswordHistories", x => new { x.UserId, x.Password }); + table.ForeignKey( + name: "FK_AbpUserPasswordHistories_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpUserRoles", columns: table => new @@ -1099,6 +1119,9 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations migrationBuilder.DropTable( name: "AbpUserOrganizationUnits"); + migrationBuilder.DropTable( + name: "AbpUserPasswordHistories"); + migrationBuilder.DropTable( name: "AbpUserRoles"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index fbc22830a6..1925f69fb3 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -1014,6 +1014,27 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1821,6 +1842,15 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1919,6 +1949,8 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251020063648_Initial.Designer.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251020063648_Initial.Designer.cs index fa4835edf9..209982f8ed 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251020063648_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20251018030505_Initial")] + [Migration("20251020063648_Initial")] partial class Initial { /// @@ -1017,6 +1017,27 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1824,6 +1845,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1922,6 +1952,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251020063648_Initial.cs similarity index 98% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251020063648_Initial.cs index dbb195e630..151f09e4d4 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251020063648_Initial.cs @@ -658,6 +658,26 @@ namespace MyCompanyName.MyProjectName.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "AbpUserPasswordHistories", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + Password = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreatedAt = table.Column(type: "datetimeoffset", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserPasswordHistories", x => new { x.UserId, x.Password }); + table.ForeignKey( + name: "FK_AbpUserPasswordHistories_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpUserRoles", columns: table => new @@ -1099,6 +1119,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpUserOrganizationUnits"); + migrationBuilder.DropTable( + name: "AbpUserPasswordHistories"); + migrationBuilder.DropTable( name: "AbpUserRoles"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index 55578009e4..18f4b1628f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -1014,6 +1014,27 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1821,6 +1842,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1919,6 +1949,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251020063409_Initial.Designer.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251020063409_Initial.Designer.cs index 13d2d8db08..878de122df 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251020063409_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Host.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20251018030220_Initial")] + [Migration("20251020063409_Initial")] partial class Initial { /// @@ -1017,6 +1017,27 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1824,6 +1845,15 @@ namespace MyCompanyName.MyProjectName.Host.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1922,6 +1952,8 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251020063409_Initial.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251020063409_Initial.cs index f99a7def2b..7f20544311 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251018030220_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20251020063409_Initial.cs @@ -658,6 +658,26 @@ namespace MyCompanyName.MyProjectName.Host.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "AbpUserPasswordHistories", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + Password = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreatedAt = table.Column(type: "datetimeoffset", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserPasswordHistories", x => new { x.UserId, x.Password }); + table.ForeignKey( + name: "FK_AbpUserPasswordHistories_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpUserRoles", columns: table => new @@ -1099,6 +1119,9 @@ namespace MyCompanyName.MyProjectName.Host.Migrations migrationBuilder.DropTable( name: "AbpUserOrganizationUnits"); + migrationBuilder.DropTable( + name: "AbpUserPasswordHistories"); + migrationBuilder.DropTable( name: "AbpUserRoles"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs index 9834feb25b..ba0c89a002 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -1014,6 +1014,27 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1821,6 +1842,15 @@ namespace MyCompanyName.MyProjectName.Host.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1919,6 +1949,8 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251020063438_Initial.Designer.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251020063438_Initial.Designer.cs index 4e2899748f..c6d52b6b7b 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251020063438_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Mvc.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20251018030239_Initial")] + [Migration("20251020063438_Initial")] partial class Initial { /// @@ -1017,6 +1017,27 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1824,6 +1845,15 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1922,6 +1952,8 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251020063438_Initial.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251020063438_Initial.cs index 4890e38f15..d8732c6e47 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251018030239_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20251020063438_Initial.cs @@ -658,6 +658,26 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "AbpUserPasswordHistories", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + Password = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreatedAt = table.Column(type: "datetimeoffset", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserPasswordHistories", x => new { x.UserId, x.Password }); + table.ForeignKey( + name: "FK_AbpUserPasswordHistories_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpUserRoles", columns: table => new @@ -1099,6 +1119,9 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations migrationBuilder.DropTable( name: "AbpUserOrganizationUnits"); + migrationBuilder.DropTable( + name: "AbpUserPasswordHistories"); + migrationBuilder.DropTable( name: "AbpUserRoles"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs index 93ef905cd2..707e04eb82 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -1014,6 +1014,27 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1821,6 +1842,15 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1919,6 +1949,8 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251020063514_Initial.Designer.cs similarity index 98% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251020063514_Initial.Designer.cs index d15b011131..873b170642 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251020063514_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20251018030326_Initial")] + [Migration("20251020063514_Initial")] partial class Initial { /// @@ -1074,6 +1074,27 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1879,6 +1900,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1977,6 +2007,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251020063514_Initial.cs similarity index 98% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251020063514_Initial.cs index 1a80428132..c1814d92ad 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251018030326_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20251020063514_Initial.cs @@ -680,6 +680,26 @@ namespace MyCompanyName.MyProjectName.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "AbpUserPasswordHistories", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + Password = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreatedAt = table.Column(type: "datetimeoffset", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserPasswordHistories", x => new { x.UserId, x.Password }); + table.ForeignKey( + name: "FK_AbpUserPasswordHistories_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpUserRoles", columns: table => new @@ -1129,6 +1149,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpUserOrganizationUnits"); + migrationBuilder.DropTable( + name: "AbpUserPasswordHistories"); + migrationBuilder.DropTable( name: "AbpUserRoles"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs index 6e98993158..5487b9443c 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -1071,6 +1071,27 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1876,6 +1897,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1974,6 +2004,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251020063552_Initial.Designer.cs similarity index 98% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251020063552_Initial.Designer.cs index 7683184975..f63ca1375e 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251018030413_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251020063552_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(AuthServerDbContext))] - [Migration("20251018030413_Initial")] + [Migration("20251020063552_Initial")] partial class Initial { /// @@ -1017,6 +1017,27 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1824,6 +1845,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1922,6 +1952,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251020063552_Initial.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251020063552_Initial.cs index dbb195e630..151f09e4d4 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20251018030505_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20251020063552_Initial.cs @@ -658,6 +658,26 @@ namespace MyCompanyName.MyProjectName.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "AbpUserPasswordHistories", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + Password = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreatedAt = table.Column(type: "datetimeoffset", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserPasswordHistories", x => new { x.UserId, x.Password }); + table.ForeignKey( + name: "FK_AbpUserPasswordHistories_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpUserRoles", columns: table => new @@ -1099,6 +1119,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpUserOrganizationUnits"); + migrationBuilder.DropTable( + name: "AbpUserPasswordHistories"); + migrationBuilder.DropTable( name: "AbpUserRoles"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs index 210845ea27..b2310baddb 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs @@ -1014,6 +1014,27 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1821,6 +1842,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1919,6 +1949,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251020063536_Initial.Designer.cs similarity index 97% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251020063536_Initial.Designer.cs index 78b36c2829..8b0df2e0e7 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251020063536_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20251018030355_Initial")] + [Migration("20251020063536_Initial")] partial class Initial { /// @@ -1017,6 +1017,27 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1522,6 +1543,15 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1602,6 +1632,8 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251020063536_Initial.cs similarity index 97% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251020063536_Initial.cs index 68406126d4..40c04ee9fd 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251018030355_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20251020063536_Initial.cs @@ -594,6 +594,26 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "AbpUserPasswordHistories", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + Password = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreatedAt = table.Column(type: "datetimeoffset", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserPasswordHistories", x => new { x.UserId, x.Password }); + table.ForeignKey( + name: "FK_AbpUserPasswordHistories_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpUserRoles", columns: table => new @@ -946,6 +966,9 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations migrationBuilder.DropTable( name: "AbpUserOrganizationUnits"); + migrationBuilder.DropTable( + name: "AbpUserPasswordHistories"); + migrationBuilder.DropTable( name: "AbpUserRoles"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs index 502a7cb2d5..20e84ae02d 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs @@ -1014,6 +1014,27 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1519,6 +1540,15 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1599,6 +1629,8 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251018030425_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251020063606_Initial.Designer.cs similarity index 96% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251018030425_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251020063606_Initial.Designer.cs index 27316ed042..785cfc71f1 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251018030425_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251020063606_Initial.Designer.cs @@ -12,7 +12,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameHttpApiHostMigrationsDbContext))] - [Migration("20251018030425_Initial")] + [Migration("20251020063606_Initial")] partial class Initial { /// diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251018030425_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251020063606_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251018030425_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20251020063606_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251020063621_Initial.Designer.cs similarity index 97% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251020063621_Initial.Designer.cs index 86eeae428f..fff4371d14 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251020063621_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20251018030439_Initial")] + [Migration("20251020063621_Initial")] partial class Initial { /// @@ -1017,6 +1017,27 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1522,6 +1543,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1602,6 +1632,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251020063621_Initial.cs similarity index 97% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251020063621_Initial.cs index 4b66431160..3cd4785ff9 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251018030439_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20251020063621_Initial.cs @@ -594,6 +594,26 @@ namespace MyCompanyName.MyProjectName.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "AbpUserPasswordHistories", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + Password = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreatedAt = table.Column(type: "datetimeoffset", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserPasswordHistories", x => new { x.UserId, x.Password }); + table.ForeignKey( + name: "FK_AbpUserPasswordHistories_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpUserRoles", columns: table => new @@ -946,6 +966,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpUserOrganizationUnits"); + migrationBuilder.DropTable( + name: "AbpUserPasswordHistories"); + migrationBuilder.DropTable( name: "AbpUserRoles"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index f40d34b2ac..b865427000 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -1014,6 +1014,27 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserOrganizationUnits", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.Property("UserId") @@ -1519,6 +1540,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => { b.HasOne("Volo.Abp.Identity.IdentityRole", null) @@ -1599,6 +1629,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Navigation("OrganizationUnits"); + b.Navigation("PasswordHistories"); + b.Navigation("Roles"); b.Navigation("Tokens");