.ts
TypeScript
(application/typescript)
// 1st-party
import type { ServiceMethodFactory } from "@ethicdevs/react-monolith";
import { GitServer } from "@ethicdevs/fastify-git-server";
// app
import { Const } from "../../const";
import { Env } from "../../env";
import { GitServerServiceDeps } from "./types";
import { getEnv } from "../../utils/server";

const makeOnPushEvent: ServiceMethodFactory<
  GitServerServiceDeps,
  [GitServer.Event],
  void
> = ({ request }) => {
  const env = getEnv();
  return ({ data, message }) => {
    if (data.packType === GitServer.PackType.RECEIVE) {
      // client has done something like "git push" it is uploading
      // server is receiving
      console.log("receive-pack");
      message.write("\n");

      const [orgSlug, repoSlug] = data.repoSlug.split("/");
      request.prisma.repository
        .findFirst({
          where: {
            slug: repoSlug,
            organization: {
              slug: orgSlug,
            },
          },
        })
        .then(async (repo) => {
          if (repo == null) return Promise.resolve(null);
          const updatedRepo = await request.prisma.repository.update({
            where: {
              id: repo.id,
            },
            data: {
              lastPushedAt: new Date(Date.now()),
            },
          });
          return updatedRepo;
        });

      const repoUrlPrefix = `${Env.DEPLOYMENT_SCHEME}://${Env.DEPLOYMENT_DOMAIN}`;
      const repoUrlSuffix = `${orgSlug}/${repoSlug}`;
      const repoUrlBase =
        env === "production"
          ? `${repoUrlPrefix}/${repoUrlSuffix}`
          : `${repoUrlPrefix}:${Env.PORT}/${repoUrlSuffix}`;

      if (data.payload != null) {
        message.write(
          `Hey ${data.username}, welcome back 🖖. See the details of your push at:\n`
        );
        if (data.payload.refType === "head") {
          message.write(`🔗 ${repoUrlBase}/show/${data.payload.commitId}\n`);
          if (data.payload.refName !== Const.PRIMARY_BRANCH_REF) {
            message.write(`\n`);
            message.write(
              `🚀 Quickly create a pull-request from this branch at:\n`
            );
            message.write(
              `🔗 ${repoUrlBase}/pulls/new?from_branch=${data.payload.refName}\n`
            );
          }
        } else if (data.payload.refType === "tag") {
          message.write(`🏷 ${repoUrlBase}/tags/${data.payload.refName}\n`);
        }
      }

      message.write("\n");
    } else if (data.packType === GitServer.PackType.UPLOAD) {
      // client has done something like "git clone" or "git fetch" or "git pull",
      // it is receiving, server is uploading
      console.log("upload-pack");
      // ⬇️ disabled because it seem to cause issues on git pull. ⬇️
      // message.write(`🖖 Welcome at GitFOSS ${data.username}!\n`);
    }

    // Finally, accept the payload from client
    message.accept();
  };
};

export default makeOnPushEvent;