diff --git a/.github/.markdownlint.json b/.github/.markdownlint.json new file mode 100644 index 0000000..1dd8622 --- /dev/null +++ b/.github/.markdownlint.json @@ -0,0 +1,6 @@ +{ + "default": true, + "MD013": false, + "MD033": false, + "MD041": false +} diff --git a/.github/scripts/update_markdown_dates.py b/.github/scripts/update_markdown_dates.py new file mode 100644 index 0000000..d5d5b3f --- /dev/null +++ b/.github/scripts/update_markdown_dates.py @@ -0,0 +1,63 @@ +from __future__ import annotations + +import os +import re +import subprocess +from datetime import datetime, timezone +from pathlib import Path + +DATE_PATTERN = re.compile(r"^Last updated: \d{4}-\d{2}-\d{2}$", re.MULTILINE) +CURRENT_DATE = datetime.now(timezone.utc).strftime("%Y-%m-%d") +REPO_ROOT = Path(__file__).resolve().parents[2] + + +def run_git(*args: str) -> str: + result = subprocess.run( + ["git", *args], + cwd=REPO_ROOT, + check=True, + capture_output=True, + text=True, + ) + return result.stdout.strip() + + +def changed_markdown_files() -> list[Path]: + base_ref = os.environ.get("PR_BASE_REF", "main") + diff_output = run_git("diff", "--name-only", f"origin/{base_ref}...HEAD", "--", "*.md") + files = [] + for relative_path in diff_output.splitlines(): + path = REPO_ROOT / relative_path + if path.is_file(): + files.append(path) + return files + + +def update_file(path: Path) -> bool: + content = path.read_text(encoding="utf-8") + updated_content, count = DATE_PATTERN.subn(f"Last updated: {CURRENT_DATE}", content, count=1) + if count == 0 or updated_content == content: + return False + path.write_text(updated_content, encoding="utf-8") + return True + + +def main() -> int: + files = changed_markdown_files() + if not files: + print("No changed Markdown files detected.") + return 0 + + updated_any = False + for path in files: + if update_file(path): + print(f"Updated {path.relative_to(REPO_ROOT)}") + updated_any = True + + if not updated_any: + print("No Last updated lines needed changes.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.github/scripts/update_visitor_counter.js b/.github/scripts/update_visitor_counter.js new file mode 100644 index 0000000..8f15f57 --- /dev/null +++ b/.github/scripts/update_visitor_counter.js @@ -0,0 +1,132 @@ +const fs = require('fs'); +const path = require('path'); +const https = require('https'); + +const repoRoot = path.resolve(__dirname, '..', '..'); +const metricsPath = path.join(repoRoot, 'metrics.json'); +const refreshDate = new Date().toISOString().slice(0, 10); +const repo = process.env.REPO; +const token = process.env.TRAFFIC_TOKEN; +const markerPattern = /[\s\S]*?/g; + +function readMetrics() { + if (!fs.existsSync(metricsPath)) { + return { totalViews: 0, refreshDate }; + } + + try { + return JSON.parse(fs.readFileSync(metricsPath, 'utf8')); + } catch { + return { totalViews: 0, refreshDate }; + } +} + +function writeMetrics(metrics) { + fs.writeFileSync(metricsPath, `${JSON.stringify(metrics, null, 2)}\n`, 'utf8'); +} + +function fetchTrafficViews() { + if (!repo || !token) { + return Promise.resolve(null); + } + + return new Promise((resolve) => { + const request = https.request( + { + hostname: 'api.github.com', + path: `/repos/${repo}/traffic/views`, + method: 'GET', + headers: { + 'User-Agent': 'Cloud2BR-visitor-counter', + Accept: 'application/vnd.github+json', + Authorization: `Bearer ${token}`, + }, + }, + (response) => { + let data = ''; + response.on('data', (chunk) => { + data += chunk; + }); + response.on('end', () => { + if (response.statusCode !== 200) { + console.warn(`GitHub traffic API returned ${response.statusCode}.`); + resolve(null); + return; + } + + try { + const parsed = JSON.parse(data); + resolve(typeof parsed.count === 'number' ? parsed.count : null); + } catch { + resolve(null); + } + }); + } + ); + + request.on('error', () => resolve(null)); + request.end(); + }); +} + +function findMarkdownFiles(startDir) { + const results = []; + for (const entry of fs.readdirSync(startDir, { withFileTypes: true })) { + if (entry.name === '.git' || entry.name === 'node_modules') { + continue; + } + + const fullPath = path.join(startDir, entry.name); + if (entry.isDirectory()) { + results.push(...findMarkdownFiles(fullPath)); + continue; + } + + if (entry.isFile() && entry.name.endsWith('.md')) { + results.push(fullPath); + } + } + return results; +} + +function buildBadgeBlock(totalViews) { + return [ + '', + '
', + ` Total views`, + `

Refresh Date: ${refreshDate}

`, + '
', + '', + ].join('\n'); +} + +function updateMarkdownBadges(totalViews) { + const replacement = buildBadgeBlock(totalViews); + for (const filePath of findMarkdownFiles(repoRoot)) { + const content = fs.readFileSync(filePath, 'utf8'); + if (!markerPattern.test(content)) { + markerPattern.lastIndex = 0; + continue; + } + + markerPattern.lastIndex = 0; + const updated = content.replace(markerPattern, replacement); + fs.writeFileSync(filePath, updated, 'utf8'); + } +} + +async function main() { + const currentMetrics = readMetrics(); + const fetchedViews = await fetchTrafficViews(); + const totalViews = fetchedViews ?? currentMetrics.totalViews ?? 0; + const nextMetrics = { totalViews, refreshDate }; + + writeMetrics(nextMetrics); + updateMarkdownBadges(totalViews); + console.log(`Visitor badge refreshed with ${totalViews} total views.`); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/.github/scripts/validate_markdown_header.py b/.github/scripts/validate_markdown_header.py new file mode 100644 index 0000000..7f585e9 --- /dev/null +++ b/.github/scripts/validate_markdown_header.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +import re +import subprocess +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[2] +GITHUB_BADGE = "[![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/)" +ORG_LINK = "[Cloud2BR OSS - Learning Hub](https://github.com/Cloud2BR-MSFTLearningHub)" +DATE_RE = re.compile(r"Last updated: \d{4}-\d{2}-\d{2}") +SEPARATOR_RE = re.compile(r"-{10,}") + + +def tracked_markdown_files() -> list[Path]: + result = subprocess.run( + ["git", "ls-files", "*.md"], + cwd=REPO_ROOT, + check=True, + capture_output=True, + text=True, + ) + return [REPO_ROOT / line for line in result.stdout.splitlines() if line] + + +def validate_file(path: Path) -> list[str]: + lines = path.read_text(encoding="utf-8").splitlines() + errors: list[str] = [] + + if not lines or not lines[0].startswith("# "): + return ["first line must be a markdown title starting with '# '"] + + if len(lines) < 8: + return ["file is too short to contain the required header block"] + + if lines[1] != "": + errors.append("line 2 must be blank") + + location_index = 2 + while location_index < len(lines) and lines[location_index].strip(): + location_index += 1 + + if location_index == 2: + errors.append("location line is missing") + return errors + + if location_index >= len(lines) or lines[location_index] != "": + errors.append("blank line required after location block") + return errors + + header_start = location_index + 1 + expected = [GITHUB_BADGE, ORG_LINK, "", None, "", None] + for offset, expected_line in enumerate(expected): + line_index = header_start + offset + if line_index >= len(lines): + errors.append("header block is incomplete") + return errors + actual = lines[line_index] + if offset == 3: + if not DATE_RE.fullmatch(actual): + errors.append("Last updated line must use YYYY-MM-DD format") + elif offset == 5: + if not SEPARATOR_RE.fullmatch(actual): + errors.append("separator line must contain at least 10 hyphens") + elif actual != expected_line: + errors.append(f"expected '{expected_line}' at line {line_index + 1}") + + return errors + + +def main() -> int: + failures = [] + for path in tracked_markdown_files(): + errors = validate_file(path) + if errors: + failures.append((path.relative_to(REPO_ROOT), errors)) + + if failures: + for path, errors in failures: + print(f"{path}:") + for error in errors: + print(f" - {error}") + return 1 + + print("All tracked Markdown files passed header validation.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.github/workflows/update-md-date.yml b/.github/workflows/update-md-date.yml index 96dc9d7..22957e3 100644 --- a/.github/workflows/update-md-date.yml +++ b/.github/workflows/update-md-date.yml @@ -5,37 +5,61 @@ on: branches: - main +concurrency: + group: pr-branch-maintenance-${{ github.event.pull_request.head.ref || github.ref_name }} + cancel-in-progress: false + permissions: contents: write + pull-requests: write jobs: update-date: runs-on: ubuntu-latest steps: - - name: Checkout repository + - name: Checkout PR branch uses: actions/checkout@v4 with: fetch-depth: 0 + ref: ${{ github.event.pull_request.head.ref }} + + - name: Fetch PR base branch + run: git fetch --no-tags origin ${{ github.event.pull_request.base.ref }} - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: '3.x' - - - name: Install dependencies - run: pip install python-dateutil + python-version: '3.12' - - name: Configure Git + - name: Configure Git run: | git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" - name: Update last modified date in Markdown files - run: python .github/workflows/update_date.py + env: + PR_BASE_REF: ${{ github.event.pull_request.base.ref }} + run: python .github/scripts/update_markdown_dates.py - - name: Commit changes + - name: Pull, commit, and push if needed + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | + BRANCH="${{ github.event.pull_request.head.ref }}" git add -A - git commit -m "Update last modified date in Markdown files" || echo "No changes to commit" - git push origin HEAD:${{ github.event.pull_request.head.ref }} + if git diff --staged --quiet; then + echo "No changes to commit" + exit 0 + fi + git commit -m "Update last modified date in Markdown files" + git remote set-url origin https://x-access-token:${TOKEN}@github.com/${{ github.repository }} + for attempt in 1 2 3; do + git fetch origin "$BRANCH" + git rebase "origin/$BRANCH" + if git push origin HEAD:"$BRANCH"; then + exit 0 + fi + done + echo "Failed to push branch updates after 3 attempts." + exit 1 diff --git a/.github/workflows/update_date.py b/.github/workflows/update_date.py deleted file mode 100644 index ab86df5..0000000 --- a/.github/workflows/update_date.py +++ /dev/null @@ -1,49 +0,0 @@ -import os -import subprocess -from datetime import datetime, timezone - -# Get the list of modified files -result = subprocess.run(['git', 'diff', '--name-only', 'HEAD~1'], stdout=subprocess.PIPE) -modified_files = result.stdout.decode('utf-8').split() - -# Debugging: Print the list of modified files -print("Modified files:", modified_files) - -# Filter for Markdown files -modified_md_files = [f for f in modified_files if f.endswith('.md')] - -# Debugging: Print the list of modified Markdown files -print("Modified Markdown files:", modified_md_files) - -# Current date -current_date = datetime.now(timezone.utc).strftime('%Y-%m-%d') - -# Function to update the last modified date in a file -def update_date_in_file(file_path): - with open(file_path, 'r') as file: - lines = file.readlines() - - updated = False - with open(file_path, 'w') as file: - for line in lines: - if line.startswith('Last updated:'): - file.write(f'Last updated: {current_date}\n') - updated = True - else: - file.write(line) - if not updated: - file.write(f'\nLast updated: {current_date}\n') - -# Check if there are any modified Markdown files -if not modified_md_files: - print("No modified Markdown files found.") - exit(0) - -# Update the date in each modified Markdown file -for file_path in modified_md_files: - print(f"Updating file: {file_path}") # Debugging: Print the file being updated - update_date_in_file(file_path) - -# Add and commit changes -subprocess.run(['git', 'add', '-A']) -subprocess.run(['git', 'commit', '-m', 'Update last modified date in Markdown files']) diff --git a/.github/workflows/use-visitor-counter.yml b/.github/workflows/use-visitor-counter.yml new file mode 100644 index 0000000..f48d033 --- /dev/null +++ b/.github/workflows/use-visitor-counter.yml @@ -0,0 +1,69 @@ +name: Use Visitor Counter Logic + +on: + pull_request: + branches: + - main + workflow_dispatch: + +concurrency: + group: pr-branch-maintenance-${{ github.event.pull_request.head.ref || github.ref_name }} + cancel-in-progress: false + +permissions: + contents: write + pull-requests: write + +jobs: + update-visitor-count: + runs-on: ubuntu-latest + + steps: + - name: Checkout current repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.head_ref || github.ref_name }} + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Run vendored visitor counter logic + env: + TRAFFIC_TOKEN: ${{ secrets.TRAFFIC_TOKEN }} + REPO: ${{ github.repository }} + run: node .github/scripts/update_visitor_counter.js + + - name: Configure Git author + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + + - name: Commit and merge changes + env: + PR_BRANCH: ${{ github.head_ref || github.ref_name }} + TOKEN: ${{ secrets.GITHUB_TOKEN }} + GIT_AUTHOR_NAME: github-actions[bot] + GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_COMMITTER_NAME: github-actions[bot] + GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com + run: | + git switch -c "$PR_BRANCH" || git switch "$PR_BRANCH" + git add -A + if git diff --staged --quiet; then + echo "No changes to commit" + exit 0 + fi + git commit -m "Update visitor count" + git remote set-url origin https://x-access-token:${TOKEN}@github.com/${{ github.repository }} + for attempt in 1 2 3; do + git fetch origin "$PR_BRANCH" + git rebase "origin/$PR_BRANCH" + if git push origin HEAD:"$PR_BRANCH"; then + exit 0 + fi + done + echo "Failed to push branch updates after 3 attempts." + exit 1 diff --git a/.github/workflows/validate_and_fix_markdown.yml b/.github/workflows/validate_and_fix_markdown.yml new file mode 100644 index 0000000..8a88d0b --- /dev/null +++ b/.github/workflows/validate_and_fix_markdown.yml @@ -0,0 +1,78 @@ +name: Validate and Fix Markdown + +on: + pull_request: + branches: + - main + +concurrency: + group: pr-branch-maintenance-${{ github.event.pull_request.head.ref || github.ref_name }} + cancel-in-progress: false + +permissions: + contents: write + pull-requests: write + +jobs: + validate-and-fix-markdown: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install Markdown linter + run: npm install -g markdownlint-cli + + - name: Lint and fix Markdown files + run: markdownlint "**/*.md" --fix --config .github/.markdownlint.json + + - name: Validate standard Markdown header + id: validate-header + continue-on-error: true + run: python .github/scripts/validate_markdown_header.py + + - name: Configure Git + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + + - name: Commit and rebase changes + env: + PR_BRANCH: ${{ github.head_ref || github.ref_name }} + TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git add -A + if git diff --staged --quiet; then + echo "No changes to commit" + exit 0 + fi + git commit -m "Fix Markdown syntax issues" + git remote set-url origin https://x-access-token:${TOKEN}@github.com/${{ github.repository }} + for attempt in 1 2 3; do + git fetch origin "$PR_BRANCH" + git rebase "origin/$PR_BRANCH" + if git push origin HEAD:"$PR_BRANCH"; then + exit 0 + fi + done + echo "Failed to push branch updates after 3 attempts." + exit 1 + + - name: Fail if standard Markdown header validation failed + if: steps.validate-header.outcome == 'failure' + run: | + echo "Standard Markdown header validation failed." + exit 1 diff --git a/.github/workflows/validate_and_fix_notebook.yml b/.github/workflows/validate_and_fix_notebook.yml new file mode 100644 index 0000000..cd5cfbd --- /dev/null +++ b/.github/workflows/validate_and_fix_notebook.yml @@ -0,0 +1,87 @@ +name: Validate and Fix Notebook + +on: + pull_request: + branches: + - main + +concurrency: + group: pr-branch-maintenance-${{ github.event.pull_request.head.ref || github.ref_name }} + cancel-in-progress: false + +permissions: + contents: write + pull-requests: write + +jobs: + validate-and-fix-notebook: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install Jupyter and nbformat + run: pip install jupyter nbformat + + - name: Validate and fix notebooks + run: | + python - <<'PY' + import glob + import sys + import nbformat + + files = glob.glob('**/*.ipynb', recursive=True) + if not files: + print('No notebooks found.') + sys.exit(0) + + for file_path in files: + with open(file_path, 'r', encoding='utf-8') as handle: + notebook = nbformat.read(handle, as_version=4) + nbformat.validate(notebook) + + widgets = notebook.metadata.setdefault('widgets', {}) + widget_state = widgets.setdefault( + 'application/vnd.jupyter.widget-state+json', + {'version': '1.0', 'state': {}}, + ) + widget_state.setdefault('state', {}) + + with open(file_path, 'w', encoding='utf-8') as handle: + nbformat.write(notebook, handle) + PY + + - name: Configure Git + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + + - name: Commit changes + env: + PR_BRANCH: ${{ github.event.pull_request.head.ref }} + TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git add -A + if git diff --staged --quiet; then + echo "No changes to commit" + exit 0 + fi + git commit -m "Fix notebook format issues" + git remote set-url origin https://x-access-token:${TOKEN}@github.com/${{ github.repository }} + for attempt in 1 2 3; do + git fetch origin "$PR_BRANCH" + git rebase "origin/$PR_BRANCH" + if git push origin HEAD:"$PR_BRANCH"; then + exit 0 + fi + done + echo "Failed to push branch updates after 3 attempts." + exit 1 diff --git a/LICENSE b/LICENSE index 07e6a36..3417b91 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 MicrosoftCloudEssentials - LearningHub +Copyright (c) 2025 Cloud2BR Open Source Microsoft Cloud Sandbox - Learning Hub Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index ae39ad3..87f0a04 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,13 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) -[brown9804](https://github.com/brown9804) +[Cloud2BR OSS - Learning Hub](https://github.com/Cloud2BR-MSFTLearningHub) -Last updated: 2025-02-21 +Last updated: 2026-04-07 ---------- > Provides an example of creating an automated file processing and summary generation tool using Microsoft Azure technologies. It demonstrates how to use Azure AI Services, Azure Blob Storage, Azure Functions, and Python to upload files, search for key values, and generate summaries. The tool supports tabular data in xlsx and csv formats, as well as text data from docs and pdf files. Summaries can be generated in few formats, including xlsx, csv, and text files. - > [!IMPORTANT] > Disclaimer: Please note, this example of solution `it is not an official solution guide`. For official guidance, support, or more detailed information, please refer to Microsoft's official documentation or contact Microsoft directly: [Microsoft Sales and Support](https://support.microsoft.com/contactus?ContactUsExperienceEntryPointAssetId=S.HP.SMC-HOME) @@ -67,7 +66,9 @@ Please follow as described below: - **Compliance**: Ensure that your deployment complies with relevant regulations and standards. Use Azure Policy to enforce compliance and governance policies across your resources. - **Disaster Recovery**: Implement a disaster recovery plan to ensure business continuity in case of failures. Use Azure Site Recovery and backup solutions to protect your data and applications. +
-

Total Visitors

- Visitor Count + Total views +

Refresh Date: 2026-04-07

+ diff --git a/instructions/0_Overview/README.md b/instructions/0_Overview/README.md index b32be28..c3e25e7 100644 --- a/instructions/0_Overview/README.md +++ b/instructions/0_Overview/README.md @@ -3,9 +3,9 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) -[brown9804](https://github.com/brown9804) +[Cloud2BR OSS - Learning Hub](https://github.com/Cloud2BR-MSFTLearningHub) -Last updated: 2025-02-21 +Last updated: 2026-04-07 ------------------------------------------ @@ -74,7 +74,9 @@ graph TD Centered Image +
-

Total Visitors

- Visitor Count + Total views +

Refresh Date: 2026-04-07

+ diff --git a/instructions/1_CreateRG.md b/instructions/1_CreateRG.md index a8499dc..7013902 100644 --- a/instructions/1_CreateRG.md +++ b/instructions/1_CreateRG.md @@ -3,9 +3,9 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) -[brown9804](https://github.com/brown9804) +[Cloud2BR OSS - Learning Hub](https://github.com/Cloud2BR-MSFTLearningHub) -Last updated: 2025-02-21 +Last updated: 2026-04-07 ------------------------------------------ @@ -32,7 +32,9 @@ Last updated: 2025-02-21 image +
-

Total Visitors

- Visitor Count + Total views +

Refresh Date: 2026-04-07

+ diff --git a/instructions/2_CreateBlobStorage.md b/instructions/2_CreateBlobStorage.md index ba8e4f2..9cecf2a 100644 --- a/instructions/2_CreateBlobStorage.md +++ b/instructions/2_CreateBlobStorage.md @@ -3,9 +3,9 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) -[brown9804](https://github.com/brown9804) +[Cloud2BR OSS - Learning Hub](https://github.com/Cloud2BR-MSFTLearningHub) -Last updated: 2025-02-21 +Last updated: 2026-04-07 ------------------------------------------ @@ -64,7 +64,9 @@ Within the Storage Account, create a Blob Container to store your PDFs. image +
-

Total Visitors

- Visitor Count + Total views +

Refresh Date: 2026-04-07

+ diff --git a/instructions/3_SetupAIServices.md b/instructions/3_SetupAIServices.md index c3b8a30..a6bce33 100644 --- a/instructions/3_SetupAIServices.md +++ b/instructions/3_SetupAIServices.md @@ -3,9 +3,9 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) -[brown9804](https://github.com/brown9804) +[Cloud2BR OSS - Learning Hub](https://github.com/Cloud2BR-MSFTLearningHub) -Last updated: 2025-02-21 +Last updated: 2026-04-07 ------------------------------------------ @@ -65,7 +65,9 @@ Last updated: 2025-02-21 image +
-

Total Visitors

- Visitor Count + Total views +

Refresh Date: 2026-04-07

+ diff --git a/instructions/4_CreateLogAnalyticsWS.md b/instructions/4_CreateLogAnalyticsWS.md index f42f971..28c0ec3 100644 --- a/instructions/4_CreateLogAnalyticsWS.md +++ b/instructions/4_CreateLogAnalyticsWS.md @@ -3,9 +3,9 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) -[brown9804](https://github.com/brown9804) +[Cloud2BR OSS - Learning Hub](https://github.com/Cloud2BR-MSFTLearningHub) -Last updated: 2025-02-21 +Last updated: 2026-04-07 ------------------------------------------ @@ -42,8 +42,10 @@ Last updated: 2025-02-21 Centered Image +
-

Total Visitors

- Visitor Count + Total views +

Refresh Date: 2026-04-07

+ diff --git a/instructions/5_SetupKeyVault.md b/instructions/5_SetupKeyVault.md index 804a2cb..27bd873 100644 --- a/instructions/5_SetupKeyVault.md +++ b/instructions/5_SetupKeyVault.md @@ -3,9 +3,9 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) -[brown9804](https://github.com/brown9804) +[Cloud2BR OSS - Learning Hub](https://github.com/Cloud2BR-MSFTLearningHub) -Last updated: 2025-02-21 +Last updated: 2026-04-07 ------------------------------------------ @@ -65,7 +65,9 @@ Last updated: 2025-02-21 Centered Image +
-

Total Visitors

- Visitor Count + Total views +

Refresh Date: 2026-04-07

+ diff --git a/instructions/6_SetupFunctionApp.md b/instructions/6_SetupFunctionApp.md index cb78b02..e0b4dd6 100644 --- a/instructions/6_SetupFunctionApp.md +++ b/instructions/6_SetupFunctionApp.md @@ -3,9 +3,9 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) -[brown9804](https://github.com/brown9804) +[Cloud2BR OSS - Learning Hub](https://github.com/Cloud2BR-MSFTLearningHub) -Last updated: 2025-03-18 +Last updated: 2026-04-07 ------------------------------------------ @@ -59,7 +59,9 @@ Last updated: 2025-03-18 +
-

Total Visitors

- Visitor Count + Total views +

Refresh Date: 2026-04-07

+ diff --git a/metrics.json b/metrics.json new file mode 100644 index 0000000..a905277 --- /dev/null +++ b/metrics.json @@ -0,0 +1,4 @@ +{ + "totalViews": 0, + "refreshDate": "2026-04-07" +} diff --git a/terraform/README.md b/terraform/README.md index 98e5979..88b0c85 100644 --- a/terraform/README.md +++ b/terraform/README.md @@ -3,9 +3,9 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) -[brown9804](https://github.com/brown9804) +[Cloud2BR OSS - Learning Hub](https://github.com/Cloud2BR-MSFTLearningHub) -Last updated: 2025-02-21 +Last updated: 2026-04-07 ------------------------------------------ @@ -27,7 +27,7 @@ Last updated: 2025-02-21 ## Overview -``` +```text . ├── README.md ├── src @@ -48,20 +48,20 @@ Last updated: 2025-02-21 ## Resources -| Resource | Description | -|---------------------------|-------------------------------------------------------------------------------------------------------| -| Azure Resource Group | A logical container that organizes and manages all the related Azure resources. | -| Azure Blob Storage | Stores input files (xlsx, csv, docs, pdfs) and output summary files. | -| Azure Functions | Executes serverless compute tasks to process the uploaded files and generate summaries. | -| Azure AI Services | Provides text analytics and OCR capabilities to handle text data from docs and pdfs. | -| Azure Storage Account | Manages Blob Storage and other storage services. | -| Azure Key Vault | Stores and manages sensitive information such as connection strings and API keys. | -| Application Insights | Monitors the performance and usage of the file processing tool. | -| Log Analytics Workspace | Collects and analyzes log data from various sources. | +| Resource | Description | +| :---------------------- | :-------------------------------------------------------------------------------------------- | +| Azure Resource Group | A logical container that organizes and manages all the related Azure resources. | +| Azure Blob Storage | Stores input files (xlsx, csv, docs, pdfs) and output summary files. | +| Azure Functions | Executes serverless compute tasks to process the uploaded files and generate summaries. | +| Azure AI Services | Provides text analytics and OCR capabilities to handle text data from docs and pdfs. | +| Azure Storage Account | Manages Blob Storage and other storage services. | +| Azure Key Vault | Stores and manages sensitive information such as connection strings and API keys. | +| Application Insights | Monitors the performance and usage of the file processing tool. | +| Log Analytics Workspace | Collects and analyzes log data from various sources. | ## How to execute it -```mermaid +```mermaid graph TD; A[az login] --> B(terraform init) B --> C{Terraform provisioning stage} @@ -90,7 +90,7 @@ graph TD; 2. **Initialize Terraform**: Initializes the working directory containing the Terraform configuration files. It downloads the necessary provider plugins and sets up the backend for storing the state. - ``` sh + ```sh terraform init ``` @@ -131,8 +131,10 @@ graph TD; terraform destroy -var-file terraform.tfvars ``` +
-

Total Visitors

- Visitor Count + Total views +

Refresh Date: 2026-04-07

+