Enable E-Tags for GUI and RAW

This commit is contained in:
Fabian Stamm
2020-08-02 16:33:41 +02:00
parent 5337b44b11
commit cece103504
7 changed files with 86 additions and 52 deletions

View File

@ -142,7 +142,7 @@ async function uploadPackage(ctx: ABC.Context) {
}
console.log("Setting new live version");
//TODO: Better option, since this could error whith multiple upload to the same package
//TODO: Better option, since this could error whith multiple uploads to the same package at the same time
await db.package.update(
{ name: packageName },
{

View File

@ -19,6 +19,7 @@ export default function raw(g: ABC.Group) {
ctx.params.path
);
if (!result) return E404();
return result;
ctx.response.headers.set("e-tag", result.etag);
return result.data;
});
}

View File

@ -1,29 +1,63 @@
import { ABC } from "../deps.ts";
import { basicauth, extractPackagePath } from "../utils.ts";
import { basicauth, extractPackagePath, sortVersions } from "../utils.ts";
import { Hash } from "../deps.ts";
import db, { IPackage } from "../db.ts";
const MAX_CACHE_AGE = 60 * 30; // 30 Minutes
const CACHE_CONTROL = "public, max-age=" + MAX_CACHE_AGE;
export default function views(g: ABC.Application) {
g.get(
"/",
async (ctx) => {
return ctx.render("index", {
search: ctx.queryParams["q"],
});
// const render = await IndexView();
// console.log(render);
// ctx.response.body = render;
// ctx.response.status = 200;
},
basicauth("views")
);
g.get(
"/package/:package",
async (ctx) => {
let [packageName, packageVersion] = extractPackagePath(
ctx.params.package
);
g.get("/", async (ctx) => {
ctx.response.headers.set("cache-control", CACHE_CONTROL);
return ctx.render("package", { packageName });
},
basicauth("views")
);
const search = ctx.queryParams.q;
let packages: IPackage[] = [];
if (search && search !== "") {
packages = await db.package.find({
name: RegExp(`${search}`),
});
} else {
packages = await db.package.find({});
}
const etag =
"W/" +
Hash.createHash("sha3-256")
.update(
packages
.map((e) => {
const sorted = e.versions.sort(sortVersions).reverse();
return e.name + sorted[0];
})
.join(":")
)
.toString("base64");
ctx.response.headers.set("e-tag", etag);
return ctx.render("index", {
packages,
search,
});
});
g.get("/package/:package", async (ctx) => {
let [packageName, packageVersion] = extractPackagePath(
ctx.params.package
);
const pkg = await db.package.findOne({ name: packageName });
const etag =
"W/" +
Hash.createHash("sha3-256")
.update(`${packageName}:${packageVersion}`)
.toString("base64");
await ctx.render("package", { pkg });
ctx.response.headers.set("cache-control", CACHE_CONTROL);
ctx.response.headers.set("E-Tag", etag);
});
}