Further progress on registry UI.
Some checks failed
continuous-integration/drone/push Build is failing

Add package README view support and style adjustments
This commit is contained in:
Fabian Stamm
2020-07-31 20:16:12 +02:00
parent 0bee324519
commit 7fcdf2c383
13 changed files with 336 additions and 76 deletions

View File

@ -12,19 +12,40 @@ export default function api(g: ABC.Group) {
return { version: "1" };
});
// g.post("/getapikey", getApiKey, basicauth("api"));
g.post("/package/:name", uploadPackage, basicauth("api"));
}
// async function getApiKey(ctx: ABC.Context) {
// const key = v4.generate();
// await db.api_key.insert({
// user: ctx.customContext.user,
// key,
// createdAt: new Date(),
// lastAccess: undefined,
// lastIP: undefined,
// });
// return {
// key,
// };
// }
async function uploadPackage(ctx: ABC.Context) {
const reqId = v4.generate();
const filename = "./tmp/" + reqId + ".tar";
const folder = "./tmp/" + reqId;
try {
const packageName = ctx.params.name;
const packageName = ctx.params.name.toLowerCase();
if (!isValidPackageName(packageName))
throw new Error("Invalid package name");
if (!isValidPackageName(packageName)) {
return {
success: false,
message: "Invalid package name",
};
}
console.log("Writing body to tmp file:", filename);
const file = await Deno.open(filename, {
@ -53,7 +74,10 @@ async function uploadPackage(ctx: ABC.Context) {
console.log("Checking meta.json");
if (!meta?.version) {
throw new Error("No version available in meta.json");
return {
success: false,
message: "No version available in meta.json",
};
}
const packageVersion = meta.version;
@ -61,28 +85,42 @@ async function uploadPackage(ctx: ABC.Context) {
console.log("Checking correct version");
if (!isValidFullVersion(packageVersion)) {
throw new Error("Invalid version. Version must be in format: 0.0.0");
return {
success: false,
message: "Invalid version. Version must be in format: 0.0.0",
};
return;
}
console.log("Checking for previous uploads");
let packageMeta = await db.findOne({ name: packageName });
let packageMeta = await db.package.findOne({ name: packageName });
console.log(meta, packageMeta);
if (!packageMeta) {
packageMeta = {
name: packageName,
author: meta.author,
description: meta.description,
versions: [],
};
await db.insert(packageMeta);
await db.package.insert(packageMeta);
}
console.log("Check if version was uploaded before");
if (packageMeta.versions.find((e) => e === meta.version)) {
throw new Error("Version was already uploaded!");
return {
success: false,
message: "Version was already uploaded!",
};
}
packageMeta.author = meta.author;
packageMeta.description = meta.description;
const bucketBase = "packages/" + packageName + "/" + packageVersion + "/";
console.log("Uploading files to S3");
@ -107,7 +145,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
await db.update(
await db.package.update(
{ name: packageName },
{
$set: { versions: [...packageMeta.versions, packageVersion] },
@ -115,6 +153,9 @@ async function uploadPackage(ctx: ABC.Context) {
);
console.log("Finished successfully");
return {
success: true,
};
} catch (err) {
console.error("Error while processing newly uploaded package");
console.error(err);
@ -127,7 +168,4 @@ async function uploadPackage(ctx: ABC.Context) {
await Deno.remove(filename).catch(console.error);
await Deno.remove(folder, { recursive: true }).catch(console.error);
}
return {
success: true,
};
}

View File

@ -1,10 +1,5 @@
import { ABC } from "../deps.ts";
import { sortVersions, extractPackagePath } from "../utils.ts";
import db, { IPackage } from "../db.ts";
import bucket from "../s3.ts";
import { extractPackagePath, getFile } from "../utils.ts";
export default function raw(g: ABC.Group) {
g.get("/:package/*path", async (ctx) => {
@ -13,41 +8,17 @@ export default function raw(g: ABC.Group) {
ctx.params.package
);
const meta = await db.findOne({ name: packageName });
console.log(packageName, await db.findOne({ name: packageName }));
const E404 = () => {
ctx.response.status = 404;
ctx.response.body = "Not found!";
throw new Error("Not found!");
ctx.response.body = "// Not found!";
};
if (!meta || meta.versions.length < 1) return E404();
const versions = meta.versions.sort(sortVersions).reverse();
if (!packageVersion) {
packageVersion = versions[0];
} else {
const v = versions.filter((e) =>
e.startsWith(packageVersion as string)
);
if (v.length < 1) return E404();
packageVersion = v[0];
}
const bucketPath = (
"packages/" +
packageName +
"/" +
packageVersion +
"/" +
const result = await getFile(
packageName,
packageVersion,
ctx.params.path
).replace(/@/g, "§");
console.log("Getting file from:", bucketPath);
return (await bucket.getObject(bucketPath))?.body;
);
if (!result) return E404();
return result;
});
}

View File

@ -1,11 +1,13 @@
import { ABC } from "../deps.ts";
import { basicauth } from "../utils.ts";
import { basicauth, extractPackagePath } from "../utils.ts";
export default function views(g: ABC.Group) {
export default function views(g: ABC.Application) {
g.get(
"/",
async (ctx) => {
return ctx.render("index");
return ctx.render("index", {
search: ctx.queryParams["q"],
});
// const render = await IndexView();
// console.log(render);
// ctx.response.body = render;
@ -13,4 +15,15 @@ export default function views(g: ABC.Group) {
},
basicauth("views")
);
g.get(
"/package/:package",
async (ctx) => {
let [packageName, packageVersion] = extractPackagePath(
ctx.params.package
);
return ctx.render("package", { packageName });
},
basicauth("views")
);
}