Add handler for file upload and download
This commit is contained in:
parent
2aa363fb11
commit
7ba432faa9
@ -30,9 +30,10 @@ const port =
|
||||
|
||||
app.use(express.static("public"));
|
||||
|
||||
app.use(bodyParser.raw());
|
||||
app.use(bodyParser.raw({ limit: "10mb" }));
|
||||
|
||||
app.use("/scene/:id", restHandler("scene"));
|
||||
app.use("/scene/*", restHandler("scene"));
|
||||
app.use("/file/*", restHandler("file"));
|
||||
|
||||
app.get("/", (req, res) => {
|
||||
res.send("Excalidraw collaboration server is up :)");
|
||||
|
||||
@ -1,77 +1,75 @@
|
||||
import type { RequestHandler } from "express";
|
||||
|
||||
interface Scene {
|
||||
interface Resource {
|
||||
hash: string;
|
||||
data: ArrayBuffer;
|
||||
}
|
||||
|
||||
export function restHandler(_resourceName: string): RequestHandler {
|
||||
const scenes: Record<string, Scene> = {};
|
||||
export function restHandler(_resName: string): RequestHandler {
|
||||
const resources: Record<string, Resource> = {};
|
||||
|
||||
const _put: RequestHandler = (req, res, next) => {
|
||||
const sceneId = req.params.id;
|
||||
const newSceneData = req.body as ArrayBuffer;
|
||||
const newSceneHash = req.header("ETag");
|
||||
const oldSceneHash = req.header("If-Match");
|
||||
console.log(oldSceneHash, newSceneHash, newSceneData);
|
||||
const resId = req.params[0];
|
||||
const newData = req.body as ArrayBuffer;
|
||||
const newHash = req.header("ETag");
|
||||
const oldHash = req.header("If-Match");
|
||||
|
||||
if (!newSceneHash || !newSceneData) {
|
||||
if (!newHash || !newData) {
|
||||
res.status(400).send("Data or hash not provided.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (scenes[sceneId] && scenes[sceneId].hash != oldSceneHash) {
|
||||
if (resources[resId] && resources[resId].hash != oldHash) {
|
||||
res.status(409).send("Hash mismatch. Update denied.");
|
||||
return;
|
||||
}
|
||||
|
||||
scenes[sceneId] = {
|
||||
hash: newSceneHash,
|
||||
data: newSceneData,
|
||||
resources[resId] = {
|
||||
hash: newHash,
|
||||
data: newData,
|
||||
};
|
||||
|
||||
res.status(200).send(`Scene with ID ${sceneId} has been upserted.`);
|
||||
res.status(200).send(`Resource with ID ${resId} has been upserted.`);
|
||||
next();
|
||||
};
|
||||
|
||||
const _get: RequestHandler = (req, res, next) => {
|
||||
const sceneId = req.params.id;
|
||||
const oldSceneHash = req.header("If-None-Match");
|
||||
const resId = req.params[0];
|
||||
const oldHash = req.header("If-None-Match");
|
||||
|
||||
if (!scenes[sceneId]) {
|
||||
if (!resources[resId]) {
|
||||
res.status(404).send("Not found.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (scenes[sceneId] && scenes[sceneId].hash == oldSceneHash) {
|
||||
if (resources[resId] && resources[resId].hash == oldHash) {
|
||||
res.status(304).send("Not modified.");
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Respect If-None-Match header
|
||||
|
||||
const scene = scenes[sceneId];
|
||||
res.header("ETag", scene.hash).header("Content-Type", "application/octet-stream");
|
||||
res.status(200).send(scene.data);
|
||||
const resource = resources[resId];
|
||||
res.header("ETag", resource.hash).header("Content-Type", "application/octet-stream");
|
||||
res.status(200).send(resource.data);
|
||||
next();
|
||||
};
|
||||
|
||||
const _options: RequestHandler = (req, res, next) => {
|
||||
const sceneId = req.params.id;
|
||||
delete scenes[sceneId];
|
||||
const resId = req.params[0];
|
||||
delete resources[resId];
|
||||
res.status(200).end();
|
||||
next();
|
||||
};
|
||||
|
||||
const _delete: RequestHandler = (req, res, next) => {
|
||||
const sceneId = req.params.id;
|
||||
delete scenes[sceneId];
|
||||
const resId = req.params[0];
|
||||
delete resources[resId];
|
||||
res.status(200).end();
|
||||
next();
|
||||
};
|
||||
|
||||
return (req, res, next) => {
|
||||
const id = req.params.id;
|
||||
res.header("Access-Control-Allow-Origin", process.env.CORS_ORIGIN || "*");
|
||||
res.header("Access-Control-Allow-Methods", "GET, PUT, DELETE, OPTIONS");
|
||||
res.header("Access-Control-Allow-Headers", "Content-Type, ETag, If-Match, If-None-Match");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user