diff --git a/Backend/.env.sample b/Backend/.env.sample new file mode 100644 index 0000000..1655f26 --- /dev/null +++ b/Backend/.env.sample @@ -0,0 +1,2 @@ +PORT= +CORS_ORIGIN= \ No newline at end of file diff --git a/Backend/.gitignore b/Backend/.gitignore new file mode 100644 index 0000000..6254213 --- /dev/null +++ b/Backend/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +package-lock.json +.env \ No newline at end of file diff --git a/Backend/package.json b/Backend/package.json new file mode 100644 index 0000000..abeb62f --- /dev/null +++ b/Backend/package.json @@ -0,0 +1,34 @@ +{ + "name": "backend", + "version": "1.0.0", + "description": "Backend for Project-Assemble", + "main": "index.js", + "type": "module", + "scripts": { + "dev": "nodemon -r dotenv/config --experimental-json-modules src/index.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/TheGradients/Assemble.git" + }, + "keywords": [ + "node", + "javascript", + "backend" + ], + "author": "TheGradients", + "license": "ISC", + "bugs": { + "url": "https://github.com/TheGradients/Assemble/issues" + }, + "homepage": "https://github.com/TheGradients/Assemble#readme", + "dependencies": { + "body-parser": "^1.20.2", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "mongoose": "^8.4.4", + "nodemon": "^3.1.4" + } +} diff --git a/Backend/src/app.js b/Backend/src/app.js new file mode 100644 index 0000000..a6858bc --- /dev/null +++ b/Backend/src/app.js @@ -0,0 +1,28 @@ +import express from "express"; +import cors from "cors"; +import cookieParser from "cookie-parser"; + +const app = express(); + +app.use(cors({ + origin: process.env.CORS_ORIGIN, + credentials: true +})); + +app.use(express.json({ + limit: "16kb" +})); + +app.use(express.urlencoded({ + extended: true, + limit: "16kb" +})); + +app.use(cookieParser()); + +// HEALTH CHECK ROUTE +import healthRouter from "./routes/healthcheck.routes.js"; + +app.use("/api/v1", healthRouter); + +export default app; \ No newline at end of file diff --git a/Backend/.gitkeep b/Backend/src/constants.js similarity index 100% rename from Backend/.gitkeep rename to Backend/src/constants.js diff --git a/Backend/src/controllers/healthcheck.controller.js b/Backend/src/controllers/healthcheck.controller.js new file mode 100644 index 0000000..396c705 --- /dev/null +++ b/Backend/src/controllers/healthcheck.controller.js @@ -0,0 +1,19 @@ +import asyncHandler from "../utils/asyncHandler.js"; +import ApiResponse from "../utils/ApiResponse.js"; +import ApiError from "../utils/ApiError.js"; + +const healthCheck = asyncHandler( async (req, res) => { + return res + .status(200) + .json( + new ApiResponse( + 200, + [], + "API Is Running Good!" + ) + ); +}); + +export { + healthCheck +}; \ No newline at end of file diff --git a/Backend/src/db/.gitkeep b/Backend/src/db/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Backend/src/index.js b/Backend/src/index.js new file mode 100644 index 0000000..fa750a5 --- /dev/null +++ b/Backend/src/index.js @@ -0,0 +1,10 @@ +import dotenv from "dotenv"; +import app from "./app.js"; + +dotenv.config({ + path: './env' +}); + +app.listen(process.env.PORT || 8000, () => { + console.log(`App Started On Port: ${process.env.PORT}`);; +}); \ No newline at end of file diff --git a/Backend/src/middlewares/.gitkeep b/Backend/src/middlewares/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Backend/src/models/.gitkeep b/Backend/src/models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Backend/src/routes/healthcheck.routes.js b/Backend/src/routes/healthcheck.routes.js new file mode 100644 index 0000000..f5e6cf7 --- /dev/null +++ b/Backend/src/routes/healthcheck.routes.js @@ -0,0 +1,8 @@ +import { Router } from "express"; +import { healthCheck } from "../controllers/healthCheck.controller.js"; + +const router = Router(); + +router.route("/health-check").get(healthCheck); + +export default router; \ No newline at end of file diff --git a/Backend/src/utils/ApiError.js b/Backend/src/utils/ApiError.js new file mode 100644 index 0000000..072fec5 --- /dev/null +++ b/Backend/src/utils/ApiError.js @@ -0,0 +1,23 @@ +class ApiError extends Error { + constructor( + statusCode, + message = "Something Went Wrong!", + errors = [], + stack + ) { + super(message) + this.statusCode = statusCode + this.data = [] + this.message = message + this.success = false + this.errors = errors + + if (stack) { + this.stack = stack + } else { + Error.captureStackTrace(this, this.constructor) + } + } +} + +export default ApiError; \ No newline at end of file diff --git a/Backend/src/utils/ApiResponse.js b/Backend/src/utils/ApiResponse.js new file mode 100644 index 0000000..e56413d --- /dev/null +++ b/Backend/src/utils/ApiResponse.js @@ -0,0 +1,14 @@ +class ApiResponse { + constructor( + statusCode, + data, + message = "Success!" + ) { + this.statusCode = statusCode + this.data = data + this.message = message + this.success = statusCode < 400 + } +} + +export default ApiResponse; \ No newline at end of file diff --git a/Backend/src/utils/asyncHandler.js b/Backend/src/utils/asyncHandler.js new file mode 100644 index 0000000..c646bc9 --- /dev/null +++ b/Backend/src/utils/asyncHandler.js @@ -0,0 +1,9 @@ +const asyncHanlder = (requestHandler) => { + return (req, res, next) => { + Promise + .resolve(requestHandler(req, res, next)) + .catch((err) => next(err)); + } +}; + +export default asyncHanlder; \ No newline at end of file diff --git a/Frontend/src/App.jsx b/Frontend/src/App.jsx index 648688e..c816918 100644 --- a/Frontend/src/App.jsx +++ b/Frontend/src/App.jsx @@ -1,8 +1,10 @@ import React from 'react' import Body from './components/Body' +import Header from './components/Header' const App = () => { return (