From 5002ce567512a2fb3e4f1e70f200670ccced1753 Mon Sep 17 00:00:00 2001 From: Joydeep Bhattacharjee <2jbhattacharjee@gmail.com> Date: Mon, 22 Jan 2024 06:00:14 +0530 Subject: [PATCH 1/6] Database connection added --- dbconfigs/connect.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 dbconfigs/connect.js diff --git a/dbconfigs/connect.js b/dbconfigs/connect.js new file mode 100644 index 0000000..765b4a8 --- /dev/null +++ b/dbconfigs/connect.js @@ -0,0 +1,10 @@ +import mongoose from "mongoose"; + +export default async function connectToDB() { + try { + await mongoose.connect(process.env.mongdb_con_str); + console.log("connected successfully"); + } catch (err) { + console.log("error" + err.message); + } +} From 253a63475d731a1b3e66c1251913775ebd3341f4 Mon Sep 17 00:00:00 2001 From: Joydeep Bhattacharjee <2jbhattacharjee@gmail.com> Date: Mon, 22 Jan 2024 06:01:03 +0530 Subject: [PATCH 2/6] aws s3: File uploading code added --- utils/fileUploads3.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 utils/fileUploads3.js diff --git a/utils/fileUploads3.js b/utils/fileUploads3.js new file mode 100644 index 0000000..2943c16 --- /dev/null +++ b/utils/fileUploads3.js @@ -0,0 +1,38 @@ +const fs = require("fs"); + +const { Upload } = require("@aws-sdk/lib-storage"); +const { S3 } = require("@aws-sdk/client-s3"); + +export default async function uploadFileToS3( + fileBuffer, + { folderName, fileName } +) { + // Create an S3 instance + const s3 = new S3({ + credentials: { + accessKeyId: process.env.AWS_S3_ACCESS_KEY, + secretAccessKey: process.env.AWS_S3_SECRET_ACCESS_KEY, + }, + + region: process.env.AWS_S3_REGION, + }); + + // Specify the S3 bucket and file information + const bucketName = "eway-models"; + + // Set S3 upload parameters + + const params = { + Bucket: bucketName, + Key: `${folderName}/${fileName || Date.now()}`, + Body: fileBuffer, + ACL: "public-read", // Set ACL as needed + }; + + const uploaded = await new Upload({ + client: s3, + params, + }).done(); + console.log(uploaded.Location); + return uploaded.Location; +} From 5f4b46e9e878b2590276570d6c062d97a2f5c2db Mon Sep 17 00:00:00 2001 From: Joydeep Bhattacharjee <2jbhattacharjee@gmail.com> Date: Mon, 22 Jan 2024 06:03:00 +0530 Subject: [PATCH 3/6] .vscode ignored --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 88a4d91..58e4b2e 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,5 @@ yarn-error.log* next-env.d.ts #model folder /public/models -(test) \ No newline at end of file +(test) +.vscode \ No newline at end of file From fd438e07ab80e56aa439eaae89a8493eec15ab34 Mon Sep 17 00:00:00 2001 From: Joydeep Bhattacharjee <2jbhattacharjee@gmail.com> Date: Mon, 22 Jan 2024 06:03:51 +0530 Subject: [PATCH 4/6] Model upload feature added for admin --- app/api/3dmodels/route.js | 66 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 app/api/3dmodels/route.js diff --git a/app/api/3dmodels/route.js b/app/api/3dmodels/route.js new file mode 100644 index 0000000..d6790d4 --- /dev/null +++ b/app/api/3dmodels/route.js @@ -0,0 +1,66 @@ +import { NextResponse } from "next/server"; +import connectToDB from "@/dbconfigs/connect"; +import ThreeDModels from "@/db_models/3dmodels"; +import uploadFileToS3 from "@/utils/fileUploads3"; + +async function uploadedFileToBuffer(files) { + const buffers = await Promise.all( + files.map(async (file) => { + const bytes = await file.arrayBuffer(); + const buffer = Buffer.from(bytes); + return buffer; + }) + ); + + return buffers; +} + +export async function POST(req, res) { + try { + await connectToDB(); + const formData = await req.formData(); + console.log(formData.get("data")); + console.log(formData.get("thumbnail")); + const files = [formData.get("thumbnail"), formData.get("_3d_model")]; + const buffers = await uploadedFileToBuffer(files); + const fileToFolder = ["model_thumbnails", "models"]; + const [thumb_url, _3d_model_url] = await Promise.all( + buffers.map( + async (buffer, i) => + await uploadFileToS3(buffer, { folderName: fileToFolder[i] }) + ) + ); + + const { name, isPublished } = JSON.parse(formData.get("data")); + console.log(name); + await ThreeDModels.create({ + name, + size: formData.get("thumbnail").size / 1024, //coverting to KB + js_file: "path", + thumbnail: thumb_url, + _3dmodel: _3d_model_url, + isPublished, + }); + + return NextResponse.json( + { message: "Data saved successfully" }, + { status: 201 } + ); + } catch (error) { + console.error("Error saving data:", error); + return NextResponse.json({ message: "ERROR: ISE" }, { status: 500 }); + } +} + +export async function GET(req) { + try { + await connectToDB(); + // Get all the records in the table + let models = await ThreeDModels.find(); + console.log(models); + return NextResponse.json([...models], { status: 200 }); + } catch (err) { + console.log(err); + return NextResponse.json({ message: "ERROR: ISE" }, { status: 500 }); + } +} From 25696c88dbc8124d3f6de2c4fb9b1bf3747c4793 Mon Sep 17 00:00:00 2001 From: Joydeep Bhattacharjee <2jbhattacharjee@gmail.com> Date: Mon, 22 Jan 2024 06:04:41 +0530 Subject: [PATCH 5/6] 3dmodel schema added --- db_models/3dmodels.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 db_models/3dmodels.js diff --git a/db_models/3dmodels.js b/db_models/3dmodels.js new file mode 100644 index 0000000..26d24dd --- /dev/null +++ b/db_models/3dmodels.js @@ -0,0 +1,40 @@ +import mongoose from "mongoose"; + +const three_d_model = new mongoose.Schema({ + name: { + type: String, + required: true, + }, + size: { + type: Number, + required: true, + }, + date_created: { + type: Date, + default: Date.now, + }, + js_file: { + type: String, + required: true, + }, + thumbnail: { + type: String, + // You might want to add validation or default values for thumbnails + }, + _3dmodel: { + type: String, + // You might want to add validation or default values for thumbnails + }, + isPublished: { + type: Boolean, + }, +}); +console.log(mongoose.models.three_d_model); +if (mongoose.models.three_d_model) + console.log("The model already existed, hence no model created!!"); +else console.log("Need to create a model!!!"); +const ThreeDModels = + mongoose.models.three_d_model || + mongoose.model("three_d_model", three_d_model); + +export default ThreeDModels; From 9bf8b826aa4f19b4bda8e32acc520c8840e5121e Mon Sep 17 00:00:00 2001 From: Joydeep Bhattacharjee <2jbhattacharjee@gmail.com> Date: Sun, 25 Feb 2024 12:34:29 +0530 Subject: [PATCH 6/6] upload feature debugged --- app/admin/page.js | 107 ++++++++++++++++++++++++++++++++++++++ app/api/3dmodels/route.js | 12 ++--- next.config.js | 8 ++- 3 files changed, 119 insertions(+), 8 deletions(-) create mode 100644 app/admin/page.js diff --git a/app/admin/page.js b/app/admin/page.js new file mode 100644 index 0000000..70aedbc --- /dev/null +++ b/app/admin/page.js @@ -0,0 +1,107 @@ +"use client"; + +import { useForm } from "react-hook-form"; +import axios from "axios"; +import { useEffect, useState } from "react"; +import Image from "next/image"; + +function Card({ details }) { + return ( +
{details.name}
+