fix(web): Use AUTH_URL when generating external links - #844

Merged
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339
Feb 3, 2026
Merged

fix(web): Use AUTH_URL when generating external links#844
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Problem

In Kubernetes deployments, when internal services call Sourcebot APIs, the Host header is set to the internal service DNS name. The old getBaseUrl() function used this header to build URLs returned to users, resulting in inaccessible links.

Solution

Since AUTH_URL is a required environment variable that contains the public-facing URL, we now use it directly instead of inferring the URL from request headers.

Summary by CodeRabbit

  • Refactor
    • Unified web URL handling to use a single configured auth URL across browsing, search, chat, and organization settings for consistent links.
  • Bug Fix
    • Fixed external link issues in certain deployments so links to repositories and services are reliably accessible.
  • UI
    • Added a simple error message when organization data fails to load.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

Walkthrough

Base URL sourcing was changed from runtime request headers (and the removed getBaseUrl) to a single environment variable (env.AUTH_URL) across the web package; imports of headers/getBaseUrl were removed and a defensive org null-check was added in one component.

Changes

Cohort / File(s)Summary
Utility Removal
packages/web/src/lib/utils.server.ts
Removed exported getBaseUrl which derived base URL from Next.js request headers; eliminated header-based fallback logic.
API Routes
packages/web/src/app/api/(server)/chat/blocking/route.ts, packages/web/src/app/api/(server)/repos/listReposApi.ts
Replaced header-derived getBaseUrl(headers...) with env.AUTH_URL; removed headers and getBaseUrl imports and updated URL construction.
Web Actions & Components
packages/web/src/actions.ts, packages/web/src/app/components/organizationAccessSettings.tsx
Switched webUrl/baseUrl construction to env.AUTH_URL; removed header imports; added if (!org) return <div>Error loading organization</div> guard in organization component.
Search Feature
packages/web/src/features/search/zoektSearcher.ts
Replaced header/baseUrl logic with env.AUTH_URL when building web links in search result transforms; removed header/getBaseUrl imports.
Meta / Changelog
CHANGELOG.md, package.json
Added changelog entry; small manifest/package metadata edits.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: replacing the header-based URL derivation with the AUTH_URL environment variable for generating external links.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/fix-SOU-339

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claudeBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.


@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/actions.ts (1)

4-4: 🛠️ Refactor suggestion | 🟠 Major

Apply the same fix (use env.AUTH_URL or similar) to origin derivations at lines 894 and 1586.

Both createInvites and approveAccountRequest use headers().get('origin') to construct external-facing links (invite links at line 917 and approval email baseUrl at line 1589). These have the same Kubernetes deployment issue as the fix applied at line 4—the origin header can be unreliable when requests are proxied. Line 480 shows the pattern already in use: const baseUrl = env.AUTH_URL;. Apply this same approach to lines 894 and 1586 for consistency and reliability.

🧹 Nitpick comments (2)
packages/web/src/features/search/zoektSearcher.ts (1)

429-435: Potential double-slash if AUTH_URL ends with a trailing slash.

