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

const makeCanUserAccessRepository: ServiceMethodFactory<
  RepositoryServiceDeps,
  [User, Repository],
  Promise<boolean>
> = ({ request }) => {
  return async (user, repo) => {
    const parentOrg = await request.prisma.organization.findUnique({
      include: {
        memberships: true,
      },
      where: {
        id: repo.organizationId,
      },
    });

    return (
      parentOrg != null &&
      (user.id === parentOrg.ownerId ||
        parentOrg.memberships.find(
          (m) => user.id === m.userId && m.revokedAt == null
        ) != null)
    );
  };
};

export default makeCanUserAccessRepository;