summaryrefslogtreecommitdiff
path: root/hooks/mod.ts
blob: 767720a4806c59c141a488befd1da65f81be2553 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/env -S deno run --allow-env --allow-net

import { getRequiredEnv, getStdout, validateIdentifier } from "@liz-ci/utils";

const getRequestLogger = (req: Request) => {
  const id = crypto.randomUUID();
  const url = new URL(req.url);
  const method = req.method;
  const getPrefix = () =>
    `[${new Date().toISOString()}] Request [${id}] @ [${url}] -X [${method}] |`;
  return {
    log: (...args: unknown[]) => console.log(getPrefix(), ...args),
    error: (...args: unknown[]) => console.error(getPrefix(), ...args),
  };
};

const addr = { port: 9000, hostname: "0.0.0.0" };
Deno.serve(addr, async (req) => {
  const logger = getRequestLogger(req);
  logger.log("Request initiated");

  const { pathname } = new URL(req.url);
  if (pathname === "/health") {
    try {
      getRequiredEnv("LAMINAR_HOST");
      await getStdout(["laminarc", "show-jobs"]);
      return new Response("think im healthy. lets get to work.", {
        status: 200,
      });
    } catch (e) {
      logger.error(e);
      return new Response("i need to eat more vegetables -.-", { status: 500 });
    }
  }

  if (req.method !== "POST") {
    return new Response("invalid method", {
      status: 405,
    });
  }

  if (pathname === "/checkout_ci") {
    const { remote, rev, refname } = await req.json();
    if (![remote, rev, refname].every(validateIdentifier)) {
      return new Response("invalid request", {
        status: 400,
      });
    }

    try {
      const laminar = await getStdout([
        "laminarc",
        "queue",
        "checkout_ci",
        `remote="${remote}"`,
        `rev="${rev}"`,
        `refname="${refname}"`,
      ]);
      logger.log(`successful ci queue :D\n` + laminar);
      return new Response(laminar, {
        status: 200,
      });
    } catch (e) {
      logger.error(e);
      return new Response("womp womp D:", {
        status: 500,
      });
    }
  }

  return new Response("ahhhh idkkkk", { status: 404 });
});