Skip to content

Commit 61ae5b3

Browse files
committed
fix: address CodeRabbit review feedback
Backend: - Use repo-relative paths for SKIP_DIRS check (fixes false skip when repo is stored in folder named 'repos', 'dist', etc.) Frontend: - Add type guards to extractErrorMessage() - check typeof before using - Add showUpgradeToast() helper - DRYs 4 duplicate toast blocks - Add JSON.stringify fallback for object error details
1 parent 13380c5 commit 61ae5b3

2 files changed

Lines changed: 22 additions & 20 deletions

File tree

backend/services/repo_validator.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,10 @@ def _find_code_files(self, repo_path: str) -> tuple[list[Path], Optional[str]]:
246246
if file_path.is_symlink():
247247
continue
248248

249-
# Skip files in excluded directories
250-
if any(skip_dir in file_path.parts for skip_dir in self.SKIP_DIRS):
249+
# Skip files in excluded directories (use repo-relative path to avoid
250+
# false positives when repo is stored in a folder named 'repos', etc.)
251+
rel_parts = file_path.relative_to(repo_root).parts
252+
if any(skip_dir in rel_parts for skip_dir in self.SKIP_DIRS):
251253
continue
252254

253255
# Check extension

frontend/src/components/dashboard/DashboardHome.tsx

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,12 @@ const MAX_FREE_REPOS = 3
3636
// Extract error message from API response (handles nested detail objects)
3737
function extractErrorMessage(err: any, fallback: string): string {
3838
if (typeof err?.detail === 'string') return err.detail
39-
if (err?.detail?.message) return err.detail.message
40-
if (err?.message) return err.message
39+
if (typeof err?.detail?.message === 'string') return err.detail.message
40+
if (typeof err?.message === 'string') return err.message
41+
// Last resort: try to stringify if it's an object
42+
if (err?.detail && typeof err.detail === 'object') {
43+
return JSON.stringify(err.detail)
44+
}
4145
return fallback
4246
}
4347

@@ -47,6 +51,14 @@ function isUpgradeError(err: any): boolean {
4751
return ['REPO_TOO_LARGE', 'REPO_LIMIT_REACHED'].includes(code)
4852
}
4953

54+
// Show upgrade toast with waitlist CTA (DRY helper for 4 call sites)
55+
function showUpgradeToast(err: any, fallback: string, onJoin: () => void) {
56+
toast.error(extractErrorMessage(err, fallback), {
57+
description: 'Join the Pro waitlist for higher limits',
58+
action: { label: 'Join Waitlist', onClick: onJoin }
59+
})
60+
}
61+
5062
type RepoTab = 'overview' | 'search' | 'dependencies' | 'insights' | 'impact'
5163

5264
export function DashboardHome() {
@@ -115,10 +127,7 @@ export function DashboardHome() {
115127
if (!response.ok) {
116128
const err = await response.json().catch(() => ({}))
117129
if (isUpgradeError(err)) {
118-
toast.error(extractErrorMessage(err, 'Repository too large'), {
119-
description: 'Join the Pro waitlist for higher limits',
120-
action: { label: 'Join Waitlist', onClick: () => setShowUpgradeModal(true) }
121-
})
130+
showUpgradeToast(err, 'Repository too large', () => setShowUpgradeModal(true))
122131
return
123132
}
124133
throw new Error(extractErrorMessage(err, 'Failed to add repository'))
@@ -136,10 +145,7 @@ export function DashboardHome() {
136145
if (!indexResponse.ok) {
137146
const err = await indexResponse.json().catch(() => ({}))
138147
if (isUpgradeError(err)) {
139-
toast.error(extractErrorMessage(err, 'Repository too large'), {
140-
description: 'Join the Pro waitlist for higher limits',
141-
action: { label: 'Join Waitlist', onClick: () => setShowUpgradeModal(true) }
142-
})
148+
showUpgradeToast(err, 'Repository too large', () => setShowUpgradeModal(true))
143149
return
144150
}
145151
throw new Error(extractErrorMessage(err, 'Failed to start indexing'))
@@ -183,10 +189,7 @@ export function DashboardHome() {
183189
if (!response.ok) {
184190
const err = await response.json().catch(() => ({}))
185191
if (isUpgradeError(err)) {
186-
toast.error(extractErrorMessage(err, `${repo.name} too large`), {
187-
description: 'Join the Pro waitlist for higher limits',
188-
action: { label: 'Join Waitlist', onClick: () => setShowUpgradeModal(true) }
189-
})
192+
showUpgradeToast(err, `${repo.name} too large`, () => setShowUpgradeModal(true))
190193
continue
191194
}
192195
throw new Error(extractErrorMessage(err, `Failed to add ${repo.name}`))
@@ -204,10 +207,7 @@ export function DashboardHome() {
204207
if (!indexResponse.ok) {
205208
const err = await indexResponse.json().catch(() => ({}))
206209
if (isUpgradeError(err)) {
207-
toast.error(extractErrorMessage(err, `${repo.name} too large`), {
208-
description: 'Join the Pro waitlist for higher limits',
209-
action: { label: 'Join Waitlist', onClick: () => setShowUpgradeModal(true) }
210-
})
210+
showUpgradeToast(err, `${repo.name} too large`, () => setShowUpgradeModal(true))
211211
continue
212212
}
213213
const errMsg = extractErrorMessage(err, 'Indexing failed to start')

0 commit comments

Comments
 (0)