import type { ServiceMethodFactory } from "@ethicdevs/react-monolith";
import { GitServer } from "@ethicdevs/fastify-git-server";
import { Const } from "../../const";
import { Env } from "../../env";
import { GitServerServiceDeps } from "./types";
import { getEnv } from "../../utils/server";
const toAscii = (str: string) => {
return (
str
.replace(
/[\p{Emoji_Presentation}\p{Extended_Pictographic}\p{Emoji}\uFE0F]/gu,
"",
)
);
};
const makeOnPushEvent: ServiceMethodFactory<
GitServerServiceDeps,
[GitServer.Event],
void
> = ({ request, repoService }) => {
const env = getEnv();
return ({ data, message }) => {
message.accept();
if (data.packType === GitServer.PackType.RECEIVE) {
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);
try {
const body = {
repo: `${orgSlug}/${repoSlug}`,
refType: data.payload!.refType,
refName: data.payload!.refName,
commitId: data.payload!.commitId,
username: data.username,
gitRepositoryDir: data.repoDiskPath,
packType: data.packType,
timestamp: Date.now(),
};
const res = await fetch(
`https://gitfoss.dev/${orgSlug}/${repoSlug}/pipelines/trigger`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(body),
},
);
console.log(
`/${orgSlug}/${repoSlug}/pipelines/trigger`,
body,
await res.text(),
);
if (!res.ok) {
console.log("could not trigger pipeline run:", res.statusText);
return;
}
const ciManifest = await repoService!.getRepositoryFileContent(
repo,
".gitfoss.ci",
data.payload!.refName,
);
console.log(
"ci manifest:",
`${orgSlug}/${repoSlug}` + "/.gitfoss.ci:\n",
ciManifest,
data.payload,
);
} catch (err) {
console.log(
"could not get ci manifest:",
`${orgSlug}/${repoSlug}`,
"/.gitfoss.ci",
);
}
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}`;
if (data.payload != null) {
message.write(toAscii(`Hey ${data.username}, welcome back 🖖.\n\n`));
message.write(toAscii(`📖 See the details of your push at:\n`));
if (data.payload.refType === "head") {
message.write(
toAscii(`🔗 ${repoUrlBase}/show/${data.payload.commitId}\n`),
);
if (data.payload.refName !== Const.PRIMARY_BRANCH_REF) {
message.write(`\n`);
message.write(
toAscii(
`🚀 Quickly create a pull-request from this branch at:\n`,
),
);
message.write(
toAscii(
`🔗 ${repoUrlBase}/pulls/new?from_branch=${encodeURIComponent(
data.payload.refName,
)}\n`,
),
);
}
} else if (data.payload.refType === "tag") {
message.write(
toAscii(
`🏷 ${repoUrlBase}/tags/${encodeURIComponent(
data.payload.refName,
)}\n`,
),
);
}
}
message.write("\n");
fetch(`${repoUrlBase}/pipelines/trigger`, {
method: 'POST',
body: {},
})
.catch((err) => {
console.log(`Can not trigger the pipeline: ${err.message}`);
});
} else if (data.packType === GitServer.PackType.UPLOAD) {
console.log("upload-pack");
console.log("upload-pack:", data, message);
}
};
};
export default makeOnPushEvent;