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 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 ( +
+ Card Image +
+

{details.name}

+
+
+ ); +} +const UploadModel = () => { + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm(); + const [data, setData] = useState([]); + + const onSubmit = async ({ name, isPublished, thumbnail, _3dmodel }) => { + const formData = new FormData(); + // console.log(thumbnail[0]); + // return; + formData.append("data", JSON.stringify({ name, isPublished })); + formData.append("thumbnail", thumbnail[0]); + formData.append("_3dmodel", _3dmodel[0]); + try { + const response = await axios.post("/api/3dmodels", formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + }); + + if (response.status === 201) { + console.log("Data saved successfully"); + console.log(response.data.savedData); + setData((prev) => [...prev, response.data.savedData]); + } else { + console.error("Failed to save data:", response.statusText); + } + } catch (error) { + console.error("Error:", error.message); + } + }; + + async function getData() { + const data = await axios.get("/api/3dmodels"); + + setData(data.data); + console.log(data.data); + } + useEffect(() => { + getData(); + }, []); + + return ( +
+
+ + + {errors.name &&

{errors.name.message}

} + + + + {errors.isPublished &&

{errors.name.message}

} + + + + {errors.thumbnail &&

{errors.thumbnail.message}

} + + + {errors._3dmodel &&

{errors._3dmodel.message}

} + + +
+ {data.map((item) => ( + + ))} +
+ ); +}; + +export default UploadModel; diff --git a/app/api/3dmodels/route.js b/app/api/3dmodels/route.js new file mode 100644 index 0000000..e415570 --- /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("_3dmodel")]; + const buffers = await uploadedFileToBuffer(files); + const fileToFolder = ["model_thumbnails", "models"]; + const [thumb_url, _3dmodel_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); + const savedData = await ThreeDModels.create({ + name, + size: formData.get("thumbnail").size / 1024, //coverting to KB + js_file: "path", + thumbnail: thumb_url, + _3dmodel: _3dmodel_url, + isPublished, + }); + + return NextResponse.json( + { message: "Data saved successfully", savedData }, + { status: 201 } + ); + } catch (error) { + console.error("Error saving data:", error); + return NextResponse.json({ message: "ERROR: ISE" }, { status: 500 }); + } +} + +export async function GET() { + 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 }); + } +} 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; 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); + } +} diff --git a/next.config.js b/next.config.js index 767719f..317f73a 100644 --- a/next.config.js +++ b/next.config.js @@ -1,4 +1,8 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {} +const nextConfig = { + images: { + domains: ["eway-models.s3.ap-south-1.amazonaws.com"], + }, +}; -module.exports = nextConfig +module.exports = nextConfig; 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; +}