From 6bcac29211ca54c9ad4f538e62bf7e878690a92c Mon Sep 17 00:00:00 2001 From: Caleb Braaten Date: Wed, 3 Apr 2024 18:18:32 -0700 Subject: [PATCH] First Commit --- database.ts | 25 +++++++++++++++++ index.html | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ index.ts | 28 +++++++++++++++++++ package.json | 9 ++++++ routes.ts | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 216 insertions(+) create mode 100644 database.ts create mode 100644 index.html create mode 100644 index.ts create mode 100644 package.json create mode 100644 routes.ts diff --git a/database.ts b/database.ts new file mode 100644 index 0000000..10d09ed --- /dev/null +++ b/database.ts @@ -0,0 +1,25 @@ +import { Database } from "bun:sqlite"; + +// all of these do the same thing +const db = new Database("mydb.sqlite"); +createTable(); + +function createTable() { + db.run(` + CREATE TABLE IF NOT EXISTS images ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + image BLOB, + type TEXT + ); + `); +} + +export const query_getImages = db.query(`SELECT id, type FROM images`); + +export const query_getImage = db.query( + `SELECT image, type FROM images WHERE id = $id`, +); + +export const query_saveImage = db.query( + `INSERT INTO images (image, type) VALUES ($image, $type) RETURNING id`, +); diff --git a/index.html b/index.html new file mode 100644 index 0000000..925678d --- /dev/null +++ b/index.html @@ -0,0 +1,77 @@ + + + + Image Uploader + + + +

Image Uploader

+
+ + + +
+
+ +
+ + + + diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..0658589 --- /dev/null +++ b/index.ts @@ -0,0 +1,28 @@ +import { getImages, getImage, saveImage } from "./routes"; + +const server = Bun.serve({ + port: 8080, + async fetch(req) { + const path = new URL(req.url).pathname; + + // send back the image paths uploaded + if (path === "/images") { + return await getImages(req); + } + + // send back the image that was uploaded + if (path.split("/")[1] === "image") { + return await getImage(req); + } + + // receive image upload fromt the client + if (req.method === "POST" && path === "/upload") { + return await saveImage(req); + } + + // default to sending back the web app + return new Response(Bun.file("./index.html")); + }, +}); + +console.log(`Listening on ${server.url}`); diff --git a/package.json b/package.json new file mode 100644 index 0000000..ba2e847 --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "scripts": { + "dev": "bun --hot run index.ts" + }, + "dependencies": {}, + "devDependencies": { + "@types/bun": "^1.0.8" + } +} diff --git a/routes.ts b/routes.ts new file mode 100644 index 0000000..90ba45f --- /dev/null +++ b/routes.ts @@ -0,0 +1,77 @@ +import { query_getImages, query_getImage, query_saveImage } from "./database"; + +export function getImages(req: Request): Promise { + return new Promise(async (resolve, reject) => { + let images = query_getImages.all(); + + if (!images) { + const ErrorResponse = new Response("No Images Found", { status: 404 }); + resolve(ErrorResponse); + } + + const imageList = await query_getImages.all(); + + console.log("imageList:", imageList); + + const response = Response.json({ images: imageList }); + resolve(response); + }); +} + +export function getImage(req: Request): Promise { + return new Promise(async (resolve, reject) => { + const path = new URL(req.url).pathname; + const entity = path.split("/")[2]; // images/1.png + const imageID = entity.split(".")[0]; //1 + + let image: any = query_getImage.get(imageID); // DB Call + + if (!image) { + const ErrorResponse = new Response("No Images Found", { status: 404 }); + reject(ErrorResponse); + } + + // Send image as response + const base64Image = image.image; + const buffer = Buffer.from(base64Image, "base64"); + + let response = new Response(new Blob([buffer]), { + headers: { "Content-Type": image.type }, + }); + resolve(response); + }); +} + +export function saveImage(req: Request): Promise { + const allowedFileTypes = ["image/png", "image/jpeg", "image/gif"]; + + return new Promise(async (resolve, reject) => { + const formdata = await req.formData(); + const image: Blob = formdata.get("image"); + + if (!image || allowedFileTypes.includes(image.type) === false) { + const ErrorResponse = new Response("Did not recieve valid image", { + status: 400, + }); + resolve(ErrorResponse); + } + + // Transform image to storage format + let buffer = await image.arrayBuffer(); + let base64Image = Buffer.from(buffer).toString("base64"); + + // Save image to DB + query_saveImage.get(base64Image, image.type); + + // buffer = Buffer.from(base64Image, "base64"); + + // // Testing getImage Logic as Well + // let response = new Response(new Blob([buffer]), { + // headers: { "Content-Type": image.type }, + // }); + // resolve(response); + + // Return Redirect(App Logic) + resolve(Response.redirect("/")); + }); +}