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

const getUserRepositories: ServiceMethodFactory<
  UsersServiceDeps,
  [User, undefined | Prisma.RepositoryWhereInput],
  Promise<(Repository & { parentOrg: Organization })[]>
> = ({ request }) => {
  return async (user, where = undefined) => {
    const userRepos = await request.prisma.repository.findMany({
      include: {
        organization: true,
      },
      where: where || {
        OR: [
          {
            organization: {
              ownerId: user.id,
            },
          },
          {
            organization: {
              memberships: {
                some: {
                  userId: user.id,
                },
              },
            },
          },
        ],
      },
      orderBy: {
        lastPushedAt: "desc",
      },
    });

    return userRepos.map(({ organization: parentOrg, ...repo }) => ({
      ...repo,
      parentOrg,
    }));
  };
};

export default getUserRepositories;