.ts
TypeScript
(application/typescript)
// std
import { join, resolve } from "node:path";
// 1st-party
import type { ReqHandler } from "@ethicdevs/react-monolith";
// app
import { AppRoute, AppRoutesParams } from "../../routes";
import { Env } from "../../env";
// app services
import { makeRepositoryService } from "../../services/repository";
import { makeUsersService } from "../../services/user";
// app views
import RepositoryCreateView, {
  RepositoryCreateViewProps,
} from "../../views/repository/RepositoryCreateView";

const getRepositoryCreateView: 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,
      validation,
      validationContext,
    } = validationError;
    console.log("validation:", validation);
    console.log("validationContext:", validationContext);
    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, // TODO: Validate it exists first.
    repoSlug, // TODO: Validate it is not already taken first.
    repoData: {
      avatarUri: null,
      displayName,
      forkedFromRepoId: null,
      isFork: false,
      keywords: keywords.split(","),
      lastPushedAt: null,
      shortDescription,
      visibility,
      websiteUrl, // TODO: Ensure it resolves/has a TXT record in DNS pointing to us.
    },
    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 getRepositoryCreateView;