GitFOSS
.ts
TypeScript
(application/typescript)
// 1st-party
import type { ReqHandler } from "@ethicdevs/react-monolith";
import {
  Organization,
  OrganizationMembership,
  Repository,
  ResourceVisibility,
  User,
} from "@prisma/client";
// app
import { AppRoute, AppRouteParams } from "../../routes.defs";
// app services
import { makeOrganizationService } from "../../services/organization";
// app views
import OrganizationDetailsView, {
  OrganizationDetailsViewProps,
} from "../../views/organization/OrganizationDetailsView";

const getOrganizationDetailsView: ReqHandler<
  AppRouteParams,
  AppRoute.ORGANIZATION_DETAILS
> = async (request, reply) => {
  const { curr_user_uid } = request.session.data;
  const { orgSlug } = request.params;

  const orgService = makeOrganizationService({ request });
  const organization = (await orgService.getOrganizationBySlug(orgSlug, {
    memberships: true,
    owner: true,
    repositories: {
      where: { visibility: ResourceVisibility.PUBLIC },
      orderBy: {
        lastPushedAt: {
          sort: "desc",
          nulls: "last",
        },
      },
    },
  })) as Organization & {
    memberships: OrganizationMembership[];
    owner: User;
    repositories: Repository[];
  };

  if (organization == null) {
    return reply.status(404).callNotFound();
  }

  const currentUserIsOwner =
    curr_user_uid != null && organization.owner.id === curr_user_uid;
  const currentUserMembership =
    curr_user_uid != null
      ? organization.memberships.find(
          (member) => member.userId === curr_user_uid
        ) || null
      : null;

  if (
    currentUserIsOwner ||
    (currentUserMembership != null && currentUserMembership.revokedAt == null)
  ) {
    organization.repositories = await orgService.getOrganizationRepositories(
      organization
    );
  }

  const reqHandler = reply.makeRequestHandler(request, reply);
  return reqHandler<OrganizationDetailsViewProps>(
    OrganizationDetailsView.name,
    {
      organization,
    }
  );
};

export default getOrganizationDetailsView;