.ts
TypeScript
(application/typescript)
// 1st-party
import type { ServiceMethodFactory } from "@ethicdevs/react-monolith";
// generated via script[generate:prisma]
import { PullRequest, PullRequestState, Repository } from "@prisma/client";
// service
import type {
  PullRequestSelectOrIncludes,
  PullRequestServiceDeps,
} from "./types";

const getPullRequestsInRepository: ServiceMethodFactory<
  PullRequestServiceDeps,
  [
    Repository,
    PullRequestSelectOrIncludes | undefined,
    "all" | "open" | "merged" | "closed" | undefined,
  ],
  Promise<PullRequest[]>
> = ({ request }) => {
  return async (repository, selectOrIncludes, filter = "open") => {
    const pullRequestsInRepository = await request.prisma.pullRequest.findMany({
      ...(selectOrIncludes || {}),
      where: {
        targetRepositoryId: repository.id,
        AND:
          filter != null && filter !== "all"
            ? {
                state: {
                  equals: {
                    open: PullRequestState.OPEN,
                    merged: PullRequestState.CLOSE_MERGED,
                    closed: PullRequestState.CLOSE_DENIED,
                  }[filter],
                },
              }
            : undefined,
      },
    });

    return pullRequestsInRepository;
  };
};

export default getPullRequestsInRepository;