Skip to content

Commit

Permalink
add upload file to exist project
Browse files Browse the repository at this point in the history
  • Loading branch information
VovaStelmashchuk committed Mar 4, 2025
1 parent 2496b2a commit af2a6fc
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 95 deletions.
95 changes: 0 additions & 95 deletions server/api/project.post.js

This file was deleted.

30 changes: 30 additions & 0 deletions server/api/project/[slug]/addfiles.post.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { defineEventHandler, createError } from "h3";

import { connectDB } from "~~/server/db/mongo";
import { saveFilesToProject } from "~~/server/core/project/dxf";

export default defineEventHandler(async (event) => {
const userId = event.context?.auth?.userId;
if (!userId) {
throw createError({ statusCode: 401, message: "Unauthorized" });
}
const projectSlug = getRouterParam(event, "slug");

const db = await connectDB();

const project = await db.collection("projects").findOne({
slug: projectSlug,
});

const projectOwnerId = project.ownerId;

if (projectOwnerId !== userId) {
throw createError({ statusCode: 403, message: "Forbidden" });
}

saveFilesToProject(event, projectSlug);

return {
slug: projectSlug,
};
});
31 changes: 31 additions & 0 deletions server/api/project/index.post.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { defineEventHandler, createError } from "h3";

import { connectDB } from "~~/server/db/mongo";
import { saveFilesToProject } from "~~/server/core/project/dxf";
import {
generateRandomString,
generateEntityName,
} from "~~/server/utils/strings";

export default defineEventHandler(async (event) => {
const userId = event.context?.auth?.userId;
if (!userId) {
throw createError({ statusCode: 401, message: "Unauthorized" });
}
const db = await connectDB();
const projectName = generateEntityName();
const projectSlug = `${projectName}-${generateRandomString(6)}`;

await db.collection("projects").insertOne({
slug: projectSlug,
name: projectName,
uploadedAt: new Date(),
ownerId: userId,
});

saveFilesToProject(event, projectSlug);

return {
slug: projectSlug,
};
});
57 changes: 57 additions & 0 deletions server/core/project/dxf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { createError, readMultipartFormData } from "h3";

import { connectDB, getUserDxfBucket } from "~~/server/db/mongo";
import { generateSvg } from "~~/server/core/svg/generator";
import { generateRandomString } from "~~/server/utils/strings";

import { dxf2json } from "@deepnest/dxf2svg-processor";

export async function saveFilesToProject(event, projectSlug) {
const fields = await readMultipartFormData(event);
const dxfFileFields = fields.filter((field) => field.name === "dxf");

if (dxfFileFields.length === 0) {
throw createError({
statusCode: 400,
message: "No DXF file uploaded. Please upload a DXF file.",
});
}

const dxfUser = await getUserDxfBucket();

const dxfs = [];

dxfFileFields.forEach((dxfFile) => {
const fileBuffer = dxfFile.data;
const userFileName = dxfFile.filename;
const suffix = generateRandomString(6);
const fileName = `${projectSlug}-${userFileName}-${suffix}`;

const uploadSream = dxfUser.openUploadStream(fileName);
uploadSream.write(fileBuffer);
uploadSream.end();

const dxfAsObjectStr = dxf2json({
stringData: fileBuffer.toString(),
});

const dxfAsObject = JSON.parse(dxfAsObjectStr);

const svgResult = generateSvg(dxfAsObject);

const dxfRecord = {
slug: fileName,
name: userFileName,
fileName: fileName,
svg: svgResult.svg,
svgError: svgResult.error,
};

dxfs.push(dxfRecord);
});

const db = await connectDB();
await db
.collection("projects")
.updateOne({ slug: projectSlug }, { $push: { dxf: { $each: dxfs } } });
}

0 comments on commit af2a6fc

Please sign in to comment.