.ts
TypeScript
(application/typescript)
// 1st-party
import type { ServiceMethodFactory } from "@ethicdevs/react-monolith";
import {
  Artefact,
  Pipeline,
  PipelineStatus,
  Repository,
  Stage,
  User,
} from "@prisma/client";
import type { PipelineServiceDeps, PipelinesFilter } from "./types";

const makeListByRepo: ServiceMethodFactory<
  PipelineServiceDeps,
  [string, string],
  Promise<
    (Pipeline & {
      stages: Stage[];
      triggeredByUser: Omit<User, "hashedPassword" | "email"> | null;
      artefacts: Artefact[];
      repo: Repository;
    })[]
  >
> = ({ request }) => {
  return async (
    orgSlug: string,
    repoSlug: string,
    filter?: PipelinesFilter,
  ) => {
    return request.prisma.pipeline.findMany({
      where: {
        repo: {
          organization: {
            slug: orgSlug,
          },
          slug: repoSlug,
        },
        status:
          filter != null && filter !== "all"
            ? {
                passed: PipelineStatus.PASSED,
                pending: PipelineStatus.PENDING,
                running: PipelineStatus.RUNNING,
                failed: PipelineStatus.FAILED,
                canceled: PipelineStatus.CANCELED,
              }[filter || "passed"]
            : undefined,
      },
      orderBy: { createdAt: "desc" },
      include: {
        stages: true,
        triggeredByUser: {
          select: {
            id: true,
            username: true,
            avatarUri: true,
            createdAt: true,
            updatedAt: true,
            displayName: true,
            role: true,
          },
        },
        artefacts: true,
        repo: true,
      },
    });
  };
};

export default makeListByRepo;