.ts
TypeScript
(application/typescript)
// 1st-party
import type { ServiceMethodFactory } from "@ethicdevs/react-monolith";
// generated via script[generate:prisma]
import { Repository, ResourceVisibility } from "@prisma/client";
// service
import type { RepositoryServiceDeps } from "./types";
import { default as makeGetHttpCloneUrl } from "./getHttpCloneUrl";
import { default as makeGetSshCloneUrl } from "./getSshCloneUrl";

const makeGetRepositoryExploreCollection: ServiceMethodFactory<
  RepositoryServiceDeps,
  void[],
  Promise<Repository[]>
> = (deps) => {
  const { request } = deps;
  const getHttpCloneUrl = makeGetHttpCloneUrl(deps);
  const getSshCloneUrl = makeGetSshCloneUrl(deps);
  return async () => {
    const repositories = await request.prisma.repository.findMany({
      where: {
        visibility: ResourceVisibility.PUBLIC,
      },
    });

    const repositoriesWithMetas = await Promise.all(
      repositories.map(async (repo) => ({
        ...repo,
        httpCloneUrl: await getHttpCloneUrl(repo),
        sshCloneUrl: await getSshCloneUrl(repo),
      }))
    );

    return repositoriesWithMetas;
  };
};

export default makeGetRepositoryExploreCollection;