If env.AUTH_URL is configured with a trailing slash (e.g., https://example.com/) and getBrowsePath returns a path starting with /, the resulting URL will contain a double slash. Consider normalizing the URL:

♻️ Suggested normalization
- webUrl: `${env.AUTH_URL}${getBrowsePath({+ webUrl: `${env.AUTH_URL.replace(/\/$/, '')}${getBrowsePath({
repoName: repo.name,
path: fileName,
pathType: 'blob',
domain: SINGLE_TENANT_ORG_DOMAIN,
revisionName: branchName,
})}`,

Alternatively, you could create a utility function to handle URL concatenation consistently across all the files modified in this PR.

packages/web/src/app/api/(server)/chat/blocking/route.ts (1)

189-190: Same trailing slash concern applies here.

If env.AUTH_URL ends with a trailing slash, the constructed chatUrl will have a double slash (e.g., https://example.com//org/chat/...).

♻️ Suggested normalization
- const baseUrl = env.AUTH_URL;- const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;+ const baseUrl = env.AUTH_URL.replace(/\/$/, '');+ const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;

@brendan-kellam
brendan-kellam merged commit 15e4aa1 into mainFeb 3, 2026
8 of 9 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/fix-SOU-339 branch February 3, 2026 06:33
@github-actionsgithub-actionsBot mentioned this pull request Feb 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(web): Use AUTH_URL when generating external links - #844

Merged
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339
Feb 3, 2026
Merged

fix(web): Use AUTH_URL when generating external links#844
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Problem

In Kubernetes deployments, when internal services call Sourcebot APIs, the Host header is set to the internal service DNS name. The old getBaseUrl() function used this header to build URLs returned to users, resulting in inaccessible links.

Solution

Since AUTH_URL is a required environment variable that contains the public-facing URL, we now use it directly instead of inferring the URL from request headers.

Summary by CodeRabbit

  • Refactor
    • Unified web URL handling to use a single configured auth URL across browsing, search, chat, and organization settings for consistent links.
  • Bug Fix
    • Fixed external link issues in certain deployments so links to repositories and services are reliably accessible.
  • UI
    • Added a simple error message when organization data fails to load.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

Walkthrough

Base URL sourcing was changed from runtime request headers (and the removed getBaseUrl) to a single environment variable (env.AUTH_URL) across the web package; imports of headers/getBaseUrl were removed and a defensive org null-check was added in one component.

Changes

Cohort / File(s)Summary
Utility Removal
packages/web/src/lib/utils.server.ts
Removed exported getBaseUrl which derived base URL from Next.js request headers; eliminated header-based fallback logic.
API Routes
packages/web/src/app/api/(server)/chat/blocking/route.ts, packages/web/src/app/api/(server)/repos/listReposApi.ts
Replaced header-derived getBaseUrl(headers...) with env.AUTH_URL; removed headers and getBaseUrl imports and updated URL construction.
Web Actions & Components
packages/web/src/actions.ts, packages/web/src/app/components/organizationAccessSettings.tsx
Switched webUrl/baseUrl construction to env.AUTH_URL; removed header imports; added if (!org) return <div>Error loading organization</div> guard in organization component.
Search Feature
packages/web/src/features/search/zoektSearcher.ts
Replaced header/baseUrl logic with env.AUTH_URL when building web links in search result transforms; removed header/getBaseUrl imports.
Meta / Changelog
CHANGELOG.md, package.json
Added changelog entry; small manifest/package metadata edits.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: replacing the header-based URL derivation with the AUTH_URL environment variable for generating external links.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/fix-SOU-339

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claudeBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.


@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/actions.ts (1)

4-4: 🛠️ Refactor suggestion | 🟠 Major

Apply the same fix (use env.AUTH_URL or similar) to origin derivations at lines 894 and 1586.

Both createInvites and approveAccountRequest use headers().get('origin') to construct external-facing links (invite links at line 917 and approval email baseUrl at line 1589). These have the same Kubernetes deployment issue as the fix applied at line 4—the origin header can be unreliable when requests are proxied. Line 480 shows the pattern already in use: const baseUrl = env.AUTH_URL;. Apply this same approach to lines 894 and 1586 for consistency and reliability.

🧹 Nitpick comments (2)
packages/web/src/features/search/zoektSearcher.ts (1)

429-435: Potential double-slash if AUTH_URL ends with a trailing slash.

If env.AUTH_URL is configured with a trailing slash (e.g., https://example.com/) and getBrowsePath returns a path starting with /, the resulting URL will contain a double slash. Consider normalizing the URL:

♻️ Suggested normalization
- webUrl: `${env.AUTH_URL}${getBrowsePath({+ webUrl: `${env.AUTH_URL.replace(/\/$/, '')}${getBrowsePath({
repoName: repo.name,
path: fileName,
pathType: 'blob',
domain: SINGLE_TENANT_ORG_DOMAIN,
revisionName: branchName,
})}`,

Alternatively, you could create a utility function to handle URL concatenation consistently across all the files modified in this PR.

packages/web/src/app/api/(server)/chat/blocking/route.ts (1)

189-190: Same trailing slash concern applies here.

If env.AUTH_URL ends with a trailing slash, the constructed chatUrl will have a double slash (e.g., https://example.com//org/chat/...).

♻️ Suggested normalization
- const baseUrl = env.AUTH_URL;- const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;+ const baseUrl = env.AUTH_URL.replace(/\/$/, '');+ const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;

@brendan-kellam
brendan-kellam merged commit 15e4aa1 into mainFeb 3, 2026
8 of 9 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/fix-SOU-339 branch February 3, 2026 06:33
@github-actionsgithub-actionsBot mentioned this pull request Feb 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): Use AUTH_URL when generating external links - #844

Merged
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339
Feb 3, 2026
Merged

fix(web): Use AUTH_URL when generating external links#844
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Problem

In Kubernetes deployments, when internal services call Sourcebot APIs, the Host header is set to the internal service DNS name. The old getBaseUrl() function used this header to build URLs returned to users, resulting in inaccessible links.

Solution

Since AUTH_URL is a required environment variable that contains the public-facing URL, we now use it directly instead of inferring the URL from request headers.

Summary by CodeRabbit

  • Refactor
    • Unified web URL handling to use a single configured auth URL across browsing, search, chat, and organization settings for consistent links.
  • Bug Fix
    • Fixed external link issues in certain deployments so links to repositories and services are reliably accessible.
  • UI
    • Added a simple error message when organization data fails to load.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

Walkthrough

Base URL sourcing was changed from runtime request headers (and the removed getBaseUrl) to a single environment variable (env.AUTH_URL) across the web package; imports of headers/getBaseUrl were removed and a defensive org null-check was added in one component.

Changes

Cohort / File(s)Summary
Utility Removal
packages/web/src/lib/utils.server.ts
Removed exported getBaseUrl which derived base URL from Next.js request headers; eliminated header-based fallback logic.
API Routes
packages/web/src/app/api/(server)/chat/blocking/route.ts, packages/web/src/app/api/(server)/repos/listReposApi.ts
Replaced header-derived getBaseUrl(headers...) with env.AUTH_URL; removed headers and getBaseUrl imports and updated URL construction.
Web Actions & Components
packages/web/src/actions.ts, packages/web/src/app/components/organizationAccessSettings.tsx
Switched webUrl/baseUrl construction to env.AUTH_URL; removed header imports; added if (!org) return <div>Error loading organization</div> guard in organization component.
Search Feature
packages/web/src/features/search/zoektSearcher.ts
Replaced header/baseUrl logic with env.AUTH_URL when building web links in search result transforms; removed header/getBaseUrl imports.
Meta / Changelog
CHANGELOG.md, package.json
Added changelog entry; small manifest/package metadata edits.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: replacing the header-based URL derivation with the AUTH_URL environment variable for generating external links.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/fix-SOU-339

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claudeBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.


@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/actions.ts (1)

4-4: 🛠️ Refactor suggestion | 🟠 Major

Apply the same fix (use env.AUTH_URL or similar) to origin derivations at lines 894 and 1586.

Both createInvites and approveAccountRequest use headers().get('origin') to construct external-facing links (invite links at line 917 and approval email baseUrl at line 1589). These have the same Kubernetes deployment issue as the fix applied at line 4—the origin header can be unreliable when requests are proxied. Line 480 shows the pattern already in use: const baseUrl = env.AUTH_URL;. Apply this same approach to lines 894 and 1586 for consistency and reliability.

🧹 Nitpick comments (2)
packages/web/src/features/search/zoektSearcher.ts (1)

429-435: Potential double-slash if AUTH_URL ends with a trailing slash.

If env.AUTH_URL is configured with a trailing slash (e.g., https://example.com/) and getBrowsePath returns a path starting with /, the resulting URL will contain a double slash. Consider normalizing the URL:

♻️ Suggested normalization
- webUrl: `${env.AUTH_URL}${getBrowsePath({+ webUrl: `${env.AUTH_URL.replace(/\/$/, '')}${getBrowsePath({
repoName: repo.name,
path: fileName,
pathType: 'blob',
domain: SINGLE_TENANT_ORG_DOMAIN,
revisionName: branchName,
})}`,

Alternatively, you could create a utility function to handle URL concatenation consistently across all the files modified in this PR.

packages/web/src/app/api/(server)/chat/blocking/route.ts (1)

189-190: Same trailing slash concern applies here.

If env.AUTH_URL ends with a trailing slash, the constructed chatUrl will have a double slash (e.g., https://example.com//org/chat/...).

♻️ Suggested normalization
- const baseUrl = env.AUTH_URL;- const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;+ const baseUrl = env.AUTH_URL.replace(/\/$/, '');+ const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;

@brendan-kellam
brendan-kellam merged commit 15e4aa1 into mainFeb 3, 2026
8 of 9 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/fix-SOU-339 branch February 3, 2026 06:33
@github-actionsgithub-actionsBot mentioned this pull request Feb 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): Use AUTH_URL when generating external links - #844

Merged
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339
Feb 3, 2026
Merged

fix(web): Use AUTH_URL when generating external links#844
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Problem

In Kubernetes deployments, when internal services call Sourcebot APIs, the Host header is set to the internal service DNS name. The old getBaseUrl() function used this header to build URLs returned to users, resulting in inaccessible links.

Solution

Since AUTH_URL is a required environment variable that contains the public-facing URL, we now use it directly instead of inferring the URL from request headers.

Summary by CodeRabbit

  • Refactor
    • Unified web URL handling to use a single configured auth URL across browsing, search, chat, and organization settings for consistent links.
  • Bug Fix
    • Fixed external link issues in certain deployments so links to repositories and services are reliably accessible.
  • UI
    • Added a simple error message when organization data fails to load.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

Walkthrough

Base URL sourcing was changed from runtime request headers (and the removed getBaseUrl) to a single environment variable (env.AUTH_URL) across the web package; imports of headers/getBaseUrl were removed and a defensive org null-check was added in one component.

Changes

Cohort / File(s)Summary
Utility Removal
packages/web/src/lib/utils.server.ts
Removed exported getBaseUrl which derived base URL from Next.js request headers; eliminated header-based fallback logic.
API Routes
packages/web/src/app/api/(server)/chat/blocking/route.ts, packages/web/src/app/api/(server)/repos/listReposApi.ts
Replaced header-derived getBaseUrl(headers...) with env.AUTH_URL; removed headers and getBaseUrl imports and updated URL construction.
Web Actions & Components
packages/web/src/actions.ts, packages/web/src/app/components/organizationAccessSettings.tsx
Switched webUrl/baseUrl construction to env.AUTH_URL; removed header imports; added if (!org) return <div>Error loading organization</div> guard in organization component.
Search Feature
packages/web/src/features/search/zoektSearcher.ts
Replaced header/baseUrl logic with env.AUTH_URL when building web links in search result transforms; removed header/getBaseUrl imports.
Meta / Changelog
CHANGELOG.md, package.json
Added changelog entry; small manifest/package metadata edits.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: replacing the header-based URL derivation with the AUTH_URL environment variable for generating external links.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/fix-SOU-339

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claudeBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.


@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/actions.ts (1)

4-4: 🛠️ Refactor suggestion | 🟠 Major

Apply the same fix (use env.AUTH_URL or similar) to origin derivations at lines 894 and 1586.

Both createInvites and approveAccountRequest use headers().get('origin') to construct external-facing links (invite links at line 917 and approval email baseUrl at line 1589). These have the same Kubernetes deployment issue as the fix applied at line 4—the origin header can be unreliable when requests are proxied. Line 480 shows the pattern already in use: const baseUrl = env.AUTH_URL;. Apply this same approach to lines 894 and 1586 for consistency and reliability.

🧹 Nitpick comments (2)
packages/web/src/features/search/zoektSearcher.ts (1)

429-435: Potential double-slash if AUTH_URL ends with a trailing slash.

If env.AUTH_URL is configured with a trailing slash (e.g., https://example.com/) and getBrowsePath returns a path starting with /, the resulting URL will contain a double slash. Consider normalizing the URL:

♻️ Suggested normalization
- webUrl: `${env.AUTH_URL}${getBrowsePath({+ webUrl: `${env.AUTH_URL.replace(/\/$/, '')}${getBrowsePath({
repoName: repo.name,
path: fileName,
pathType: 'blob',
domain: SINGLE_TENANT_ORG_DOMAIN,
revisionName: branchName,
})}`,

Alternatively, you could create a utility function to handle URL concatenation consistently across all the files modified in this PR.

packages/web/src/app/api/(server)/chat/blocking/route.ts (1)

189-190: Same trailing slash concern applies here.

If env.AUTH_URL ends with a trailing slash, the constructed chatUrl will have a double slash (e.g., https://example.com//org/chat/...).

♻️ Suggested normalization
- const baseUrl = env.AUTH_URL;- const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;+ const baseUrl = env.AUTH_URL.replace(/\/$/, '');+ const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;

@brendan-kellam
brendan-kellam merged commit 15e4aa1 into mainFeb 3, 2026
8 of 9 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/fix-SOU-339 branch February 3, 2026 06:33
@github-actionsgithub-actionsBot mentioned this pull request Feb 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(web): Use AUTH_URL when generating external links - #844

Merged
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339
Feb 3, 2026
Merged

fix(web): Use AUTH_URL when generating external links#844
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Problem

In Kubernetes deployments, when internal services call Sourcebot APIs, the Host header is set to the internal service DNS name. The old getBaseUrl() function used this header to build URLs returned to users, resulting in inaccessible links.

Solution

Since AUTH_URL is a required environment variable that contains the public-facing URL, we now use it directly instead of inferring the URL from request headers.

Summary by CodeRabbit

  • Refactor
    • Unified web URL handling to use a single configured auth URL across browsing, search, chat, and organization settings for consistent links.
  • Bug Fix
    • Fixed external link issues in certain deployments so links to repositories and services are reliably accessible.
  • UI
    • Added a simple error message when organization data fails to load.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

Walkthrough

Base URL sourcing was changed from runtime request headers (and the removed getBaseUrl) to a single environment variable (env.AUTH_URL) across the web package; imports of headers/getBaseUrl were removed and a defensive org null-check was added in one component.

Changes

Cohort / File(s)Summary
Utility Removal
packages/web/src/lib/utils.server.ts
Removed exported getBaseUrl which derived base URL from Next.js request headers; eliminated header-based fallback logic.
API Routes
packages/web/src/app/api/(server)/chat/blocking/route.ts, packages/web/src/app/api/(server)/repos/listReposApi.ts
Replaced header-derived getBaseUrl(headers...) with env.AUTH_URL; removed headers and getBaseUrl imports and updated URL construction.
Web Actions & Components
packages/web/src/actions.ts, packages/web/src/app/components/organizationAccessSettings.tsx
Switched webUrl/baseUrl construction to env.AUTH_URL; removed header imports; added if (!org) return <div>Error loading organization</div> guard in organization component.
Search Feature
packages/web/src/features/search/zoektSearcher.ts
Replaced header/baseUrl logic with env.AUTH_URL when building web links in search result transforms; removed header/getBaseUrl imports.
Meta / Changelog
CHANGELOG.md, package.json
Added changelog entry; small manifest/package metadata edits.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: replacing the header-based URL derivation with the AUTH_URL environment variable for generating external links.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/fix-SOU-339

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claudeBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.


@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/actions.ts (1)

4-4: 🛠️ Refactor suggestion | 🟠 Major

Apply the same fix (use env.AUTH_URL or similar) to origin derivations at lines 894 and 1586.

Both createInvites and approveAccountRequest use headers().get('origin') to construct external-facing links (invite links at line 917 and approval email baseUrl at line 1589). These have the same Kubernetes deployment issue as the fix applied at line 4—the origin header can be unreliable when requests are proxied. Line 480 shows the pattern already in use: const baseUrl = env.AUTH_URL;. Apply this same approach to lines 894 and 1586 for consistency and reliability.

🧹 Nitpick comments (2)
packages/web/src/features/search/zoektSearcher.ts (1)

429-435: Potential double-slash if AUTH_URL ends with a trailing slash.

If env.AUTH_URL is configured with a trailing slash (e.g., https://example.com/) and getBrowsePath returns a path starting with /, the resulting URL will contain a double slash. Consider normalizing the URL:

♻️ Suggested normalization
- webUrl: `${env.AUTH_URL}${getBrowsePath({+ webUrl: `${env.AUTH_URL.replace(/\/$/, '')}${getBrowsePath({
repoName: repo.name,
path: fileName,
pathType: 'blob',
domain: SINGLE_TENANT_ORG_DOMAIN,
revisionName: branchName,
})}`,

Alternatively, you could create a utility function to handle URL concatenation consistently across all the files modified in this PR.

packages/web/src/app/api/(server)/chat/blocking/route.ts (1)

189-190: Same trailing slash concern applies here.

If env.AUTH_URL ends with a trailing slash, the constructed chatUrl will have a double slash (e.g., https://example.com//org/chat/...).

♻️ Suggested normalization
- const baseUrl = env.AUTH_URL;- const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;+ const baseUrl = env.AUTH_URL.replace(/\/$/, '');+ const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;

@brendan-kellam
brendan-kellam merged commit 15e4aa1 into mainFeb 3, 2026
8 of 9 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/fix-SOU-339 branch February 3, 2026 06:33
@github-actionsgithub-actionsBot mentioned this pull request Feb 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): Use AUTH_URL when generating external links - #844

Merged
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339
Feb 3, 2026
Merged

fix(web): Use AUTH_URL when generating external links#844
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Problem

In Kubernetes deployments, when internal services call Sourcebot APIs, the Host header is set to the internal service DNS name. The old getBaseUrl() function used this header to build URLs returned to users, resulting in inaccessible links.

Solution

Since AUTH_URL is a required environment variable that contains the public-facing URL, we now use it directly instead of inferring the URL from request headers.

Summary by CodeRabbit

  • Refactor
    • Unified web URL handling to use a single configured auth URL across browsing, search, chat, and organization settings for consistent links.
  • Bug Fix
    • Fixed external link issues in certain deployments so links to repositories and services are reliably accessible.
  • UI
    • Added a simple error message when organization data fails to load.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

Walkthrough

Base URL sourcing was changed from runtime request headers (and the removed getBaseUrl) to a single environment variable (env.AUTH_URL) across the web package; imports of headers/getBaseUrl were removed and a defensive org null-check was added in one component.

Changes

Cohort / File(s)Summary
Utility Removal
packages/web/src/lib/utils.server.ts
Removed exported getBaseUrl which derived base URL from Next.js request headers; eliminated header-based fallback logic.
API Routes
packages/web/src/app/api/(server)/chat/blocking/route.ts, packages/web/src/app/api/(server)/repos/listReposApi.ts
Replaced header-derived getBaseUrl(headers...) with env.AUTH_URL; removed headers and getBaseUrl imports and updated URL construction.
Web Actions & Components
packages/web/src/actions.ts, packages/web/src/app/components/organizationAccessSettings.tsx
Switched webUrl/baseUrl construction to env.AUTH_URL; removed header imports; added if (!org) return <div>Error loading organization</div> guard in organization component.
Search Feature
packages/web/src/features/search/zoektSearcher.ts
Replaced header/baseUrl logic with env.AUTH_URL when building web links in search result transforms; removed header/getBaseUrl imports.
Meta / Changelog
CHANGELOG.md, package.json
Added changelog entry; small manifest/package metadata edits.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: replacing the header-based URL derivation with the AUTH_URL environment variable for generating external links.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/fix-SOU-339

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claudeBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.


@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/actions.ts (1)

4-4: 🛠️ Refactor suggestion | 🟠 Major

Apply the same fix (use env.AUTH_URL or similar) to origin derivations at lines 894 and 1586.

Both createInvites and approveAccountRequest use headers().get('origin') to construct external-facing links (invite links at line 917 and approval email baseUrl at line 1589). These have the same Kubernetes deployment issue as the fix applied at line 4—the origin header can be unreliable when requests are proxied. Line 480 shows the pattern already in use: const baseUrl = env.AUTH_URL;. Apply this same approach to lines 894 and 1586 for consistency and reliability.

🧹 Nitpick comments (2)
packages/web/src/features/search/zoektSearcher.ts (1)

429-435: Potential double-slash if AUTH_URL ends with a trailing slash.

If env.AUTH_URL is configured with a trailing slash (e.g., https://example.com/) and getBrowsePath returns a path starting with /, the resulting URL will contain a double slash. Consider normalizing the URL:

♻️ Suggested normalization
- webUrl: `${env.AUTH_URL}${getBrowsePath({+ webUrl: `${env.AUTH_URL.replace(/\/$/, '')}${getBrowsePath({
repoName: repo.name,
path: fileName,
pathType: 'blob',
domain: SINGLE_TENANT_ORG_DOMAIN,
revisionName: branchName,
})}`,

Alternatively, you could create a utility function to handle URL concatenation consistently across all the files modified in this PR.

packages/web/src/app/api/(server)/chat/blocking/route.ts (1)

189-190: Same trailing slash concern applies here.

If env.AUTH_URL ends with a trailing slash, the constructed chatUrl will have a double slash (e.g., https://example.com//org/chat/...).

♻️ Suggested normalization
- const baseUrl = env.AUTH_URL;- const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;+ const baseUrl = env.AUTH_URL.replace(/\/$/, '');+ const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;

@brendan-kellam
brendan-kellam merged commit 15e4aa1 into mainFeb 3, 2026
8 of 9 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/fix-SOU-339 branch February 3, 2026 06:33
@github-actionsgithub-actionsBot mentioned this pull request Feb 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): Use AUTH_URL when generating external links - #844

Merged
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339
Feb 3, 2026
Merged

fix(web): Use AUTH_URL when generating external links#844
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Problem

In Kubernetes deployments, when internal services call Sourcebot APIs, the Host header is set to the internal service DNS name. The old getBaseUrl() function used this header to build URLs returned to users, resulting in inaccessible links.

Solution

Since AUTH_URL is a required environment variable that contains the public-facing URL, we now use it directly instead of inferring the URL from request headers.

Summary by CodeRabbit

  • Refactor
    • Unified web URL handling to use a single configured auth URL across browsing, search, chat, and organization settings for consistent links.
  • Bug Fix
    • Fixed external link issues in certain deployments so links to repositories and services are reliably accessible.
  • UI
    • Added a simple error message when organization data fails to load.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

Walkthrough

Base URL sourcing was changed from runtime request headers (and the removed getBaseUrl) to a single environment variable (env.AUTH_URL) across the web package; imports of headers/getBaseUrl were removed and a defensive org null-check was added in one component.

Changes

Cohort / File(s)Summary
Utility Removal
packages/web/src/lib/utils.server.ts
Removed exported getBaseUrl which derived base URL from Next.js request headers; eliminated header-based fallback logic.
API Routes
packages/web/src/app/api/(server)/chat/blocking/route.ts, packages/web/src/app/api/(server)/repos/listReposApi.ts
Replaced header-derived getBaseUrl(headers...) with env.AUTH_URL; removed headers and getBaseUrl imports and updated URL construction.
Web Actions & Components
packages/web/src/actions.ts, packages/web/src/app/components/organizationAccessSettings.tsx
Switched webUrl/baseUrl construction to env.AUTH_URL; removed header imports; added if (!org) return <div>Error loading organization</div> guard in organization component.
Search Feature
packages/web/src/features/search/zoektSearcher.ts
Replaced header/baseUrl logic with env.AUTH_URL when building web links in search result transforms; removed header/getBaseUrl imports.
Meta / Changelog
CHANGELOG.md, package.json
Added changelog entry; small manifest/package metadata edits.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: replacing the header-based URL derivation with the AUTH_URL environment variable for generating external links.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/fix-SOU-339

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claudeBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.


@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/actions.ts (1)

4-4: 🛠️ Refactor suggestion | 🟠 Major

Apply the same fix (use env.AUTH_URL or similar) to origin derivations at lines 894 and 1586.

Both createInvites and approveAccountRequest use headers().get('origin') to construct external-facing links (invite links at line 917 and approval email baseUrl at line 1589). These have the same Kubernetes deployment issue as the fix applied at line 4—the origin header can be unreliable when requests are proxied. Line 480 shows the pattern already in use: const baseUrl = env.AUTH_URL;. Apply this same approach to lines 894 and 1586 for consistency and reliability.

🧹 Nitpick comments (2)
packages/web/src/features/search/zoektSearcher.ts (1)

429-435: Potential double-slash if AUTH_URL ends with a trailing slash.

If env.AUTH_URL is configured with a trailing slash (e.g., https://example.com/) and getBrowsePath returns a path starting with /, the resulting URL will contain a double slash. Consider normalizing the URL:

♻️ Suggested normalization
- webUrl: `${env.AUTH_URL}${getBrowsePath({+ webUrl: `${env.AUTH_URL.replace(/\/$/, '')}${getBrowsePath({
repoName: repo.name,
path: fileName,
pathType: 'blob',
domain: SINGLE_TENANT_ORG_DOMAIN,
revisionName: branchName,
})}`,

Alternatively, you could create a utility function to handle URL concatenation consistently across all the files modified in this PR.

packages/web/src/app/api/(server)/chat/blocking/route.ts (1)

189-190: Same trailing slash concern applies here.

If env.AUTH_URL ends with a trailing slash, the constructed chatUrl will have a double slash (e.g., https://example.com//org/chat/...).

♻️ Suggested normalization
- const baseUrl = env.AUTH_URL;- const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;+ const baseUrl = env.AUTH_URL.replace(/\/$/, '');+ const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;

@brendan-kellam
brendan-kellam merged commit 15e4aa1 into mainFeb 3, 2026
8 of 9 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/fix-SOU-339 branch February 3, 2026 06:33
@github-actionsgithub-actionsBot mentioned this pull request Feb 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(web): Use AUTH_URL when generating external links - #844

Merged
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339
Feb 3, 2026
Merged

fix(web): Use AUTH_URL when generating external links#844
brendan-kellam merged 3 commits into
mainfrom
bkellam/fix-SOU-339

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Problem

In Kubernetes deployments, when internal services call Sourcebot APIs, the Host header is set to the internal service DNS name. The old getBaseUrl() function used this header to build URLs returned to users, resulting in inaccessible links.

Solution

Since AUTH_URL is a required environment variable that contains the public-facing URL, we now use it directly instead of inferring the URL from request headers.

Summary by CodeRabbit

  • Refactor
    • Unified web URL handling to use a single configured auth URL across browsing, search, chat, and organization settings for consistent links.
  • Bug Fix
    • Fixed external link issues in certain deployments so links to repositories and services are reliably accessible.
  • UI
    • Added a simple error message when organization data fails to load.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

Walkthrough

Base URL sourcing was changed from runtime request headers (and the removed getBaseUrl) to a single environment variable (env.AUTH_URL) across the web package; imports of headers/getBaseUrl were removed and a defensive org null-check was added in one component.

Changes

Cohort / File(s)Summary
Utility Removal
packages/web/src/lib/utils.server.ts
Removed exported getBaseUrl which derived base URL from Next.js request headers; eliminated header-based fallback logic.
API Routes
packages/web/src/app/api/(server)/chat/blocking/route.ts, packages/web/src/app/api/(server)/repos/listReposApi.ts
Replaced header-derived getBaseUrl(headers...) with env.AUTH_URL; removed headers and getBaseUrl imports and updated URL construction.
Web Actions & Components
packages/web/src/actions.ts, packages/web/src/app/components/organizationAccessSettings.tsx
Switched webUrl/baseUrl construction to env.AUTH_URL; removed header imports; added if (!org) return <div>Error loading organization</div> guard in organization component.
Search Feature
packages/web/src/features/search/zoektSearcher.ts
Replaced header/baseUrl logic with env.AUTH_URL when building web links in search result transforms; removed header/getBaseUrl imports.
Meta / Changelog
CHANGELOG.md, package.json
Added changelog entry; small manifest/package metadata edits.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: replacing the header-based URL derivation with the AUTH_URL environment variable for generating external links.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/fix-SOU-339

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claudeBot commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.


@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/actions.ts (1)

4-4: 🛠️ Refactor suggestion | 🟠 Major

Apply the same fix (use env.AUTH_URL or similar) to origin derivations at lines 894 and 1586.

Both createInvites and approveAccountRequest use headers().get('origin') to construct external-facing links (invite links at line 917 and approval email baseUrl at line 1589). These have the same Kubernetes deployment issue as the fix applied at line 4—the origin header can be unreliable when requests are proxied. Line 480 shows the pattern already in use: const baseUrl = env.AUTH_URL;. Apply this same approach to lines 894 and 1586 for consistency and reliability.

🧹 Nitpick comments (2)
packages/web/src/features/search/zoektSearcher.ts (1)

429-435: Potential double-slash if AUTH_URL ends with a trailing slash.

If env.AUTH_URL is configured with a trailing slash (e.g., https://example.com/) and getBrowsePath returns a path starting with /, the resulting URL will contain a double slash. Consider normalizing the URL:

♻️ Suggested normalization
- webUrl: `${env.AUTH_URL}${getBrowsePath({+ webUrl: `${env.AUTH_URL.replace(/\/$/, '')}${getBrowsePath({
repoName: repo.name,
path: fileName,
pathType: 'blob',
domain: SINGLE_TENANT_ORG_DOMAIN,
revisionName: branchName,
})}`,

Alternatively, you could create a utility function to handle URL concatenation consistently across all the files modified in this PR.

packages/web/src/app/api/(server)/chat/blocking/route.ts (1)

189-190: Same trailing slash concern applies here.

If env.AUTH_URL ends with a trailing slash, the constructed chatUrl will have a double slash (e.g., https://example.com//org/chat/...).

♻️ Suggested normalization
- const baseUrl = env.AUTH_URL;- const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;+ const baseUrl = env.AUTH_URL.replace(/\/$/, '');+ const chatUrl = `${baseUrl}/${org.domain}/chat/${chat.id}`;

@brendan-kellam
brendan-kellam merged commit 15e4aa1 into mainFeb 3, 2026
8 of 9 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/fix-SOU-339 branch February 3, 2026 06:33
@github-actionsgithub-actionsBot mentioned this pull request Feb 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam