Skip to content

Commit f4836b4

Browse files
committed
Fix Bitbucket API: send explicit state params for 'all' and remove dead code
- Fix toBitbucketState returning null for 'all', which caused the Bitbucket REST API to default to returning only OPEN pull requests. Changed to toBitbucketStates returning an array, and use appendUrlParam to send OPEN, MERGED, DECLINED, and SUPERSEDED state params when listing all pull requests. - Remove unused exported functions (decodeBitbucketPullRequestListJson, decodeBitbucketPullRequestJson, formatBitbucketJsonDecodeError) and their internal helpers from bitbucketPullRequests.ts, along with now-unused imports.
1 parent ce43a84 commit f4836b4

2 files changed

Lines changed: 16 additions & 65 deletions

File tree

apps/server/src/sourceControl/BitbucketApi.ts

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,16 @@ function sourceWorkspace(input: {
162162
return ownerSelector?.[1]?.trim();
163163
}
164164

165-
function toBitbucketState(state: "open" | "closed" | "merged" | "all"): string | null {
165+
function toBitbucketStates(state: "open" | "closed" | "merged" | "all"): ReadonlyArray<string> {
166166
switch (state) {
167167
case "open":
168-
return "OPEN";
168+
return ["OPEN"];
169169
case "closed":
170-
return "DECLINED";
170+
return ["DECLINED"];
171171
case "merged":
172-
return "MERGED";
172+
return ["MERGED"];
173173
case "all":
174-
return null;
174+
return ["OPEN", "MERGED", "DECLINED", "SUPERSEDED"];
175175
}
176176
}
177177

@@ -405,26 +405,24 @@ export const make = Effect.fn("makeBitbucketApi")(function* () {
405405
listPullRequests: (input) =>
406406
resolveRepository(input).pipe(
407407
Effect.flatMap((repository) => {
408-
const state = toBitbucketState(input.state);
408+
const states = toBitbucketStates(input.state);
409409
const query: Record<string, string> = {
410410
pagelen: String(Math.max(1, Math.min(input.limit ?? 20, 50))),
411411
sort: "-updated_on",
412412
q: `source.branch.name = "${sourceBranch(input).replaceAll('"', '\\"')}"`,
413413
};
414-
if (state !== null) {
415-
query.state = state;
416-
}
417414

418-
return executeJson(
419-
"listPullRequests",
420-
HttpClientRequest.get(
421-
apiUrl(
422-
`/repositories/${encodeURIComponent(repository.workspace)}/${encodeURIComponent(repository.repoSlug)}/pullrequests`,
423-
),
424-
{ urlParams: query },
415+
let request = HttpClientRequest.get(
416+
apiUrl(
417+
`/repositories/${encodeURIComponent(repository.workspace)}/${encodeURIComponent(repository.repoSlug)}/pullrequests`,
425418
),
426-
BitbucketPullRequestListSchema,
419+
{ urlParams: query },
427420
);
421+
for (const s of states) {
422+
request = HttpClientRequest.appendUrlParam(request, "state", s);
423+
}
424+
425+
return executeJson("listPullRequests", request, BitbucketPullRequestListSchema);
428426
}),
429427
Effect.map((list) => list.values.map(normalizeBitbucketPullRequestRecord)),
430428
),

apps/server/src/sourceControl/bitbucketPullRequests.ts

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { Cause, DateTime, Exit, Option, Result, Schema } from "effect";
1+
import { DateTime, Option, Schema } from "effect";
22
import { PositiveInt, TrimmedNonEmptyString } from "@t3tools/contracts";
3-
import { decodeJsonResult, formatSchemaError } from "@t3tools/shared/schemaJson";
43

54
export interface NormalizedBitbucketPullRequestRecord {
65
readonly number: number;
@@ -103,49 +102,3 @@ export function normalizeBitbucketPullRequestRecord(
103102
...(headRepositoryOwnerLogin ? { headRepositoryOwnerLogin } : {}),
104103
};
105104
}
106-
107-
const decodeBitbucketPullRequestList = decodeJsonResult(Schema.Unknown);
108-
const decodeBitbucketPullRequest = decodeJsonResult(BitbucketPullRequestSchema);
109-
const decodeBitbucketPullRequestEntry = Schema.decodeUnknownExit(BitbucketPullRequestSchema);
110-
111-
export const formatBitbucketJsonDecodeError = formatSchemaError;
112-
113-
export function decodeBitbucketPullRequestListJson(
114-
raw: string,
115-
): Result.Result<
116-
ReadonlyArray<NormalizedBitbucketPullRequestRecord>,
117-
Cause.Cause<Schema.SchemaError>
118-
> {
119-
const result = decodeBitbucketPullRequestList(raw);
120-
if (Result.isFailure(result)) {
121-
return Result.fail(result.failure);
122-
}
123-
124-
const entries: ReadonlyArray<unknown> = Array.isArray(result.success)
125-
? result.success
126-
: typeof result.success === "object" &&
127-
result.success !== null &&
128-
"values" in result.success &&
129-
Array.isArray(result.success.values)
130-
? result.success.values
131-
: [];
132-
const pullRequests: NormalizedBitbucketPullRequestRecord[] = [];
133-
for (const entry of entries) {
134-
const decodedEntry = decodeBitbucketPullRequestEntry(entry);
135-
if (Exit.isFailure(decodedEntry)) {
136-
continue;
137-
}
138-
pullRequests.push(normalizeBitbucketPullRequestRecord(decodedEntry.value));
139-
}
140-
return Result.succeed(pullRequests);
141-
}
142-
143-
export function decodeBitbucketPullRequestJson(
144-
raw: string,
145-
): Result.Result<NormalizedBitbucketPullRequestRecord, Cause.Cause<Schema.SchemaError>> {
146-
const result = decodeBitbucketPullRequest(raw);
147-
if (Result.isSuccess(result)) {
148-
return Result.succeed(normalizeBitbucketPullRequestRecord(result.success));
149-
}
150-
return Result.fail(result.failure);
151-
}

0 commit comments

Comments
 (0)