import { join, resolve } from "node:path";
import type { ReqHandler } from "@ethicdevs/react-monolith";
import { AppRoute, AppRoutesParams } from "../../routes";
import { Env } from "../../env";
import { makeRepositoryService } from "../../services/repository";
import { makeUsersService } from "../../services/user";
import RepositoryCreateView, {
RepositoryCreateViewProps,
} from "../../views/repository/RepositoryCreateView";
const getRepositoryCreateAction: ReqHandler = async (request, reply) => {
if (
request.session.data.authenticated === false ||
request.session.data.curr_user_uid == null
) {
reply.redirect(302, request.namedViewsPathMap[AppRoute.AUTH_LOGIN]);
return reply;
}
const reqHandler = reply.makeRequestHandler(request, reply);
const repoService = makeRepositoryService({ request });
const usersService = makeUsersService({ request });
const { body, validationError } = request;
if (validationError != null) {
const { message: errorMessage } = validationError;
return reqHandler<RepositoryCreateViewProps>(RepositoryCreateView.name, {
errorMessage,
availableParentOrgs: await usersService.getUserOrganizations(
request.session.data.curr_user_uid
),
});
}
const {
parent_org_slug: parentOrgSlug,
repo_slug: repoSlug,
repo_display_name: displayName,
repo_init_license_file: withLicense,
repo_init_license_kind: withLicenseKind,
repo_init_readme_file: withBaseReadmeFile,
repo_keywords: keywords,
repo_short_description: shortDescription,
repo_visibility: visibility,
repo_website_url: websiteUrl,
} = body as AppRoutesParams[AppRoute.REPOSITORY_CREATE_ACTION]["body"];
const newRepo = await repoService.createRepository({
parentOrgSlug,
repoSlug,
repoData: {
avatarUri: null,
displayName,
forkedFromRepoId: null,
isFork: false,
keywords: keywords.split(","),
lastPushedAt: null,
shortDescription,
visibility,
websiteUrl,
},
repoInitFlags: {
orgRepositoriesDir: resolve(
join(Env.GIT_REPOSITORIES_ROOT, parentOrgSlug)
),
withBaseReadmeFile: withBaseReadmeFile === "on",
withLicense: withLicense === "on",
withLicenseKind,
},
});
reply.redirect(302, `/${parentOrgSlug}/${newRepo.slug}`);
return reply;
};
export default getRepositoryCreateAction;