From ab6aa5867539ba0344d9f1cf6143350da98ee1ad Mon Sep 17 00:00:00 2001 From: matthew everard <64141240+ematthewephec@users.noreply.github.com> Date: Wed, 1 Mar 2023 16:24:25 +0100 Subject: [PATCH 01/11] Create test.txt --- test.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 test.txt diff --git a/test.txt b/test.txt new file mode 100644 index 0000000000..2b1844d816 --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +hello my name is jeff From 24b71f97b18059b78bd3c444993e9102eb6a5985 Mon Sep 17 00:00:00 2001 From: Gabrielle Cruz Date: Wed, 8 Mar 2023 15:25:48 +0100 Subject: [PATCH 02/11] CREATE index.js --- backend/index.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 backend/index.js diff --git a/backend/index.js b/backend/index.js new file mode 100644 index 0000000000..ff19adff49 --- /dev/null +++ b/backend/index.js @@ -0,0 +1,12 @@ +const express = require('express'); +const PORT = process.env.PORT || 3000; +const app = express(); + +/* API */ +app.get('/', (req, res) => { + res.status(200).json({message: "Hello! This is the API!"}); +}); + +app.listen(PORT, () => { + console.log(`Server listening on ${PORT}`); +}); \ No newline at end of file From 7fe25f710f295c43b1ca3c4339d7be378ad13324 Mon Sep 17 00:00:00 2001 From: Gabrielle Cruz Date: Wed, 8 Mar 2023 15:30:27 +0100 Subject: [PATCH 03/11] CREATE database.js --- .gitignore | 1 + backend/helpers/database.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 .gitignore create mode 100644 backend/helpers/database.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..2eea525d88 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/backend/helpers/database.js b/backend/helpers/database.js new file mode 100644 index 0000000000..0b935041d7 --- /dev/null +++ b/backend/helpers/database.js @@ -0,0 +1,30 @@ +const mariadb = require('mariadb'); +const pool = mariadb.createPool({ + host: process.env.HOST, + user: process.env.USER, + password: process.env.PASSWORDDB, + database: process.env.DATABASE, + port: process.env.PORTDB, + connectionLimit: 5, + supportBigNumbers: true, + bigNumberStrings: true, +}); + +// connect and check for errors +pool.getConnection((err, connection) => { + if (err) { + if (err.code === 'PROTOCOL_CONNECTION_LOST') { + console.error('Database connection lost'); + } + if (err.code === 'ER_CON_COUNT_ERROR') { + console.error('Database has too many connections'); + } + if (err.code === 'ECONNREFUSED') { + console.error('Database connection was refused'); + } + } + if (connection) connection.release(); + return; +}); + +module.exports = pool; \ No newline at end of file From 8baff377f4701e452019b7c5760257e0f5b1da3b Mon Sep 17 00:00:00 2001 From: Gabrielle Cruz Date: Wed, 8 Mar 2023 15:44:24 +0100 Subject: [PATCH 04/11] ADD backend product route --- backend/index.js | 8 +++++++- backend/routes/product.js | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 backend/routes/product.js diff --git a/backend/index.js b/backend/index.js index ff19adff49..302b47218f 100644 --- a/backend/index.js +++ b/backend/index.js @@ -1,12 +1,18 @@ const express = require('express'); const PORT = process.env.PORT || 3000; + +/* ROUTE IMPORT */ +const products = require('./routes/product'); + const app = express(); /* API */ app.get('/', (req, res) => { - res.status(200).json({message: "Hello! This is the API!"}); + res.status(200).send("Hello! This is the API!"); }); +app.use('/products', products); + app.listen(PORT, () => { console.log(`Server listening on ${PORT}`); }); \ No newline at end of file diff --git a/backend/routes/product.js b/backend/routes/product.js new file mode 100644 index 0000000000..5efdfc71e4 --- /dev/null +++ b/backend/routes/product.js @@ -0,0 +1,9 @@ +const express = require('express'); +const router = express.Router(); +//const pool = require('../helpers/database'); + +router.get('/', (req, res) => { + res.status(200).send("This is the product route of the API!"); +}) + +module.exports = router; \ No newline at end of file From 735df2670681831263fbfe3665529392e2cad9eb Mon Sep 17 00:00:00 2001 From: Gabrielle Cruz Date: Wed, 8 Mar 2023 15:56:52 +0100 Subject: [PATCH 05/11] ADD package.json --- .gitignore | 4 +++- package.json | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 package.json diff --git a/.gitignore b/.gitignore index 2eea525d88..941d53615e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -.env \ No newline at end of file +.env +node_modules +package-lock.json \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000000..1a35a07ee5 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "dev-web-2023", + "version": "1.0.0", + "description": "This is the repository for Informateur, a DEV 3 2023 project.", + "main": "index.js", + "scripts": { + "test": "\"echo \\\"Error: no test specified\\\" && exit 1\"" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ematthewephec/Dev-Web-2023.git" + }, + "author": "Gabrielle Cruz", + "license": "ISC", + "bugs": { + "url": "https://github.com/ematthewephec/Dev-Web-2023/issues" + }, + "homepage": "https://github.com/ematthewephec/Dev-Web-2023#readme", + "dependencies": { + "concurrently": "^7.6.0", + "create-react-app": "^5.0.1", + "express": "^4.18.2", + "mariadb": "^3.1.0", + "nodemon": "^2.0.21" + } +} From 8b441b2e39d012891575cc17cbda5fe7cd939175 Mon Sep 17 00:00:00 2001 From: Gabrielle Cruz <47248597+GabrielleCruz99Official@users.noreply.github.com> Date: Wed, 15 Mar 2023 18:52:35 +0100 Subject: [PATCH 06/11] 3 technical task install and set up reactjs environment (#4) * ADD frontend package.json * SETUP React.js environment * UPDATE package.json files * ADD index page * UPDATE website index * ADD backend middleware to connect front and back * MOVE App.js to components folder * IMPLEMENT React-Bootstrap components * REMOVE bootstrap external call * ADD bootstrap and axios to packages dependencies --------- Co-authored-by: quentinrld <71373028+quentinrld@users.noreply.github.com> --- backend/index.js | 18 ++++- frontend/.gitignore | 23 ++++++ frontend/README.md | 70 ++++++++++++++++++ frontend/package.json | 50 +++++++++++++ frontend/public/favicon.ico | Bin 0 -> 3870 bytes frontend/public/index.html | 43 +++++++++++ frontend/public/logo192.png | Bin 0 -> 5347 bytes frontend/public/logo512.png | Bin 0 -> 9664 bytes frontend/public/manifest.json | 25 +++++++ frontend/public/robots.txt | 3 + frontend/src/components/app/App.css | 38 ++++++++++ frontend/src/components/app/App.js | 20 +++++ frontend/src/components/app/App.test.js | 8 ++ frontend/src/components/common/Navigation.js | 33 +++++++++ .../src/components/indexpage/IndexPage.js | 35 +++++++++ frontend/src/components/utils/BasicNavbar.js | 14 ++++ frontend/src/components/utils/Constants.js | 8 ++ frontend/src/index.css | 13 ++++ frontend/src/index.js | 20 +++++ frontend/src/logo.svg | 1 + frontend/src/reportWebVitals.js | 13 ++++ frontend/src/setupTests.js | 5 ++ package.json | 11 ++- 23 files changed, 448 insertions(+), 3 deletions(-) create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/package.json create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/index.html create mode 100644 frontend/public/logo192.png create mode 100644 frontend/public/logo512.png create mode 100644 frontend/public/manifest.json create mode 100644 frontend/public/robots.txt create mode 100644 frontend/src/components/app/App.css create mode 100644 frontend/src/components/app/App.js create mode 100644 frontend/src/components/app/App.test.js create mode 100644 frontend/src/components/common/Navigation.js create mode 100644 frontend/src/components/indexpage/IndexPage.js create mode 100644 frontend/src/components/utils/BasicNavbar.js create mode 100644 frontend/src/components/utils/Constants.js create mode 100644 frontend/src/index.css create mode 100644 frontend/src/index.js create mode 100644 frontend/src/logo.svg create mode 100644 frontend/src/reportWebVitals.js create mode 100644 frontend/src/setupTests.js diff --git a/backend/index.js b/backend/index.js index 302b47218f..3b2a6bef81 100644 --- a/backend/index.js +++ b/backend/index.js @@ -1,14 +1,28 @@ const express = require('express'); -const PORT = process.env.PORT || 3000; +const PORT = process.env.PORT || 3001; + +const bodyParser = require('body-parser'); +const cookieParser = require('cookie-parser'); + +const cors = require('cors'); +const corsOptions = { + origin: 'http://localhost:3000', + methods: ['GET', 'POST'] +}; /* ROUTE IMPORT */ const products = require('./routes/product'); const app = express(); +/* MIDDLEWARE */ +app.use(cors(corsOptions)); +app.use(express.json()); +app.use(bodyParser.urlencoded({extended: true})); + /* API */ app.get('/', (req, res) => { - res.status(200).send("Hello! This is the API!"); + res.status(200).send("Le site web pour les abonnements des tuyaux informatiques!"); }); app.use('/products', products); diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000000..4d29575de8 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000000..58beeaccd8 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,70 @@ +# Getting Started with Create React App + +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in your browser. + +The page will reload when you make changes.\ +You may also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can't go back!** + +If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. + +You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) + +### Analyzing the Bundle Size + +This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) + +### Making a Progressive Web App + +This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) + +### Advanced Configuration + +This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) + +### Deployment + +This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) + +### `npm run build` fails to minify + +This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000000..42405cb9d5 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,50 @@ +{ + "name": "dev-web-2023-frontend", + "version": "1.0.0", + "private": true, + "description": "This is the frontend package for Informateur.", + "main": "index.js", + "repository": { + "type": "git", + "url": "\"git+https://github.com/ematthewephec/Dev-Web-2023.git\"" + }, + "author": "Gabrielle Cruz", + "license": "ISC", + "dependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "axios": "^1.3.4", + "bootstrap": "^5.2.3", + "react": "^18.2.0", + "react-bootstrap": "^2.7.2", + "react-dom": "^18.2.0", + "react-router-dom": "^6.9.0", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ literal 0 HcmV?d00001 diff --git a/frontend/public/index.html b/frontend/public/index.html new file mode 100644 index 0000000000..aa069f27cb --- /dev/null +++ b/frontend/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/frontend/public/logo192.png b/frontend/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/frontend/public/manifest.json b/frontend/public/manifest.json new file mode 100644 index 0000000000..080d6c77ac --- /dev/null +++ b/frontend/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt new file mode 100644 index 0000000000..e9e57dc4d4 --- /dev/null +++ b/frontend/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/frontend/src/components/app/App.css b/frontend/src/components/app/App.css new file mode 100644 index 0000000000..74b5e05345 --- /dev/null +++ b/frontend/src/components/app/App.css @@ -0,0 +1,38 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/frontend/src/components/app/App.js b/frontend/src/components/app/App.js new file mode 100644 index 0000000000..f053430fc0 --- /dev/null +++ b/frontend/src/components/app/App.js @@ -0,0 +1,20 @@ +import React from 'react'; +import './App.css'; +import { Routes, Route } from 'react-router-dom'; +import 'bootstrap/dist/css/bootstrap.min.css'; +import IndexPage from '../indexpage/IndexPage'; +import BasicNavbar from '../utils/BasicNavbar'; + +function App() { + return ( +
+ + }> + } /> + + +
+ ); +} + +export default App; diff --git a/frontend/src/components/app/App.test.js b/frontend/src/components/app/App.test.js new file mode 100644 index 0000000000..1f03afeece --- /dev/null +++ b/frontend/src/components/app/App.test.js @@ -0,0 +1,8 @@ +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/frontend/src/components/common/Navigation.js b/frontend/src/components/common/Navigation.js new file mode 100644 index 0000000000..ef207bbe53 --- /dev/null +++ b/frontend/src/components/common/Navigation.js @@ -0,0 +1,33 @@ +import React from 'react'; + +import Container from 'react-bootstrap/Container'; +import Nav from 'react-bootstrap/Nav'; +import Navbar from 'react-bootstrap/Navbar'; + +import logo from '../../logo.svg'; + + +function Navigation(){ + return( + + + + Informateur + + + + + + + + ) +} + +export default Navigation; \ No newline at end of file diff --git a/frontend/src/components/indexpage/IndexPage.js b/frontend/src/components/indexpage/IndexPage.js new file mode 100644 index 0000000000..da03e8b2be --- /dev/null +++ b/frontend/src/components/indexpage/IndexPage.js @@ -0,0 +1,35 @@ +import React, {useEffect, useState} from 'react'; +import Axios from 'axios'; +import Card from 'react-bootstrap/Card'; +import {AXIOS_CONFIG, INDEX_URL} from '../utils/Constants'; +//import './FrontPage.css'; + +function IndexPage(){ + const [title, setTitle] = useState(""); + + const getIndexHello = async () => { + Axios.get(INDEX_URL) + .then((response) => { + setTitle(response.data) + }); + }; + + useEffect(() => { + getIndexHello(); + }, []); + + return( +
+ + + Bienvenue chez Informateur + + {title} + + + +
+ ) +} + +export default IndexPage; diff --git a/frontend/src/components/utils/BasicNavbar.js b/frontend/src/components/utils/BasicNavbar.js new file mode 100644 index 0000000000..0609a50f93 --- /dev/null +++ b/frontend/src/components/utils/BasicNavbar.js @@ -0,0 +1,14 @@ +import React from 'react'; +import Navigation from '../common/Navigation'; +import { Outlet } from 'react-router-dom'; + +const BasicNavbar = () => { + return( + <> + + + + ) +} + +export default BasicNavbar; \ No newline at end of file diff --git a/frontend/src/components/utils/Constants.js b/frontend/src/components/utils/Constants.js new file mode 100644 index 0000000000..fab49ba918 --- /dev/null +++ b/frontend/src/components/utils/Constants.js @@ -0,0 +1,8 @@ +export const INDEX_URL = `http://localhost:3001/`; + +export const AXIOS_CONFIG = { + headers: { + 'Access-Control-Allow-Origin': '*', + 'Content-Type': 'application/json' + } +}; \ No newline at end of file diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 0000000000..ec2585e8c0 --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/frontend/src/index.js b/frontend/src/index.js new file mode 100644 index 0000000000..45560674bb --- /dev/null +++ b/frontend/src/index.js @@ -0,0 +1,20 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import {BrowserRouter} from 'react-router-dom'; +import App from './components/app/App'; +import './index.css'; +import reportWebVitals from './reportWebVitals'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + + + +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/frontend/src/logo.svg b/frontend/src/logo.svg new file mode 100644 index 0000000000..9dfc1c058c --- /dev/null +++ b/frontend/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/reportWebVitals.js b/frontend/src/reportWebVitals.js new file mode 100644 index 0000000000..5253d3ad9e --- /dev/null +++ b/frontend/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/frontend/src/setupTests.js b/frontend/src/setupTests.js new file mode 100644 index 0000000000..8f2609b7b3 --- /dev/null +++ b/frontend/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/package.json b/package.json index 1a35a07ee5..5889bce212 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,12 @@ { - "name": "dev-web-2023", + "name": "dev-web-2023-backend", "version": "1.0.0", "description": "This is the repository for Informateur, a DEV 3 2023 project.", "main": "index.js", "scripts": { + "server": "nodemon backend/index.js", + "client": "npm start --prefix frontend", + "dev": "concurrently \"npm run server\" \"npm run client\"", "test": "\"echo \\\"Error: no test specified\\\" && exit 1\"" }, "repository": { @@ -17,9 +20,15 @@ }, "homepage": "https://github.com/ematthewephec/Dev-Web-2023#readme", "dependencies": { + "axios": "^1.3.4", + "axios-hooks": "^4.0.0", + "body-parser": "^1.20.2", "concurrently": "^7.6.0", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", "create-react-app": "^5.0.1", "express": "^4.18.2", + "express-session": "^1.17.3", "mariadb": "^3.1.0", "nodemon": "^2.0.21" } From 23a98bc637de314c7deff2b4b65c3efa0161e43e Mon Sep 17 00:00:00 2001 From: aurelle-awountsa <64193958+aurelle-awountsa@users.noreply.github.com> Date: Wed, 15 Mar 2023 23:07:31 +0100 Subject: [PATCH 07/11] Add files via upload --- architecture react.png | Bin 0 -> 18143 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 architecture react.png diff --git a/architecture react.png b/architecture react.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9fe49a3c54dba99bb3bafdf49e379b5587c8da GIT binary patch literal 18143 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 Q52a!7boFyt=akR{0BX+E^Z)<= literal 0 HcmV?d00001 From d12471d752903806c8995546f170e94cd68727a4 Mon Sep 17 00:00:00 2001 From: aurelle-awountsa <64193958+aurelle-awountsa@users.noreply.github.com> Date: Wed, 15 Mar 2023 23:29:44 +0100 Subject: [PATCH 08/11] Add files via upload --- apparence.png | Bin 0 -> 20421 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apparence.png diff --git a/apparence.png b/apparence.png new file mode 100644 index 0000000000000000000000000000000000000000..c4851fb1978da633d706003de5b86151037a9a8f GIT binary patch literal 20421 zcmbTdbySu0a~4KykMMEgsyZSQ`oycb60m?(SOL-EVs4 zn_1tTIcM(7{UgbG-?i5(J6j(6LDW>_u+YiTpFMkqCI23%@$A`ilxNRgIG`cEpQSPT zzefB#chQiOdR96_xq~=Bwv<$seD@x8vwvuF6Oe?QNcKGJwTd!}k2 z50upMG(K3w^3m}=<^5nT^MxOF|Jwb|!groOd-gxiv>UjL| zh-k=Vmisj})we9n?6jQ&PRIEL!XDn0-iFsZ8}b9=8;K*y^$FJGF)Ut*N=oTHFA3JZ z;Nc=a$Mh(vnNGf3QjE6%B{SVT3<9i?)Sjt1NYmU*g4e@ZYM^LrIBI z==sWdaO1uPe+|Rrzyz9q0MpVVVIbj=>5+!@{BC~-457RKV}_+8)<~$$sf#9~ssg^#P*UwrD#&P%2?KVcA$!-a7R?Hk*7XA57v$?fK&@9Js`x5nC)@6=4d zCCd<*R}$mQ5_f6VkZAVsOR9*9n~@i`wxyxBj1MlI;=ST1J}v91hRsI|eUd`crf36; zp;1`gKirx8rZT?QYfa=dcp(w*%CMNY`L>1qTw9jx!;oU~dDMrX$XP#e%YP`AXw zLWvi{H>S1Hak6ixmcff+G!y*=z3eB=Ubm|)27N`axmv0N%Mxvi@lT!pU6TzJeZs_E zNj1x`93w+m?z7#uoNB`h@g=ARbzIR@a*FviDz%LJZl%cz`}G^rwZ!M%p}!Y8yLy>c zDeD_+?qRq*=^yLLN|E!o5@u20+^(^|Zn}!?4 zMy==a1DVriX_`)+z`8A}@v&hE$Yg&+cZn~tNu@N*v&>CfW$#lK;-xy*)z5aRt!FK2 z9B)BE-=xYF0&yOZrE!4`ze&vmAMSA~{#Zi71G&)aUT|OK0L~+9TXEb!s2C>U6xvHY zb6cWMR4;-0fHT+jiPe6{3tp3oZE#|XFEnmT76I;ukJecpIM9c9QMRa%WG*%@t^?|C z=QzWs))#kG6R&y4y@@qld~&(;7Pl2fu9mABWsH)1CnMB!Kb7pg-6EB)G@Y!TA}<0I zwENaH29J}-k+4F2h=2{uU~p{l+A(_g5n&hjA<%OLd&R_m>z@HBe-JMLV@Y z{NQP+X>6EzG+sxLW5+p@ljU{LMLwBA!Zhe3$IxLa^NaE3mr`VNzv*)OzG$lBy959U zBPXWD`G`RA>;rnYQUhan`!aZ|Us|2;&D}1$%AZ0MeYE`q&`902mjAL-zG;5l#VX
;{L)S}qBWBx{ZFMLoywut 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 JinqCR_isgC!O{Q# literal 0 HcmV?d00001 From 5fa9d17b03cb5c9ea5ba290c753066cf4c6ede41 Mon Sep 17 00:00:00 2001 From: Gabrielle Cruz <47248597+GabrielleCruz99Official@users.noreply.github.com> Date: Wed, 26 Apr 2023 13:47:47 +0200 Subject: [PATCH 09/11] ADD database tables (#7) --- backend/helpers/database.sql | 76 ++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 backend/helpers/database.sql diff --git a/backend/helpers/database.sql b/backend/helpers/database.sql new file mode 100644 index 0000000000..e54b096829 --- /dev/null +++ b/backend/helpers/database.sql @@ -0,0 +1,76 @@ +CREATE TABLE Users ( + UserID int NOT NULL AUTO_INCREMENT, + UserName varchar(60), + UserEmail varchar(60), + UserPassword varchar(60), + CreationDate Date, + DeletionDate Date, + PRIMARY KEY (UserID) +); + +CREATE TABLE Products ( + ProductID int NOT NULL AUTO_INCREMENT, + ProductName varchar(60), + ProductDesc text, + ProductPrice decimal(6,2), + ProductOnSale boolean, + PRIMARY KEY (ProductID) +); + +CREATE TABLE Addresses ( + AddressID int NOT NULL AUTO_INCREMENT, + UserID int, + Street varchar(100), + Postcode int, + Country varchar(30), + PRIMARY KEY (AddressID), + FOREIGN KEY (UserID) references Users(UserID) +); + +CREATE TABLE Orders ( + OrderID int NOT NULL AUTO_INCREMENT, + UserID int, + ProductID int, + OrderSubtotal int, + OrderDate Date, + SubscriptionID int, + PaidDate Date, + DeliveryDate Date, + WasPaid boolean DEFAULT false, + WasDelivered boolean DEFAULT false, + PRIMARY KEY (OrderID), + FOREIGN KEY (UserID) REFERENCES Users(UserID), + FOREIGN KEY (ProductID) REFERENCES Products(ProductID), + FOREIGN KEY (SubscriptionID) REFERENCES Subscriptions(SubscriptionID) +); + +CREATE TABLE Baskets ( + UserID int, + ItemIndex int NOT NULL AUTO_INCREMENT, + ItemQuantity int, + ProductID int, + PRIMARY KEY (ItemIndex), + FOREIGN KEY (UserID) REFERENCES Users(UserID), + FOREIGN KEY (ProductID) REFERENCES Products(ProductID) +); + +CREATE TABLE Subscriptions ( + SubscriptionID int NOT NULL AUTO_INCREMENT, + UserID int, + ProductID int, + SubscriptionStart date, + SubscriptionEnd date, + SubscriptionLength int, + PRIMARY KEY (SubscriptionID), + FOREIGN KEY (UserID) REFERENCES Users(UserID), + FOREIGN KEY (ProductID) REFERENCES Products(ProductID) +); + +CREATE TABLE AdminUsers ( + AdminUserID int NOT NULL AUTO_INCREMENT, + AdminUserName varchar(60), + AdminUserEmail varchar(60), + AdminUserPassword varchar(60), + AdminAcces boolean, + PRIMARY KEY (AdminUserID) +); \ No newline at end of file From 35f7199decfc868876166d5074051f5d2bb5be8b Mon Sep 17 00:00:00 2001 From: Gabrielle Cruz Date: Tue, 2 May 2023 19:48:24 +0200 Subject: [PATCH 10/11] ADD database scripts --- backend/helpers/cleardatabase.sql | 7 +++ backend/helpers/database.sql | 92 ++++++++++++++++--------------- backend/helpers/dummydata.sql | 13 +++++ 3 files changed, 67 insertions(+), 45 deletions(-) create mode 100644 backend/helpers/cleardatabase.sql create mode 100644 backend/helpers/dummydata.sql diff --git a/backend/helpers/cleardatabase.sql b/backend/helpers/cleardatabase.sql new file mode 100644 index 0000000000..2aa76752f1 --- /dev/null +++ b/backend/helpers/cleardatabase.sql @@ -0,0 +1,7 @@ +DELETE FROM Users; +DELETE FROM Products; +DELETE FROM Orders; +DELETE FROM Subscriptions; +DELETE FROM Baskets; +DELETE FROM Addresses; +DELETE FROM AdminUsers; diff --git a/backend/helpers/database.sql b/backend/helpers/database.sql index e54b096829..ec865f6da3 100644 --- a/backend/helpers/database.sql +++ b/backend/helpers/database.sql @@ -1,76 +1,78 @@ CREATE TABLE Users ( - UserID int NOT NULL AUTO_INCREMENT, - UserName varchar(60), - UserEmail varchar(60), - UserPassword varchar(60), - CreationDate Date, - DeletionDate Date, + UserID INT NOT NULL AUTO_INCREMENT, + UserName VARCHAR(60), + UserEmail VARCHAR(60), + UserPassword VARCHAR(60), + CreationDate DATE, + DeletionDate DATE, PRIMARY KEY (UserID) ); CREATE TABLE Products ( - ProductID int NOT NULL AUTO_INCREMENT, - ProductName varchar(60), - ProductDesc text, - ProductPrice decimal(6,2), - ProductOnSale boolean, + ProductID INT NOT NULL AUTO_INCREMENT, + ProductName VARCHAR(60), + ProductStock INT, + ProductDesc TEXT, + ProductPrice DECIMAL(6,2), + ProductOnSale BOOLEAN, PRIMARY KEY (ProductID) ); CREATE TABLE Addresses ( - AddressID int NOT NULL AUTO_INCREMENT, - UserID int, - Street varchar(100), - Postcode int, - Country varchar(30), + AddressID INT NOT NULL AUTO_INCREMENT, + UserID INT, + Street VARCHAR(100), + Postcode INT, + Country VARCHAR(30), PRIMARY KEY (AddressID), - FOREIGN KEY (UserID) references Users(UserID) + FOREIGN KEY (UserID) REFERENCES Users(UserID) ); CREATE TABLE Orders ( - OrderID int NOT NULL AUTO_INCREMENT, - UserID int, - ProductID int, - OrderSubtotal int, - OrderDate Date, - SubscriptionID int, - PaidDate Date, - DeliveryDate Date, - WasPaid boolean DEFAULT false, - WasDelivered boolean DEFAULT false, + OrderID INT NOT NULL AUTO_INCREMENT, + UserID INT, + ProductID INT, + OrderSubtotal INT, + OrderDate DATE, + SubscriptionID INT, + PaidDate DATE, + DeliveryDate DATE, + WasPaid BOOLEAN DEFAULT false, + WasDelivered BOOLEAN DEFAULT false, + NumItems INT NOT NULL DEFAULT 1, PRIMARY KEY (OrderID), FOREIGN KEY (UserID) REFERENCES Users(UserID), FOREIGN KEY (ProductID) REFERENCES Products(ProductID), - FOREIGN KEY (SubscriptionID) REFERENCES Subscriptions(SubscriptionID) + FOREIGN KEY (SubscriptionID) REFERENCES Subscriptions(SubscriptionID) ); CREATE TABLE Baskets ( - UserID int, - ItemIndex int NOT NULL AUTO_INCREMENT, - ItemQuantity int, - ProductID int, - PRIMARY KEY (ItemIndex), + UserID INT, + ItemIndex INT NOT NULL AUTO_INCREMENT, + ItemQuantity INT NOT NULL DEFAULT 1, + ProductID INT, + PRIMARY KEY (ItemIndex), FOREIGN KEY (UserID) REFERENCES Users(UserID), FOREIGN KEY (ProductID) REFERENCES Products(ProductID) ); CREATE TABLE Subscriptions ( - SubscriptionID int NOT NULL AUTO_INCREMENT, - UserID int, - ProductID int, - SubscriptionStart date, - SubscriptionEnd date, - SubscriptionLength int, + SubscriptionID INT NOT NULL AUTO_INCREMENT, + UserID INT, + ProductID INT, + SubscriptionStart DATE, + SubscriptionEnd DATE, + SubscriptionLength INT, PRIMARY KEY (SubscriptionID), FOREIGN KEY (UserID) REFERENCES Users(UserID), FOREIGN KEY (ProductID) REFERENCES Products(ProductID) ); CREATE TABLE AdminUsers ( - AdminUserID int NOT NULL AUTO_INCREMENT, - AdminUserName varchar(60), - AdminUserEmail varchar(60), - AdminUserPassword varchar(60), - AdminAcces boolean, - PRIMARY KEY (AdminUserID) + AdminUserID INT NOT NULL AUTO_INCREMENT, + AdminUserName VARCHAR(60), + AdminUserEmail VARCHAR(60), + AdminUserPassword VARCHAR(60), + AdminAccess BOOLEAN, + PRIMARY KEY (AdminUserID) ); \ No newline at end of file diff --git a/backend/helpers/dummydata.sql b/backend/helpers/dummydata.sql new file mode 100644 index 0000000000..86cd88757a --- /dev/null +++ b/backend/helpers/dummydata.sql @@ -0,0 +1,13 @@ +INSERT INTO Users(UserName, UserEmail, UserPassword, CreationDate) VALUES +('Toto', 'toto@gmail.com', 'totoiscool', NOW()), +('Tata', 'tata@gmail.com', 'tataiscool', NOW()); + +INSERT INTO Products(ProductName, ProductStock, ProductDesc, ProductPrice, ProductOnSale) VALUES +('Test Product 1', 50, 'This is the first test product.', 10.00, TRUE), +('Test Product 2', 20, 'This is the second test product.', 20.00, TRUE), +('Test Product 3', 10, 'This is the third test product.', 50.00, TRUE); + +INSERT INTO Baskets(UserID, ItemQuantity, ProductID) VALUES +(1, 2, 1), +(2, 1, 3); + From affa3d3d0086bfe09f36e574eb34fa3d85a54bd5 Mon Sep 17 00:00:00 2001 From: Gabrielle Cruz Date: Wed, 10 May 2023 18:11:29 +0200 Subject: [PATCH 11/11] ADD drop table scripts and dummy order data --- backend/helpers/cleardatabase.sql | 8 ++++++++ backend/helpers/dummydata.sql | 3 +++ 2 files changed, 11 insertions(+) diff --git a/backend/helpers/cleardatabase.sql b/backend/helpers/cleardatabase.sql index 2aa76752f1..17bec8683d 100644 --- a/backend/helpers/cleardatabase.sql +++ b/backend/helpers/cleardatabase.sql @@ -5,3 +5,11 @@ DELETE FROM Subscriptions; DELETE FROM Baskets; DELETE FROM Addresses; DELETE FROM AdminUsers; + +DROP TABLE Users; +DROP TABLE Products; +DROP TABLE Orders; +DROP TABLE Subscriptions; +DROP TABLE Baskets; +DROP TABLE Addresses; +DROP TABLE AdminUsers; \ No newline at end of file diff --git a/backend/helpers/dummydata.sql b/backend/helpers/dummydata.sql index 86cd88757a..4ad7929b81 100644 --- a/backend/helpers/dummydata.sql +++ b/backend/helpers/dummydata.sql @@ -11,3 +11,6 @@ INSERT INTO Baskets(UserID, ItemQuantity, ProductID) VALUES (1, 2, 1), (2, 1, 3); +INSERT INTO Orders(UserID, ProductID, OrderSubtotal, OrderDate, NumItems) VALUES +(1, 1, 20, NOW(), 2), +(2, 3, 50, NOW(), 1);