import type { ReqHandler } from "@ethicdevs/react-monolith";
import {
Organization,
OrganizationMembership,
Repository,
ResourceVisibility,
User,
} from "@prisma/client";
import { AppRoute, AppRoutesParams } from "../../routes";
import { makeOrganizationService } from "../../services/organization";
import OrganizationDetailsView, {
OrganizationDetailsViewProps,
} from "../../views/organization/OrganizationDetailsView";
const getOrganizationDetailsView: ReqHandler = async (request, reply) => {
const { curr_user_uid } = request.session.data;
const { orgSlug } =
request.params as AppRoutesParams[AppRoute.ORGANIZATION_DETAILS]["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;