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

const makeGetCurrentUserRepositoryForks: ServiceMethodFactory<
  RepositoryServiceDeps,
  [Repository],
  Promise<RepositoryWithParentAndForkedFromRepos[]>
> = ({ request }) => {
  return async (repository) => {
    if (request.session.data.curr_user_uid == null) {
      return [];
    }

    const currentUserForks = await request.prisma.repository.findMany({
      include: {
        organization: true,
        forkedFromRepo: {
          select: {
            id: true,
            slug: true,
            displayName: true,
            organization: {
              select: {
                id: true,
                slug: true,
                displayName: true,
              },
            },
          },
        },
        forks: {
          select: {
            _count: true,
          },
        },
      },
      where: {
        isFork: true,
        forkedFromRepo: {
          id: {
            equals: repository.id,
          },
        },
        organization: {
          OR: [
            {
              owner: {
                id: {
                  equals: request.session.data.curr_user_uid,
                },
              },
            },
            {
              memberships: {
                some: {
                  userId: {
                    equals: request.session.data.curr_user_uid,
                  },
                },
              },
            },
          ],
        },
      },
    });

    return currentUserForks;
  };
};

export default makeGetCurrentUserRepositoryForks;