aboutsummaryrefslogtreecommitdiff
path: root/src/index.ts
blob: d592405dc86dabfebdf81944f04689f2efb7c86b (plain) (blame)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import dotenv from "dotenv";
import express from "express";
import { badgen } from "badgen";
import path from "path";
import fs from "fs";

import formats from "./formats";
import metadata from "./metadata";

// Start-up configuration
dotenv.config();
const PORT = process.env.PORT ? Number(process.env.PORT) : 3000;
const TOKEN = process.env.TOKEN || "";
const HOST_DIR =
  process.env.HOST_DIR ||
  (() => {
    throw Error("HOST_DIR must be defined");
  })();

const app: express.Application = express();

// serve script for posting coverage report
app.use("/bash", express.static(path.join(__dirname, "..", "public", "bash")));

// Upload HTML file
app.post("/v1/:org/:repo/:branch/:commit.html", (req, res) => {
  const { org, repo, branch, commit } = req.params;
  console.info(
    "POST request to /v1/%s/%s/%s/%s.html",
    org,
    repo,
    branch,
    commit
  );

  const { token, format } = req.query;
  //TODO @Metadata token should come from metadata
  if (token != TOKEN) {
    return res.status(401).send("Invalid token");
  }

  const reporter = format || "tarpaulin";
  if (!formats.list_formats().includes(reporter)) {
    return res.status(406).send("Report format unknown");
  }

  //TODO acquire file, verify file size/content type (HTML)
  const contents = "";
  //req.on('data', (raw) => {});
  //req.on('end', () => {});

  const doc = new DOMParser().parseFromString(contents, "text/html");
  const formatter = formats.get_format(reporter);
  let coverage: number;
  try {
    coverage = formatter.parse_coverage(doc);
  } catch {
    return res.status(400).send("Invalid report document");
  }

  const badge = badgen({
    label: "coverage",
    status: Math.floor(coverage).toString() + "%",
    //TODO @Metadata stage values should come from metadata
    color: formatter.match_color(coverage, 95, 80)
  });
  //TODO store coverage % badge at %HOST_DIR%/%org%/%repo%/%commit%/badge.svg
  //TODO store report file at %HOST_DIR%/%org%/%repo%/%commit%/index.html

  //TODO @Metadata set branch alias for badge / report file

  return res.status(501).send();
});

app.get("/v1/:org/:repo/:branch.svg", (req, res) => {
  const { org, repo, branch } = req.params;
  console.info("GET request to /v1/%s/%s/%s.svg", org, repo, branch);

  //TODO @Metadata get the commit @@ via metadata
  //TODO send the badge file
  return res.status(501).send();
});

app.get("/v1/:org/:repo/:branch.html", (req, res) => {
  const { org, repo, branch } = req.params;
  console.info("GET request to /v1/%s/%s/%s.html", org, repo, branch);

  //TODO @Metadata get the commit @@ via metadata
  //TODO send the report file
  return res.status(501).send();
});

// provide hard link for commit
app.get("/v1/:org/:repo/:branch/:commit.svg", (req, res) => {
  const { org, repo, branch, commit } = req.params;
  console.info("GET request to /v1/%s/%s/%s/%s.svg", org, repo, branch, commit);

  //TODO send the badge file
  return res.status(501).send();
});

// provide hard link for commit
app.get("/v1/:org/:repo/:branch/:commit.html", (req, res) => {
  const { org, repo, branch, commit } = req.params;
  console.info(
    "GET request to /v1/%s/%s/%s/%s.html",
    org,
    repo,
    branch,
    commit
  );

  //TODO send the report file
  return res.status(501).send();
});

app.listen(PORT, () => {
  console.log("Express started on port " + PORT);
});