Skip to content

Commit 3ec5c95

Browse files
committed
fix: propagate errors in resolveOrgAllTarget and surface AuthError in findEventAcrossOrgs
- resolveOrgAllTarget: errors from resolveEventInOrg now propagate instead of falling back to resolveOrgAndProject. When the user provided an explicit org via URL, auth/network errors should be surfaced rather than silently resolving a different org. - findEventAcrossOrgs: if any per-org call throws AuthError, propagate it immediately. Auth errors indicate a global problem (expired/missing token), not a per-org miss. Transient per-org failures (network, 5xx) are still swallowed since other orgs may succeed.
1 parent 077bb91 commit 3ec5c95

File tree

3 files changed

+27
-34
lines changed

3 files changed

+27
-34
lines changed

src/commands/event/view.ts

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -207,31 +207,29 @@ export async function resolveEventTarget(
207207

208208
/**
209209
* Resolve target when only an org is known (e.g., from a Sentry event URL).
210-
* Uses the eventids endpoint to find the project, falls back to auto-detect.
210+
* Uses the eventids endpoint to find the project directly.
211+
*
212+
* Returns null if the event is not found in the given org.
213+
* Propagates auth/network errors — if the user provided an explicit org
214+
* via URL, errors should surface rather than silently resolving a different org.
211215
*/
212216
/** @internal Exported for testing */
213217
export async function resolveOrgAllTarget(
214218
org: string,
215219
eventId: string,
216-
cwd: string
220+
_cwd: string
217221
): Promise<ResolvedEventTarget | null> {
218-
try {
219-
const resolved = await resolveEventInOrg(org, eventId);
220-
if (resolved) {
221-
return {
222-
org: resolved.org,
223-
project: resolved.project,
224-
orgDisplay: org,
225-
projectDisplay: resolved.project,
226-
prefetchedEvent: resolved.event,
227-
};
228-
}
229-
} catch {
230-
// Auth or network errors — fall through to auto-detect below
231-
return resolveOrgAndProject({ cwd, usageHint: USAGE_HINT });
222+
const resolved = await resolveEventInOrg(org, eventId);
223+
if (!resolved) {
224+
return null;
232225
}
233-
// Event not found in the explicit org — don't silently switch orgs
234-
return null;
226+
return {
227+
org: resolved.org,
228+
project: resolved.project,
229+
orgDisplay: org,
230+
projectDisplay: resolved.project,
231+
prefetchedEvent: resolved.event,
232+
};
235233
}
236234

237235
/**

src/lib/api-client.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,6 +1274,13 @@ export async function findEventAcrossOrgs(
12741274
if (result.status === "fulfilled" && result.value !== null) {
12751275
return result.value;
12761276
}
1277+
// Propagate auth errors immediately — they indicate a global problem
1278+
// (expired/missing token) rather than a per-org miss, so the user needs
1279+
// to know. Transient per-org failures (network, 5xx) are swallowed since
1280+
// other orgs may still succeed.
1281+
if (result.status === "rejected" && result.reason instanceof AuthError) {
1282+
throw result.reason;
1283+
}
12771284
}
12781285
return null;
12791286
}

test/commands/event/view.test.ts

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -520,16 +520,13 @@ describe("resolveEventTarget", () => {
520520

521521
describe("resolveOrgAllTarget", () => {
522522
let resolveEventInOrgSpy: ReturnType<typeof spyOn>;
523-
let resolveOrgAndProjectSpy: ReturnType<typeof spyOn>;
524523

525524
beforeEach(() => {
526525
resolveEventInOrgSpy = spyOn(apiClient, "resolveEventInOrg");
527-
resolveOrgAndProjectSpy = spyOn(resolveTarget, "resolveOrgAndProject");
528526
});
529527

530528
afterEach(() => {
531529
resolveEventInOrgSpy.mockRestore();
532-
resolveOrgAndProjectSpy.mockRestore();
533530
});
534531

535532
test("returns resolved target when event found in org", async () => {
@@ -553,22 +550,13 @@ describe("resolveOrgAllTarget", () => {
553550
const result = await resolveOrgAllTarget("acme", "notfound", "/tmp");
554551

555552
expect(result).toBeNull();
556-
expect(resolveOrgAndProjectSpy).not.toHaveBeenCalled();
557553
});
558554

559-
test("falls back to auto-detect when resolveEventInOrg throws", async () => {
560-
resolveEventInOrgSpy.mockRejectedValue(new Error("Auth failed"));
561-
resolveOrgAndProjectSpy.mockResolvedValue({
562-
org: "acme",
563-
project: "cli",
564-
orgDisplay: "acme",
565-
projectDisplay: "cli",
566-
});
567-
568-
const result = await resolveOrgAllTarget("acme", "abc123", "/tmp");
555+
test("propagates errors from resolveEventInOrg", async () => {
556+
const err = new Error("Auth failed");
557+
resolveEventInOrgSpy.mockRejectedValue(err);
569558

570-
expect(result?.org).toBe("acme");
571-
expect(resolveOrgAndProjectSpy).toHaveBeenCalled();
559+
expect(resolveOrgAllTarget("acme", "abc123", "/tmp")).rejects.toBe(err);
572560
});
573561
});
574562

0 commit comments

Comments
 (0)