Further progress on registry UI.
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is failing
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	continuous-integration/drone/push Build is failing
				
			Add package README view support and style adjustments
This commit is contained in:
		@ -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,
 | 
			
		||||
   };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
   });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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")
 | 
			
		||||
   );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user