GitFOSS
.ts
TypeScript
(application/typescript)
// 1st-party
import type { ServiceMethodFactory } from "@ethicdevs/react-monolith";
import { GitServer } from "@ethicdevs/fastify-git-server";
// app
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 }) => {
    message.write("\n");
    if (data.packType === GitServer.PackType.RECEIVE) {
      // client has done something like "git push" it is uploading
      // server is receiving
      console.log("receive-pack");

      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 baseUrl =
        env === "development"
          ? `${Env.DEPLOYMENT_SCHEME}://${Env.DEPLOYMENT_DOMAIN}:${Env.PORT}/${orgSlug}/${repoSlug}`
          : `${Env.DEPLOYMENT_SCHEME}://${Env.DEPLOYMENT_DOMAIN}/${orgSlug}/${repoSlug}`;

      if (data.payload != null) {
        message.write("🖖 See the details of your push at:\n");
        if (data.payload.refType === "head") {
          message.write(`🧲 ${baseUrl}/show/${data.payload.commitId}\n`);
        } else if (data.payload.refType === "tag") {
          message.write(`➡️ ${baseUrl}/tags/${data.payload.refName}\n`);
        }
      }
    } else if (data.packType === GitServer.PackType.UPLOAD) {
      // client has done something like "git clone" it is receiving
      // server is uploading
      console.log("upload-pack");
      message.write(`🖖 Welcome at GitFOSS ${data.username}!\n`);
    }
    message.write("\n");
    message.accept();
  };
};

export default makeOnPushEvent;