gitfoss | df4e02564b20688e6a264ce3b5848ed45259032b | app/services/gitServer/onFetchEvent.ts ∙ GitFOSS
.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 makeOnFetchEvent: ServiceMethodFactory<
  GitServerServiceDeps,
  [GitServer.Event],
  void
> = ({ request }) => {
  const env = getEnv();
  return ({ type, data, message }) => {
    console.log("upload-pack", type, data, message);

    if (data.packType === GitServer.PackType.UPLOAD) {
      // client has done something like "git fetch/pull" it is receiving
      // server is uploading to client

      console.log("git.onFetchEvent:", data, message);

      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}${Env.DEPLOYMENT_SCHEME !== "https" ? `:${Env.PORT}` : ""}`;
      const repoUrlSuffix = `${orgSlug}/${repoSlug}`;
      const repoUrlBase =
        env === "production"
          ? `${repoUrlPrefix}/${repoUrlSuffix}`
          : `${repoUrlPrefix}:${Env.PORT}/${repoUrlSuffix}`;

      // message.write(`Hey ${data.username}, welcome back.\n\n`);
      // message.write(toAscii(`📖 See the details of your push at:\n`));

      console.log("repoUrlBase:", repoUrlBase);
      console.log("payload:", data.payload);

      // if (data.payload.refType === "head") {
      //   console.log("refType:", "branch");
      // }
      // if (data.payload.refType === "tag") {
      //   console.log("refType:", "tag");
      // }
    }

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

export default makeOnFetchEvent;