diff --git a/ai_image_generator/README.md b/ai_image_generator/README.md
index e69de29..db7573b 100644
--- a/ai_image_generator/README.md
+++ b/ai_image_generator/README.md
@@ -0,0 +1,25 @@
+# In this project we craete the application called "DELL-E Image Genartor" by using React
+
+DELL-E Image Generator is the application that is used for creating images by describing what you want to see! After generating images, you can post and download your images.
+
+This project uses OpenAI to generate images and cloudinary to store images.
+
+## How to use this application on your local?
+* You will need OpenAI API key
+* You will need Cloudinary API Key
+* You will also need to connect with MongoDB
+* Create a `.env` file. This file is used to store the keys that access the API services and the database
+```bash
+touch .env # to create the .env file
+echo 'MONGODB_URL=""' >> .env
+echo 'CLOUD_NAME=""' >> .env
+echo 'CLOUD_API_KEY=""' >> .env
+echo 'CLOUD_SECRET=""' >> .env
+echo 'OPENAI_API_KEY=""' >> .env
+```
+Fill in the information with your keys to complete the .env file.
+
+## To start the project
+
+* `npm start` on client side
+* `npm start` on server side
diff --git a/ai_image_generator/client/src/api/index.js b/ai_image_generator/client/src/api/index.js
new file mode 100644
index 0000000..2351e29
--- /dev/null
+++ b/ai_image_generator/client/src/api/index.js
@@ -0,0 +1,9 @@
+import axios from "axios"
+
+const API = axios.create({
+ baseURL: "http://localhost:8080/api/",
+});
+
+export const GetPosts = async () => await API.get("/post/");
+export const CreatePost = async (data) => await API.post("/post/", data)
+export const GenerateAIImage = async (data) => await API.post("/generateImage/", data)
\ No newline at end of file
diff --git a/ai_image_generator/client/src/components/Card.jsx b/ai_image_generator/client/src/components/Card.jsx
index e55cdde..98e9d56 100644
--- a/ai_image_generator/client/src/components/Card.jsx
+++ b/ai_image_generator/client/src/components/Card.jsx
@@ -18,7 +18,7 @@ const Card = ({item}) => {
Explore our popular images using AI generator
{/*=== Search ===*/}
-
-
+ setSearch(e.target.value)} type="text" placeholder='What do you want to see?' className='w-[95%] border-none p-2 outline-none bg-black'/>
+
+
+
-
-
-
-
-
-
-
+ {error && {error}
}
+ {loading ? (<>Loading...>) : (
+
+ {
+ filterPost.length === 0 ? (
No post...
) : (
+ <>
+ {filterPost.slice().reverse().map((item, index) => (
+
+ ))}
+ >
+ )}
+ )}
)
diff --git a/ai_image_generator/server/controllers/ImageGenerate.js b/ai_image_generator/server/controllers/ImageGenerate.js
new file mode 100644
index 0000000..28f90bc
--- /dev/null
+++ b/ai_image_generator/server/controllers/ImageGenerate.js
@@ -0,0 +1,29 @@
+import * as dotenv from "dotenv"
+import {createError} from "../error.js"
+import OpenAI from "openai";
+
+dotenv.config();
+
+//Setup OpenAI
+const openai = new OpenAI({apiKey: process.env.OPENAI_API_KEY});
+
+export const generateImage = async(req, res, next) => {
+ try {
+ const {prompt} = req.body;
+ const response = await openai.images.generate(
+ {
+ model: "dall-e-3",
+ prompt,
+ n:1,
+ size:"1024x1024",
+ response_format: "b64_json",
+ }
+ );
+ const generatedImage = response.data[0].b64_json;
+ return res.status(200).json({photo: generatedImage})
+ //return res.status(200).json(response)
+
+ } catch (error) {
+ next(createError(error.status, error?.response?.data?.error?.message || error?.message))
+ }
+}
diff --git a/ai_image_generator/server/controllers/Post.js b/ai_image_generator/server/controllers/Post.js
new file mode 100644
index 0000000..64e8509
--- /dev/null
+++ b/ai_image_generator/server/controllers/Post.js
@@ -0,0 +1,42 @@
+import *as dotenv from "dotenv"
+import { v2 as cloudinary} from "cloudinary"
+import Post from "../models/Post.js";
+import {createError} from "../error.js"
+
+dotenv.config();
+
+cloudinary.config({
+ cloud_name: process.env.CLOUD_NAME,
+ api_key: process.env.CLOUD_API_KEY,
+ api_secret: process.env.CLOUD_SECRET
+});
+
+export const getAllPosts = async(req, res, next) => {
+ try {
+ const posts = await Post.find({});
+ return res.status(200).json({success: true, data: posts})
+ } catch (error) {
+ next(createError(error.status, error?.response?.data?.error?.message || error?.message))
+ }
+}
+
+export const createPost = async (req, res, next) => {
+ try {
+ const {name, prompt, photo} = req.body;
+ const fixed_photo = photo.replace(/ /g, ""); //because the data that they send back have space so we use following command to remove it
+ const photoUrl = await cloudinary.uploader.upload(fixed_photo);
+ const newPost = await Post.create(
+ {
+ name,
+ prompt,
+ photo: photoUrl?.secure_url,
+ }
+ )
+ return res.status(201).json({success: true, data: newPost})
+
+ } catch (error) {
+ console.log(error)
+ //next(createError(error.status, error?.response?.data?.error?.message || error?.message))
+
+ }
+}
\ No newline at end of file
diff --git a/ai_image_generator/server/error.js b/ai_image_generator/server/error.js
new file mode 100644
index 0000000..b1f5bb4
--- /dev/null
+++ b/ai_image_generator/server/error.js
@@ -0,0 +1,6 @@
+export const createError = (status, message) => {
+ const err = new Error();
+ err.status = status;
+ err.message = message;
+ return err;
+}
diff --git a/ai_image_generator/server/index.js b/ai_image_generator/server/index.js
new file mode 100644
index 0000000..438b638
--- /dev/null
+++ b/ai_image_generator/server/index.js
@@ -0,0 +1,57 @@
+import cors from "cors"
+import mongoose from "mongoose"
+import *as dotenv from "dotenv"
+import express from "express"
+import PostRouter from "./routes/Posts.js"
+import GenerateImageRouter from "./routes/ImageGenerate.js"
+
+
+dotenv.config();
+
+const app = express();
+app.use(cors());
+app.use(express.json({limit: "50mb"}));
+app.use(express.urlencoded({extended: true}));
+app.use((err, req, res, next) => {
+ const status = err.status || 500;
+ const message = err.message || "Error!!"
+ return res.status(status).json(
+ {
+ success: false,
+ status,
+ message
+ }
+ )
+});
+
+app.use("/api/post", PostRouter);
+app.use("/api/generateImage", GenerateImageRouter)
+
+
+app.get("/", async(req, res) => {
+ res.status(200).json({
+ message: "Test"
+ })
+});
+
+//connect with MongoDB
+const connectDB = () => {
+ mongoose.set("strictQuery", true);
+ mongoose.connect(process.env.MONGODB_URL).then(() => console.log("MongoDB connected")).catch((err) => {
+ console.error("Failed to connect with MongoDB");
+ console.error(err);
+ })
+}
+
+
+//start server
+const startServer = async () => {
+ try {
+ app.listen(8080, () => console.log("Server is running on port 8080"))
+ connectDB();
+ } catch (error) {
+ console.log(error)
+ }
+};
+startServer()
+
diff --git a/ai_image_generator/server/models/Post.js b/ai_image_generator/server/models/Post.js
new file mode 100644
index 0000000..5c8772b
--- /dev/null
+++ b/ai_image_generator/server/models/Post.js
@@ -0,0 +1,19 @@
+import mongoose from "mongoose"
+
+const SchemaPost = new mongoose.Schema({
+ name: {
+ type: String,
+ required: true,
+ },
+ prompt: {
+ type: String,
+ required: true,
+ },
+ photo: {
+ type: String,
+ required: true,
+ }
+});
+
+const Post = mongoose.model("Post", SchemaPost);
+export default Post;
\ No newline at end of file
diff --git a/ai_image_generator/server/package-lock.json b/ai_image_generator/server/package-lock.json
index c724bf3..2041096 100644
--- a/ai_image_generator/server/package-lock.json
+++ b/ai_image_generator/server/package-lock.json
@@ -12,6 +12,7 @@
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.19.2",
+ "mongodb": "^6.5.0",
"mongoose": "^8.3.3",
"nodemon": "^3.1.0",
"openai": "^4.40.0"
diff --git a/ai_image_generator/server/package.json b/ai_image_generator/server/package.json
index 0e169bc..eea664a 100644
--- a/ai_image_generator/server/package.json
+++ b/ai_image_generator/server/package.json
@@ -3,14 +3,16 @@
"version": "1.0.0",
"description": "",
"main": "index.js",
+ "type": "module",
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
+ "start": "nodemon index.js"
},
"dependencies": {
"cloudinary": "^2.2.0",
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.19.2",
+ "mongodb": "^6.5.0",
"mongoose": "^8.3.3",
"nodemon": "^3.1.0",
"openai": "^4.40.0"
diff --git a/ai_image_generator/server/routes/ImageGenerate.js b/ai_image_generator/server/routes/ImageGenerate.js
new file mode 100644
index 0000000..6fe26a7
--- /dev/null
+++ b/ai_image_generator/server/routes/ImageGenerate.js
@@ -0,0 +1,7 @@
+import express from "express"
+import { generateImage } from "../controllers/ImageGenerate.js";
+
+const router = express.Router();
+router.post("/", generateImage);
+
+export default router;
\ No newline at end of file
diff --git a/ai_image_generator/server/routes/Posts.js b/ai_image_generator/server/routes/Posts.js
new file mode 100644
index 0000000..60f2b69
--- /dev/null
+++ b/ai_image_generator/server/routes/Posts.js
@@ -0,0 +1,8 @@
+import express from "express"
+import { createPost, getAllPosts } from "../controllers/Post.js";
+
+const router = express.Router();
+router.get("/", getAllPosts);
+router.post("/", createPost);
+
+export default router;
\ No newline at end of file