import { ReqHandler } from "@ethicdevs/react-monolith";
import { AppRoute, AppRoutesParams } from "../../routes";
import { makeRepositoryService } from "../../services/repository";
import { makeUsersService } from "../../services/user";
import RepositoryDetailsView, {
RepositoryDetailsViewProps,
} from "../../views/repository/RepositoryDetailsView";
const getRepositoryDetailsView: ReqHandler = async (request, reply) => {
const { orgSlug, repoSlug } =
request.params as AppRoutesParams[AppRoute.REPOSITORY_DETAILS]["params"];
const usersService = makeUsersService({ request });
const repoService = makeRepositoryService({ request });
const currentUser =
request.session.data.authenticated &&
request.session.data.curr_user_uid != null
? await usersService.getUserById(request.session.data.curr_user_uid)
: null;
const ref = "HEAD";
const repo = await repoService.getRepository(orgSlug, repoSlug);
if (repo == null) {
return reply.status(404).callNotFound();
}
const reqHandler = reply.makeRequestHandler(request, reply);
try {
return reqHandler<RepositoryDetailsViewProps>(RepositoryDetailsView.name, {
currentUser,
cloneUrl: {
http: await repoService.getRepositoryHTTPCloneUrl(repo),
ssh: await repoService.getRepositorySSHCloneUrl(repo),
},
ref,
repo,
repoHead: await repoService.getRepositoryHead(repo, ref),
repoFiles: await repoService.getRepositoryFiles(repo, ref),
});
} catch (err) {
const error = err as Error;
if (error.message.includes("Not a valid object name HEAD")) {
return reqHandler<RepositoryDetailsViewProps>(
RepositoryDetailsView.name,
{
currentUser,
cloneUrl: {
http: await repoService.getRepositoryHTTPCloneUrl(repo),
ssh: await repoService.getRepositorySSHCloneUrl(repo),
},
ref,
repo,
repoHead: null,
repoFiles: [],
}
);
} else {
throw err;
}
}
};
export default getRepositoryDetailsView;