diff --git a/apps/server/src/pullRequest/GiteaPullRequestApi.ts b/apps/server/src/pullRequest/GiteaPullRequestApi.ts index 2871ab9e15b0..a2091367d57a 100644 --- a/apps/server/src/pullRequest/GiteaPullRequestApi.ts +++ b/apps/server/src/pullRequest/GiteaPullRequestApi.ts @@ -874,7 +874,7 @@ export const make = Effect.gen(function* () { viewer: input.viewer, page, limit: PAGE_SIZE, - includeTracking: input.includeTracking, + includeTracking: input.includeTracking === true, }); let rowsSeen = 0; let rowsSkipped = 0; @@ -911,7 +911,7 @@ export const make = Effect.gen(function* () { host: input.host, repository: input.repository, number, - includeTracking: input.includeTracking, + includeTracking: input.includeTracking === true, }); }, { concurrency: SEARCH_HYDRATION_CONCURRENCY }, @@ -1525,7 +1525,9 @@ export const make = Effect.gen(function* () { const getAutoMergeEnabled = Effect.fn("GiteaPullRequestApi.getAutoMergeEnabled")( function* (input: { host: string; repository: string; number: number }) { - const features = yield* getFeatures.pipe(Effect.orElseSucceed(() => [])); + const features = yield* getFeatures.pipe( + Effect.orElseSucceed((): ReadonlyArray => []), + ); if (features.includes("pull-auto-merge-state")) { return (yield* getPullRequest(input)).autoMergeEnabled; } @@ -1573,7 +1575,7 @@ export const make = Effect.gen(function* () { number: number; action: Extract; }) { - const features = yield* getFeatures.pipe(Effect.orElseSucceed(() => [])); + const features = yield* getFeatures.pipe(Effect.orElseSucceed((): ReadonlyArray => [])); if (features.includes("pull-draft")) { return yield* write({ operation: "runAction", @@ -1643,7 +1645,7 @@ export const make = Effect.gen(function* () { subjectIds: ReadonlyArray; }) { const supportsReviewReactions = (yield* getFeatures.pipe( - Effect.orElseSucceed(() => []), + Effect.orElseSucceed((): ReadonlyArray => []), )).includes("pull-review-reactions"); const targets: Array<{ readonly subjectId: string | undefined; @@ -2008,7 +2010,7 @@ export const make = Effect.gen(function* () { ...input, path: `${basePath(input.repository)}/teams`, }).pipe( - Effect.catchTag("GiteaPullRequestApiError", (error: GiteaPullRequestApiError) => + Effect.catch((error) => isGiteaApiError(error.cause) && error.cause.status === 405 ? Effect.succeed([]) : Effect.fail(error), @@ -2165,9 +2167,9 @@ export const make = Effect.gen(function* () { return Effect.gen(function* () { if ( target.kind === "review" && - !(yield* getFeatures.pipe(Effect.orElseSucceed(() => []))).includes( - "pull-review-reactions", - ) + !(yield* getFeatures.pipe( + Effect.orElseSucceed((): ReadonlyArray => []), + )).includes("pull-review-reactions") ) { return yield* new GiteaPullRequestApiError({ operation: "setReaction", diff --git a/apps/server/src/pullRequest/GiteaPullRequestProvider.ts b/apps/server/src/pullRequest/GiteaPullRequestProvider.ts index 1e1b2b7ecd92..35c4e59fd23e 100644 --- a/apps/server/src/pullRequest/GiteaPullRequestProvider.ts +++ b/apps/server/src/pullRequest/GiteaPullRequestProvider.ts @@ -144,8 +144,8 @@ export const make = Effect.gen(function* () { }) => giteaViewerPermissions({ canWrite: input.access.canWrite, - workflowApprovalSupported: input.workflowApprovalSupported, - revertSupported: input.revertSupported, + workflowApprovalSupported: input.workflowApprovalSupported === true, + revertSupported: input.revertSupported === true, ownsPullRequest: input.author !== undefined && input.author.toLowerCase() === input.viewer.toLowerCase(), updateMethods: input.access.updateMethods, @@ -195,7 +195,7 @@ export const make = Effect.gen(function* () { api .getWorkflowApprovals(input) .pipe(Effect.orElseSucceed(() => ({ supported: false, runs: [] }))), - api.getFeatures().pipe(Effect.orElseSucceed(() => [])), + api.getFeatures().pipe(Effect.orElseSucceed((): ReadonlyArray => [])), ], { concurrency: 4 }, ).pipe( @@ -326,7 +326,7 @@ export const make = Effect.gen(function* () { api.getPullRequest(input), api.getRepositoryAccess(input), api.getViewer(), - api.getFeatures().pipe(Effect.orElseSucceed(() => [])), + api.getFeatures().pipe(Effect.orElseSucceed((): ReadonlyArray => [])), ], { concurrency: 3, diff --git a/apps/server/src/pullRequest/GiteaWorkflows.test.ts b/apps/server/src/pullRequest/GiteaWorkflows.test.ts index 594ec5435eba..1ca1b9a0230d 100644 --- a/apps/server/src/pullRequest/GiteaWorkflows.test.ts +++ b/apps/server/src/pullRequest/GiteaWorkflows.test.ts @@ -1,10 +1,13 @@ import { assert, expect, it, vi } from "@effect/vitest"; import * as Effect from "effect/Effect"; import * as Option from "effect/Option"; +import * as Schema from "effect/Schema"; import * as GiteaApi from "../sourceControl/GiteaApi.ts"; import { isCurrentPullWorkflow, list } from "./GiteaWorkflows.ts"; +const encodeJson = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown)); + const run = { id: 7, needs_approval: true, @@ -33,7 +36,7 @@ it.effect("reads capped pages completely and selects only this PR's current bloc const request = vi.fn(); request.mockReturnValueOnce( Effect.succeed({ - body: JSON.stringify({ + body: encodeJson({ total_count: 2, workflow_runs: [{ ...run, pull_request_head_sha: "old" }], }), @@ -43,7 +46,7 @@ it.effect("reads capped pages completely and selects only this PR's current bloc ); request.mockReturnValueOnce( Effect.succeed({ - body: JSON.stringify({ total_count: 2, workflow_runs: [run] }), + body: encodeJson({ total_count: 2, workflow_runs: [run] }), truncated: false, headers: {}, }), @@ -62,7 +65,7 @@ it.effect("fails incomplete pagination instead of reporting no approvals", () => Effect.gen(function* () { const request = vi.fn(() => Effect.succeed({ - body: JSON.stringify({ total_count: 1, workflow_runs: [] }), + body: encodeJson({ total_count: 1, workflow_runs: [] }), truncated: false, headers: {}, }),