From 2b1526d5f1ccfbb09f0ce3b4ac2879b3bdf97da4 Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Tue, 4 Apr 2023 22:13:51 -0500 Subject: [PATCH 01/17] Implemented Homepage I created the necessary js and css modifications to have and display a functional home page for the Starbucks application. --- .../package.json | 20 +++ .../public/index.html | 1 + .../src/App.js | 24 ++++ .../src/components/NavLink.js | 24 ++++ .../src/components/Navbar.js | 13 ++ .../src/components/Title.js | 5 + .../src/index.js | 13 ++ .../src/pages/AboutPage.js | 13 ++ .../src/pages/HomePage.js | 129 ++++++++++++++++++ .../src/pages/PageNotFound.js | 13 ++ .../src/style.css | 59 ++++++++ 11 files changed, 314 insertions(+) create mode 100644 final-ethan-homepage-react-ts-ypkgv3/package.json create mode 100644 final-ethan-homepage-react-ts-ypkgv3/public/index.html create mode 100644 final-ethan-homepage-react-ts-ypkgv3/src/App.js create mode 100644 final-ethan-homepage-react-ts-ypkgv3/src/components/NavLink.js create mode 100644 final-ethan-homepage-react-ts-ypkgv3/src/components/Navbar.js create mode 100644 final-ethan-homepage-react-ts-ypkgv3/src/components/Title.js create mode 100644 final-ethan-homepage-react-ts-ypkgv3/src/index.js create mode 100644 final-ethan-homepage-react-ts-ypkgv3/src/pages/AboutPage.js create mode 100644 final-ethan-homepage-react-ts-ypkgv3/src/pages/HomePage.js create mode 100644 final-ethan-homepage-react-ts-ypkgv3/src/pages/PageNotFound.js create mode 100644 final-ethan-homepage-react-ts-ypkgv3/src/style.css diff --git a/final-ethan-homepage-react-ts-ypkgv3/package.json b/final-ethan-homepage-react-ts-ypkgv3/package.json new file mode 100644 index 0000000..961be8d --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/package.json @@ -0,0 +1,20 @@ +{ + "name": "react", + "version": "0.0.0", + "private": true, + "dependencies": { + "react": "^16.8.0", + "react-dom": "^16.8.0", + "react-router-dom": "^5.0.1", + "styled-components": "^4.3.2" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + }, + "devDependencies": { + "react-scripts": "latest" + } +} \ No newline at end of file diff --git a/final-ethan-homepage-react-ts-ypkgv3/public/index.html b/final-ethan-homepage-react-ts-ypkgv3/public/index.html new file mode 100644 index 0000000..98499e9 --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/public/index.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/final-ethan-homepage-react-ts-ypkgv3/src/App.js b/final-ethan-homepage-react-ts-ypkgv3/src/App.js new file mode 100644 index 0000000..274e64f --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/src/App.js @@ -0,0 +1,24 @@ +import React from 'react' +import styled from 'styled-components' +import { Route, Switch } from 'react-router-dom' + +import Navbar from './components/Navbar' +import HomePage from './pages/HomePage' +import banners from './pages/HomePage' + +import AboutPage from './pages/AboutPage' +import PageNotFound from './pages/PageNotFound' + +const App = ({ className }) => +
+ + + + + + +
+ +export default styled(App)` + +` \ No newline at end of file diff --git a/final-ethan-homepage-react-ts-ypkgv3/src/components/NavLink.js b/final-ethan-homepage-react-ts-ypkgv3/src/components/NavLink.js new file mode 100644 index 0000000..fe2f8d9 --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/src/components/NavLink.js @@ -0,0 +1,24 @@ +import React from 'react' +import { NavLink } from 'react-router-dom' +import styled from 'styled-components' + +const StyledNavLink = props => + +export default styled(StyledNavLink)` + color: black; + margin: 5px 8px; + text-decoration: none; + border-bottom: solid 0px; + + transition: 200ms; + + &.active { + color: red; + border-bottom: solid 3px red; + } + + &:hover { + color: #888; + } + +` diff --git a/final-ethan-homepage-react-ts-ypkgv3/src/components/Navbar.js b/final-ethan-homepage-react-ts-ypkgv3/src/components/Navbar.js new file mode 100644 index 0000000..a2e80a0 --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/src/components/Navbar.js @@ -0,0 +1,13 @@ +import React from 'react' +import NavLink from './NavLink' +import styled from 'styled-components' + +const Navbar = ({ className }) => + + +export default styled(Navbar)` + +` diff --git a/final-ethan-homepage-react-ts-ypkgv3/src/components/Title.js b/final-ethan-homepage-react-ts-ypkgv3/src/components/Title.js new file mode 100644 index 0000000..5fc184d --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/src/components/Title.js @@ -0,0 +1,5 @@ +import styled from 'styled-components' + +export default styled.h1` + text-decoration: underline; +` diff --git a/final-ethan-homepage-react-ts-ypkgv3/src/index.js b/final-ethan-homepage-react-ts-ypkgv3/src/index.js new file mode 100644 index 0000000..6b9c75c --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/src/index.js @@ -0,0 +1,13 @@ +import React, { Component } from 'react' +import { render } from 'react-dom' +import { BrowserRouter as Router } from 'react-router-dom' + +import App from './App' +import './style.css' + +render( + + + , + document.getElementById('root') +) diff --git a/final-ethan-homepage-react-ts-ypkgv3/src/pages/AboutPage.js b/final-ethan-homepage-react-ts-ypkgv3/src/pages/AboutPage.js new file mode 100644 index 0000000..15e4fc2 --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/src/pages/AboutPage.js @@ -0,0 +1,13 @@ +import React from 'react' +import styled from 'styled-components' + +import Title from '../components/Title' + +const AboutPage = props => +
+ About Page +
+ +export default styled(AboutPage)` + +` diff --git a/final-ethan-homepage-react-ts-ypkgv3/src/pages/HomePage.js b/final-ethan-homepage-react-ts-ypkgv3/src/pages/HomePage.js new file mode 100644 index 0000000..b53aadf --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/src/pages/HomePage.js @@ -0,0 +1,129 @@ +import React from 'react' +import styled from 'styled-components' + +import Title from '../components/Title' + +const HomePage = props => { + const banners = [ + // {color: '#C1E7D9', + // height: '300px', + // link: 'https://www.starbucks.com/menu' + // }, + + // {color: '#8ADB9B', text: 'Easter Treats', height: '500px', image: 'https://www.starbucks.com/weblx/images/easter/easter-chick.jpg', + // link: 'https://www.starbucks.com/menu' }, + + // { color: '#EBBECB', image: 'https://www.starbucks.com/weblx/images/happy-hour/happy-hour-desktop.jpg', link: 'https://www.starbucks.com/menu' }, + + + + + + + // {color: '#C1E7D9', + // text: 'New Spring Drinks', height: '300px', + // image: 'https://www.starbucks.com/weblx/images/spring-21/spring-21-cold-beverage.jpg', + // link: 'https://www.starbucks.com/menu' + // }, + + // { color: '#8ADB9B', height: '500px', image: 'https://www.starbucks.com/weblx/images/easter/easter-chick.jpg', link: 'https://www.starbucks.com/menu' }, + + // { color: '#EBBECB', height: '300px', text: 'Limited Time Offer', image: 'https://www.starbucks.com/weblx/images/happy-hour/happy-hour-desktop.jpg', link: 'https://www.starbucks.com/menu' }, + ]; + + const leftBanners = banners.slice(0, Math.ceil(banners.length / 2)); + const rightBanners = banners.slice(Math.ceil(banners.length / 2)); + + return ( + + {/* Starbucks Home */} + + + + + + + + + + New Easter Treats + + + + + + + + + + + + Savory Breakfast + + + + + + + + + + Limited Time Offers + + + + + + ) +} + +const HomePageWrapper = styled.div` + margin: 0 auto; +`; + +const BannerContainer = styled.div` + display: flex; + justify-content: space-between; + margin-top: 100px; +`; + +const LeftBannerContainer = styled.div` + display: flex; + flex-direction: column; + width: 50%; +`; + +const RightBannerContainer = styled.div` + display: flex; + flex-direction: column; + width: 50%; +`; + +const Banner = styled.div` + background-color: ${props => props.color}; + padding: 10px; + margin-right: 0; + margin-left: 0; + max-width: 100%; + text-align: center; + box-sizing: border-box; + margin-bottom: 30px; + height: ${props => props.height}; + img { + width: 100%; + height: auto; + margin-bottom: 20px; + } + // &:not(:last-child) { + // } +`; + +const BannerText = styled.h2` + font-size: 24px; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; +`; + +export default HomePage; \ No newline at end of file diff --git a/final-ethan-homepage-react-ts-ypkgv3/src/pages/PageNotFound.js b/final-ethan-homepage-react-ts-ypkgv3/src/pages/PageNotFound.js new file mode 100644 index 0000000..9b5332a --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/src/pages/PageNotFound.js @@ -0,0 +1,13 @@ +import React from 'react' +import styled from 'styled-components' + +import Title from '../components/Title' + +const PageNotFound = props => +
+ Page Not Found +
+ +export default styled(PageNotFound)` + +` diff --git a/final-ethan-homepage-react-ts-ypkgv3/src/style.css b/final-ethan-homepage-react-ts-ypkgv3/src/style.css new file mode 100644 index 0000000..1de9e29 --- /dev/null +++ b/final-ethan-homepage-react-ts-ypkgv3/src/style.css @@ -0,0 +1,59 @@ +* { + font-family: Lato; +} +a{ + text-decoration: none; +} +.left1{ + background-color: #C1E7D9; + height: 300px; + background-image: url('https://content-prod-live.cert.starbucks.com/binary/v2/asset/137-83504.png'); + background-size: 300px; + background-position: center; +} +.left2{ + background-color: #8ADB9B; + height: 500px; + font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; +} +.textleft2{ + font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; + margin-top: 230px; + color: #0A4E01; +} +.left3{ + background-color: #EBBECB; + background-image: url('https://cdn.shopify.com/s/files/1/0073/0929/5674/products/BABitems-511_3811x.jpg?v=1644361765'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + height: 300px; +} +.right1{ + background-color: #C1E7D9; + height: 300px; +} +.textright1{ + font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; + margin-top: 130px; + color: #037A64; +} +.right2{ + background-image: url('https://content-prod-live.cert.starbucks.com/binary/v2/asset/137-83265.jpg'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + background-color: #8ADB9B; + height: 500px; +} +.right3{ + background-color: #EBBECB; + height: 300px; + +} +.textright3{ + font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; + text-decoration: none; + margin-top: 100px; + color: #7A036D; +} \ No newline at end of file From 7cd7b1998b7f14a8b0aa86367a4411947bb4d99b Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Thu, 27 Apr 2023 20:33:07 -0500 Subject: [PATCH 02/17] Add files via upload --- backend/package-lock.json | 1099 +++++++++++++++++++++++++++++++++++ backend/package.json | 20 + backend/server.js | 49 ++ backend/server_functions.js | 163 ++++++ 4 files changed, 1331 insertions(+) create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/server.js create mode 100644 backend/server_functions.js diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..fbbd446 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,1099 @@ +{ + "name": "learn", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "learn", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "express": "^4.18.2", + "pg": "^8.10.0" + }, + "devDependencies": { + "nodemon": "^2.0.22" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pg": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", + "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.6.0", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", + "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..e41c8f0 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,20 @@ +{ + "name": "learn", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "devStart": "nodemon server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "express": "^4.18.2", + "pg": "^8.10.0" + }, + "devDependencies": { + "nodemon": "^2.0.22" + } +} diff --git a/backend/server.js b/backend/server.js new file mode 100644 index 0000000..ee74006 --- /dev/null +++ b/backend/server.js @@ -0,0 +1,49 @@ +const express = require('express'); +const { Pool } = require('pg'); + +const app = express(); + +const pool = new Pool({ + 'host': 'csce-315-db.engr.tamu.edu', + 'user': 'csce315331_team_62_master', + 'database': 'csce315331_team_62', + 'password': 'panda', + 'port': '5432' + +}); +app.get('/cunt', async (req, res) => { + try { + const data = await pool.query('SELECT * FROM Inventory'); + res.json(data.rows); + console.log(data) + } catch (err) { + console.error(err); + res.sendStatus(500); + } +}); +app.get('/queryInventory/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM inventory ORDER BY id'; + } + else{ + queryToUse = 'SELECT * FROM inventory WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } + }); + +// console.log("cunt") +app.listen(3001, () => { + console.log('Server listening on port 5000'); +}); \ No newline at end of file diff --git a/backend/server_functions.js b/backend/server_functions.js new file mode 100644 index 0000000..676e905 --- /dev/null +++ b/backend/server_functions.js @@ -0,0 +1,163 @@ +import { useState, useEffect } from 'react'; + +/* Fetch menu items from list to display in table */ +// function GetMenuList(start, end){ +// const [menuItems, setMenuItems] = useState([]); + +// useEffect(() => { +// async function fetchMenuItems() { +// const response = await fetch(`http://localhost:3001/menuRequest/${start}/${end}`); +// const data = await response.json(); +// setMenuItems(data); +// } + +// fetchMenuItems(); +// }, [start, end]); + +// console.log(menuItems); +// return menuItems; +// } + +/* Fetch menu items from list to display in table */ +function GetInventoryList(start, end){ + const [inventoryItems, setInventoryItems] = useState([]); + + useEffect(() => { + async function fetchInventoryItems() { + const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const data = await response.json(); + setInventoryItems(data); + } + + fetchInventoryItems(); + }, [start, end]); + + return inventoryItems; +} + +//fetch all menu items from database table +// function GetAllMenuList(){ +// const [menuItems, setMenuItems] = useState([]); + +// useEffect(() => { +// async function fetchMenuItems() { +// const response = await fetch(`http://localhost:3001/menuRequestAll/`); +// const data = await response.json(); +// setMenuItems(data); +// } + +// fetchMenuItems(); +// }, []); + +// return menuItems; +// } + +//Fetch ingredient list to be display in table +function GetIngredients(start, end) { + const [ingredientArr, setIngredientArr] = useState([]); + + useEffect(() => { + async function fetchIngredients() { + const response = await fetch(`http://localhost:3001/getInventoryItemsForMenu/${start}/${end}`); + const data = await response.json(); + //data.sort((a, b) => a.menu_id - b.menu_id); + setIngredientArr(data); + } + + fetchIngredients(); + }, [start, end]); + + return ingredientArr; +} + +let addToCartPromise = Promise.resolve(); //synchronization thing +function AddToCart(type, name, quantity, price) { + const myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); + //console.log("Adding " +quantity + " units of "+ type + ": " + name+ " to cart for user " + myID + " with price " + price); + const item = { type, name, quantity, price }; + + addToCartPromise = addToCartPromise.then(async () => { + const response = await fetch(`http://localhost:3001/addToCart/${myID}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(item) + }); + const data = await response.json(); + console.log(data.message); + }); +} + + +function GetCartItems(){ + const [myCart, setCart] = useState([]); + var myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); + //console.log("getting cart"); + + useEffect(() => { + async function fetchCart() { + const response = await fetch(`http://localhost:3001/getCart/${myID}`); + const data = await response.json(); + setCart(data.rows[0].orderlist); + //console.log("cart in func: " + data.rows[0].orderlist); + } + fetchCart(); + }, [myID]); + + //console.log("cart: " + myCart); // should log an array of cart items + const items = []; + const modlist = []; + var j = 1; + + if(myCart !== null) { + for (let i = 0; i < myCart.length; i++) { + const element = JSON.parse(myCart[i]); + if(element.type === "item") { + const item = { id: j, name: element.name, price: element.price, qty: 1, mods: [...modlist]} + items.push(item); + modlist.length = 0; + j++; + } else { + if(element.name === "Beef Patty") { + if(element.quantity === -1) + modlist.push("SUB Black Bean Patty"); + } + else if(element.name === "Vanilla Ice Cream") { + if(element.quantity === -1) + modlist.push("CHOCOLATE"); + else if(element.quantity === 0) + modlist.push("VANILLA"); + else if(element.quantity === 1) + modlist.push("COFFEE"); + else + modlist.push("STRAWBERRY"); + } + else if(element.name === "x") { + if(element.quantity === -1) + modlist.push("BUFFALO"); + else if(element.quantity === 0) + modlist.push("BBQ"); + else if(element.quantity === 1) + modlist.push("HONEY MUSTARD"); + else if(element.quantity === 2) + modlist.push("RANCH"); + else if(element.quantity === 3) + modlist.push("SPICY RANCH"); + else if(element.quantity === 4) + modlist.push("GIG EM"); + } + else { + if(element.quantity === -1) + modlist.push("NO " + element.name); + else + modlist.push("EXTRA " + element.name); + } + } + }; + } + return items; +} + + +export {GetMenuList, GetIngredients, AddToCart, GetCartItems, GetInventoryList}; From ea6d756e579710641071208935f13b641d3641b9 Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Thu, 27 Apr 2023 20:34:07 -0500 Subject: [PATCH 03/17] Add files via upload --- pages/Manager.js | 144 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 pages/Manager.js diff --git a/pages/Manager.js b/pages/Manager.js new file mode 100644 index 0000000..47965a8 --- /dev/null +++ b/pages/Manager.js @@ -0,0 +1,144 @@ +import React, { useState } from 'react'; +import styled from 'styled-components'; + +const Manager = () => { + const [activeTab, setActiveTab] = useState(0); // Define the active tab state + + const tabs = [ + { id: 0, name: 'Inventory', tableData: [ // Define the tabs and their table data + { id: 1, name: 'John', age: 28, number: "346-530-4989"}, + { id: 2, name: 'Jane', age: 32, number: "346-530-4989" }, + { id: 3, name: 'Joe', age: 21, number: "346-530-4989" }, + ] }, + { id: 1, name: 'Transactions', tableData: [ + { id: 1, name: 'Bob', age: 45 }, + { id: 2, name: 'Alice', age: 36 }, + { id: 3, name: 'Mark', age: 29 }, + ] }, + { id: 2, name: 'Products', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 3, name: 'Customizations', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 4, name: 'Sales', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 5, name: 'Orders', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 6, name: 'Employees', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 7, name: 'Customers', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 8, name: 'Recipes', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 9, name: 'Sizes', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 10, name: 'Reports', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + ]; + + const handleTabClick = (tabIndex) => { + setActiveTab(tabIndex); // Update the active tab state when a tab is clicked + }; + + return ( +
+
+ Logo +
+
+
+ {tabs.map((tab) => ( +
handleTabClick(tab.id)} + style={{ + backgroundColor: activeTab === tab.id ? '#1e3932' : '#00754a', + color: 'white', + padding: '10px', + cursor: 'pointer', + }} + > + {tab.name} +
+ ))} +
+
+ {tabs.map((tab) => ( +
+ + + + + + + + + + + {tab.tableData.map((data) => ( + + + + + + + ))} + +
IDNameAgeNumber
{data.id}{data.name}{data.age}{data.number}
+
+ ))} +
+
+
+
)} + +export default Manager; + From 98690b6b0afd0796621410cecb4b00a93fdf6479 Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:53:55 -0500 Subject: [PATCH 04/17] Add files via upload --- Manager.js | 209 ++++++++ package-lock.json | 1120 +++++++++++++++++++++++++++++++++++++++++++ package.json | 31 +- server.js | 51 ++ server_functions.js | 168 +++++++ 5 files changed, 1564 insertions(+), 15 deletions(-) create mode 100644 Manager.js create mode 100644 package-lock.json create mode 100644 server.js create mode 100644 server_functions.js diff --git a/Manager.js b/Manager.js new file mode 100644 index 0000000..56b016d --- /dev/null +++ b/Manager.js @@ -0,0 +1,209 @@ +import React, { useState } from 'react'; +import styled from 'styled-components'; +import {GetInventoryList} from '../backend/server_functions'; + +const Manager = () => { + const [activeTab, setActiveTab] = useState(0); // Define the active tab state + const inventoryData = GetInventoryList(0,0); + + const title = [ + { id: 0, name: 'Inventory', tableData: [] + }, + { id: 1, name: 'Transactions', tableData: [ + { id: 1, name: 'Bob', age: 45 }, + { id: 2, name: 'Alice', age: 36 }, + { id: 3, name: 'Mark', age: 29 }, + ] }, + { id: 2, name: 'Products', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 3, name: 'Customizations', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 4, name: 'Sales', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 5, name: 'Orders', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 6, name: 'Employees', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 7, name: 'Customers', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 8, name: 'Recipes', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 9, name: 'Sizes', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 10, name: 'Reports', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + ]; + const tabs = [ + { id: 0, name: 'Inventory', tableData: inventoryData + // [ // Define the tabs and their table data + // { id: 1, name: 'John', age: 28, number: "346-530-4989"}, + // { id: 2, name: 'Jane', age: 32, number: "346-530-4989" }, + // { id: 3, name: 'Joe', age: 21, number: "346-530-4989" }, + // ] + }, + { id: 1, name: 'Transactions', tableData: [ + { id: 1, name: 'Bob', age: 45 }, + { id: 2, name: 'Alice', age: 36 }, + { id: 3, name: 'Mark', age: 29 }, + ] }, + { id: 2, name: 'Products', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 3, name: 'Customizations', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 4, name: 'Sales', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 5, name: 'Orders', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 6, name: 'Employees', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 7, name: 'Customers', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 8, name: 'Recipes', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 9, name: 'Sizes', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 10, name: 'Reports', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + ]; + + const handleTabClick = (tabIndex) => { + setActiveTab(tabIndex); // Update the active tab state when a tab is clicked + }; + + return ( +
+
+ Logo +
+
+
+ {tabs.map((tab) => ( +
handleTabClick(tab.id)} + style={{ + backgroundColor: activeTab === tab.id ? '#1e3932' : '#00754a', + color: 'white', + padding: '10px', + cursor: 'pointer', + }} + > + {tab.name} +
+ ))} +
+
+ {tabs.map((tab) => ( +
+ + + + + + + + + + + {/* {tab.tableData.map((data) => ( + + + + + + + ))} */} + {tab.tableData.map((data) => ( + + {Object.keys(data).map((key) => ( + + ))} + + ))} + +
IDNameAgeNumber
{data.id}{data.name}{data.age}{data.number}
{data[key]}
+
+ ))} +
+
+
+
)} + +export default Manager; + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e8e66b7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1120 @@ +{ + "name": "learn", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "learn", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.18.2", + "pg": "^8.10.0" + }, + "devDependencies": { + "nodemon": "^2.0.22" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pg": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", + "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.6.0", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", + "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/package.json b/package.json index 961be8d..cea48ac 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,21 @@ { - "name": "react", - "version": "0.0.0", - "private": true, - "dependencies": { - "react": "^16.8.0", - "react-dom": "^16.8.0", - "react-router-dom": "^5.0.1", - "styled-components": "^4.3.2" - }, + "name": "learn", + "version": "1.0.0", + "description": "", + "main": "index.js", "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test --env=jsdom", - "eject": "react-scripts eject" + "test": "echo \"Error: no test specified\" && exit 1", + "devStart": "nodemon server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.18.2", + "pg": "^8.10.0" }, "devDependencies": { - "react-scripts": "latest" + "nodemon": "^2.0.22" } -} \ No newline at end of file +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..98a5bc7 --- /dev/null +++ b/server.js @@ -0,0 +1,51 @@ +const express = require('express'); +const { Pool } = require('pg'); +const cors = require('cors'); + +const app = express(); +app.use(cors()); + +const pool = new Pool({ + 'host': 'csce-315-db.engr.tamu.edu', + 'user': 'csce315331_team_62_master', + 'database': 'csce315331_team_62', + 'password': 'panda', + 'port': '5432' + +}); +app.get('/cunt', async (req, res) => { + try { + const data = await pool.query('SELECT * FROM Inventory'); + res.json(data.rows); + console.log(data) + } catch (err) { + console.error(err); + res.sendStatus(500); + } +}); +app.get('/queryInventory/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM inventory ORDER BY id'; + } + else{ + queryToUse = 'SELECT * FROM inventory WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } + }); + +// console.log("cunt") +app.listen(3001, () => { + console.log('Server listening on port 5000'); +}); \ No newline at end of file diff --git a/server_functions.js b/server_functions.js new file mode 100644 index 0000000..421a973 --- /dev/null +++ b/server_functions.js @@ -0,0 +1,168 @@ +import { useState, useEffect } from 'react'; + +/* Fetch menu items from list to display in table */ +// function GetMenuList(start, end){ +// const [menuItems, setMenuItems] = useState([]); + +// useEffect(() => { +// async function fetchMenuItems() { +// const response = await fetch(`http://localhost:3001/menuRequest/${start}/${end}`); +// const data = await response.json(); +// setMenuItems(data); +// } + +// fetchMenuItems(); +// }, [start, end]); + +// console.log(menuItems); +// return menuItems; +// } + +/* Fetch menu items from list to display in table */ +function GetInventoryList(start, end){ + const [inventoryItems, setInventoryItems] = useState([]); + + useEffect(() => { + + async function fetchInventoryItems() { + // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const response = await fetch(`http://localhost:3001/queryInventory/0/0`); + + const data = await response.json(); + setInventoryItems(data); + console.log("queried") + + } + console.log("useEffect") + fetchInventoryItems(); + }, [start, end]); + + return inventoryItems; +} + +//fetch all menu items from database table +// function GetAllMenuList(){ +// const [menuItems, setMenuItems] = useState([]); + +// useEffect(() => { +// async function fetchMenuItems() { +// const response = await fetch(`http://localhost:3001/menuRequestAll/`); +// const data = await response.json(); +// setMenuItems(data); +// } + +// fetchMenuItems(); +// }, []); + +// return menuItems; +// } + +//Fetch ingredient list to be display in table +// function GetIngredients(start, end) { +// const [ingredientArr, setIngredientArr] = useState([]); + +// useEffect(() => { +// async function fetchIngredients() { +// const response = await fetch(`http://localhost:3001/getInventoryItemsForMenu/${start}/${end}`); +// const data = await response.json(); +// //data.sort((a, b) => a.menu_id - b.menu_id); +// setIngredientArr(data); +// } + +// fetchIngredients(); +// }, [start, end]); + +// return ingredientArr; +// } + +// let addToCartPromise = Promise.resolve(); //synchronization thing +// function AddToCart(type, name, quantity, price) { +// const myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); +// //console.log("Adding " +quantity + " units of "+ type + ": " + name+ " to cart for user " + myID + " with price " + price); +// const item = { type, name, quantity, price }; + +// addToCartPromise = addToCartPromise.then(async () => { +// const response = await fetch(`http://localhost:3001/addToCart/${myID}`, { +// method: 'POST', +// headers: { +// 'Content-Type': 'application/json' +// }, +// body: JSON.stringify(item) +// }); +// const data = await response.json(); +// console.log(data.message); +// }); +// } + + +// function GetCartItems(){ +// const [myCart, setCart] = useState([]); +// var myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); +// //console.log("getting cart"); + +// useEffect(() => { +// async function fetchCart() { +// const response = await fetch(`http://localhost:3001/getCart/${myID}`); +// const data = await response.json(); +// setCart(data.rows[0].orderlist); +// //console.log("cart in func: " + data.rows[0].orderlist); +// } +// fetchCart(); +// }, [myID]); + +// //console.log("cart: " + myCart); // should log an array of cart items +// const items = []; +// const modlist = []; +// var j = 1; + +// if(myCart !== null) { +// for (let i = 0; i < myCart.length; i++) { +// const element = JSON.parse(myCart[i]); +// if(element.type === "item") { +// const item = { id: j, name: element.name, price: element.price, qty: 1, mods: [...modlist]} +// items.push(item); +// modlist.length = 0; +// j++; +// } else { +// if(element.name === "Beef Patty") { +// if(element.quantity === -1) +// modlist.push("SUB Black Bean Patty"); +// } +// else if(element.name === "Vanilla Ice Cream") { +// if(element.quantity === -1) +// modlist.push("CHOCOLATE"); +// else if(element.quantity === 0) +// modlist.push("VANILLA"); +// else if(element.quantity === 1) +// modlist.push("COFFEE"); +// else +// modlist.push("STRAWBERRY"); +// } +// else if(element.name === "x") { +// if(element.quantity === -1) +// modlist.push("BUFFALO"); +// else if(element.quantity === 0) +// modlist.push("BBQ"); +// else if(element.quantity === 1) +// modlist.push("HONEY MUSTARD"); +// else if(element.quantity === 2) +// modlist.push("RANCH"); +// else if(element.quantity === 3) +// modlist.push("SPICY RANCH"); +// else if(element.quantity === 4) +// modlist.push("GIG EM"); +// } +// else { +// if(element.quantity === -1) +// modlist.push("NO " + element.name); +// else +// modlist.push("EXTRA " + element.name); +// } +// } +// }; +// } +// return items; +// } + + +export {GetInventoryList}; From 1be489a3c52a350c4739cb3c4ffc9fcb38077175 Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:54:24 -0500 Subject: [PATCH 05/17] Delete Manager.js --- Manager.js | 209 ----------------------------------------------------- 1 file changed, 209 deletions(-) delete mode 100644 Manager.js diff --git a/Manager.js b/Manager.js deleted file mode 100644 index 56b016d..0000000 --- a/Manager.js +++ /dev/null @@ -1,209 +0,0 @@ -import React, { useState } from 'react'; -import styled from 'styled-components'; -import {GetInventoryList} from '../backend/server_functions'; - -const Manager = () => { - const [activeTab, setActiveTab] = useState(0); // Define the active tab state - const inventoryData = GetInventoryList(0,0); - - const title = [ - { id: 0, name: 'Inventory', tableData: [] - }, - { id: 1, name: 'Transactions', tableData: [ - { id: 1, name: 'Bob', age: 45 }, - { id: 2, name: 'Alice', age: 36 }, - { id: 3, name: 'Mark', age: 29 }, - ] }, - { id: 2, name: 'Products', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 3, name: 'Customizations', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 4, name: 'Sales', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 5, name: 'Orders', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 6, name: 'Employees', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 7, name: 'Customers', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 8, name: 'Recipes', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 9, name: 'Sizes', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 10, name: 'Reports', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - ]; - const tabs = [ - { id: 0, name: 'Inventory', tableData: inventoryData - // [ // Define the tabs and their table data - // { id: 1, name: 'John', age: 28, number: "346-530-4989"}, - // { id: 2, name: 'Jane', age: 32, number: "346-530-4989" }, - // { id: 3, name: 'Joe', age: 21, number: "346-530-4989" }, - // ] - }, - { id: 1, name: 'Transactions', tableData: [ - { id: 1, name: 'Bob', age: 45 }, - { id: 2, name: 'Alice', age: 36 }, - { id: 3, name: 'Mark', age: 29 }, - ] }, - { id: 2, name: 'Products', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 3, name: 'Customizations', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 4, name: 'Sales', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 5, name: 'Orders', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 6, name: 'Employees', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 7, name: 'Customers', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 8, name: 'Recipes', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 9, name: 'Sizes', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 10, name: 'Reports', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - ]; - - const handleTabClick = (tabIndex) => { - setActiveTab(tabIndex); // Update the active tab state when a tab is clicked - }; - - return ( -
-
- Logo -
-
-
- {tabs.map((tab) => ( -
handleTabClick(tab.id)} - style={{ - backgroundColor: activeTab === tab.id ? '#1e3932' : '#00754a', - color: 'white', - padding: '10px', - cursor: 'pointer', - }} - > - {tab.name} -
- ))} -
-
- {tabs.map((tab) => ( -
- - - - - - - - - - - {/* {tab.tableData.map((data) => ( - - - - - - - ))} */} - {tab.tableData.map((data) => ( - - {Object.keys(data).map((key) => ( - - ))} - - ))} - -
IDNameAgeNumber
{data.id}{data.name}{data.age}{data.number}
{data[key]}
-
- ))} -
-
-
-
)} - -export default Manager; - From 1dfc15dce51ac270b10c38b409818bcca55dac7a Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:55:03 -0500 Subject: [PATCH 06/17] Delete package-lock.json --- package-lock.json | 1120 --------------------------------------------- 1 file changed, 1120 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index e8e66b7..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1120 +0,0 @@ -{ - "name": "learn", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "learn", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "cors": "^2.8.5", - "express": "^4.18.2", - "pg": "^8.10.0" - }, - "devDependencies": { - "nodemon": "^2.0.22" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/pg": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", - "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", - "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", - "pg-pool": "^3.6.0", - "pg-protocol": "^1.6.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", - "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, - "dependencies": { - "semver": "~7.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - } - } -} From bba64ffad8431fcc8ebf4fef57f5bdf0f660647a Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:55:10 -0500 Subject: [PATCH 07/17] Delete package.json --- package.json | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 package.json diff --git a/package.json b/package.json deleted file mode 100644 index cea48ac..0000000 --- a/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "learn", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "devStart": "nodemon server.js" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "cors": "^2.8.5", - "express": "^4.18.2", - "pg": "^8.10.0" - }, - "devDependencies": { - "nodemon": "^2.0.22" - } -} From c050ebecc2d180fecb066fbb9c92a54d834d3359 Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:55:17 -0500 Subject: [PATCH 08/17] Delete server.js --- server.js | 51 --------------------------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 server.js diff --git a/server.js b/server.js deleted file mode 100644 index 98a5bc7..0000000 --- a/server.js +++ /dev/null @@ -1,51 +0,0 @@ -const express = require('express'); -const { Pool } = require('pg'); -const cors = require('cors'); - -const app = express(); -app.use(cors()); - -const pool = new Pool({ - 'host': 'csce-315-db.engr.tamu.edu', - 'user': 'csce315331_team_62_master', - 'database': 'csce315331_team_62', - 'password': 'panda', - 'port': '5432' - -}); -app.get('/cunt', async (req, res) => { - try { - const data = await pool.query('SELECT * FROM Inventory'); - res.json(data.rows); - console.log(data) - } catch (err) { - console.error(err); - res.sendStatus(500); - } -}); -app.get('/queryInventory/:start/:end', async (req, res) => { - try { - const start = parseInt(req.params.start); - const end = parseInt(req.params.end); - var queryToUse; - if((start === 0) && (end === 0)){ - queryToUse = 'SELECT * FROM inventory ORDER BY id'; - } - else{ - queryToUse = 'SELECT * FROM inventory WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; - } - console.log(queryToUse); - const { rows } = await pool.query(queryToUse); - res.json(rows); - //console.log(rows); - } catch (err) { - - console.error("Read query in inventory failed " +err); - res.status(500).json({ error: 'Internal server error' }); - } - }); - -// console.log("cunt") -app.listen(3001, () => { - console.log('Server listening on port 5000'); -}); \ No newline at end of file From 2e167a764f911fffca222e85a24ed491f9ad3390 Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:55:22 -0500 Subject: [PATCH 09/17] Delete server_functions.js --- server_functions.js | 168 -------------------------------------------- 1 file changed, 168 deletions(-) delete mode 100644 server_functions.js diff --git a/server_functions.js b/server_functions.js deleted file mode 100644 index 421a973..0000000 --- a/server_functions.js +++ /dev/null @@ -1,168 +0,0 @@ -import { useState, useEffect } from 'react'; - -/* Fetch menu items from list to display in table */ -// function GetMenuList(start, end){ -// const [menuItems, setMenuItems] = useState([]); - -// useEffect(() => { -// async function fetchMenuItems() { -// const response = await fetch(`http://localhost:3001/menuRequest/${start}/${end}`); -// const data = await response.json(); -// setMenuItems(data); -// } - -// fetchMenuItems(); -// }, [start, end]); - -// console.log(menuItems); -// return menuItems; -// } - -/* Fetch menu items from list to display in table */ -function GetInventoryList(start, end){ - const [inventoryItems, setInventoryItems] = useState([]); - - useEffect(() => { - - async function fetchInventoryItems() { - // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); - const response = await fetch(`http://localhost:3001/queryInventory/0/0`); - - const data = await response.json(); - setInventoryItems(data); - console.log("queried") - - } - console.log("useEffect") - fetchInventoryItems(); - }, [start, end]); - - return inventoryItems; -} - -//fetch all menu items from database table -// function GetAllMenuList(){ -// const [menuItems, setMenuItems] = useState([]); - -// useEffect(() => { -// async function fetchMenuItems() { -// const response = await fetch(`http://localhost:3001/menuRequestAll/`); -// const data = await response.json(); -// setMenuItems(data); -// } - -// fetchMenuItems(); -// }, []); - -// return menuItems; -// } - -//Fetch ingredient list to be display in table -// function GetIngredients(start, end) { -// const [ingredientArr, setIngredientArr] = useState([]); - -// useEffect(() => { -// async function fetchIngredients() { -// const response = await fetch(`http://localhost:3001/getInventoryItemsForMenu/${start}/${end}`); -// const data = await response.json(); -// //data.sort((a, b) => a.menu_id - b.menu_id); -// setIngredientArr(data); -// } - -// fetchIngredients(); -// }, [start, end]); - -// return ingredientArr; -// } - -// let addToCartPromise = Promise.resolve(); //synchronization thing -// function AddToCart(type, name, quantity, price) { -// const myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); -// //console.log("Adding " +quantity + " units of "+ type + ": " + name+ " to cart for user " + myID + " with price " + price); -// const item = { type, name, quantity, price }; - -// addToCartPromise = addToCartPromise.then(async () => { -// const response = await fetch(`http://localhost:3001/addToCart/${myID}`, { -// method: 'POST', -// headers: { -// 'Content-Type': 'application/json' -// }, -// body: JSON.stringify(item) -// }); -// const data = await response.json(); -// console.log(data.message); -// }); -// } - - -// function GetCartItems(){ -// const [myCart, setCart] = useState([]); -// var myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); -// //console.log("getting cart"); - -// useEffect(() => { -// async function fetchCart() { -// const response = await fetch(`http://localhost:3001/getCart/${myID}`); -// const data = await response.json(); -// setCart(data.rows[0].orderlist); -// //console.log("cart in func: " + data.rows[0].orderlist); -// } -// fetchCart(); -// }, [myID]); - -// //console.log("cart: " + myCart); // should log an array of cart items -// const items = []; -// const modlist = []; -// var j = 1; - -// if(myCart !== null) { -// for (let i = 0; i < myCart.length; i++) { -// const element = JSON.parse(myCart[i]); -// if(element.type === "item") { -// const item = { id: j, name: element.name, price: element.price, qty: 1, mods: [...modlist]} -// items.push(item); -// modlist.length = 0; -// j++; -// } else { -// if(element.name === "Beef Patty") { -// if(element.quantity === -1) -// modlist.push("SUB Black Bean Patty"); -// } -// else if(element.name === "Vanilla Ice Cream") { -// if(element.quantity === -1) -// modlist.push("CHOCOLATE"); -// else if(element.quantity === 0) -// modlist.push("VANILLA"); -// else if(element.quantity === 1) -// modlist.push("COFFEE"); -// else -// modlist.push("STRAWBERRY"); -// } -// else if(element.name === "x") { -// if(element.quantity === -1) -// modlist.push("BUFFALO"); -// else if(element.quantity === 0) -// modlist.push("BBQ"); -// else if(element.quantity === 1) -// modlist.push("HONEY MUSTARD"); -// else if(element.quantity === 2) -// modlist.push("RANCH"); -// else if(element.quantity === 3) -// modlist.push("SPICY RANCH"); -// else if(element.quantity === 4) -// modlist.push("GIG EM"); -// } -// else { -// if(element.quantity === -1) -// modlist.push("NO " + element.name); -// else -// modlist.push("EXTRA " + element.name); -// } -// } -// }; -// } -// return items; -// } - - -export {GetInventoryList}; From 06b16b50e36390f4e80b70812c6d30e186faa30e Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:56:04 -0500 Subject: [PATCH 10/17] Should also have node modules --- backend/package-lock.json | 21 ++++ backend/package.json | 1 + backend/server.js | 2 + backend/server_functions.js | 209 ++++++++++++++++++------------------ 4 files changed, 131 insertions(+), 102 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index fbbd446..e8e66b7 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "cors": "^2.8.5", "express": "^4.18.2", "pg": "^8.10.0" }, @@ -205,6 +206,18 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -647,6 +660,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", diff --git a/backend/package.json b/backend/package.json index e41c8f0..cea48ac 100644 --- a/backend/package.json +++ b/backend/package.json @@ -11,6 +11,7 @@ "author": "", "license": "ISC", "dependencies": { + "cors": "^2.8.5", "express": "^4.18.2", "pg": "^8.10.0" }, diff --git a/backend/server.js b/backend/server.js index ee74006..98a5bc7 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,7 +1,9 @@ const express = require('express'); const { Pool } = require('pg'); +const cors = require('cors'); const app = express(); +app.use(cors()); const pool = new Pool({ 'host': 'csce-315-db.engr.tamu.edu', diff --git a/backend/server_functions.js b/backend/server_functions.js index 676e905..421a973 100644 --- a/backend/server_functions.js +++ b/backend/server_functions.js @@ -23,12 +23,17 @@ function GetInventoryList(start, end){ const [inventoryItems, setInventoryItems] = useState([]); useEffect(() => { - async function fetchInventoryItems() { - const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + + async function fetchInventoryItems() { + // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const response = await fetch(`http://localhost:3001/queryInventory/0/0`); + const data = await response.json(); setInventoryItems(data); - } + console.log("queried") + } + console.log("useEffect") fetchInventoryItems(); }, [start, end]); @@ -53,111 +58,111 @@ function GetInventoryList(start, end){ // } //Fetch ingredient list to be display in table -function GetIngredients(start, end) { - const [ingredientArr, setIngredientArr] = useState([]); +// function GetIngredients(start, end) { +// const [ingredientArr, setIngredientArr] = useState([]); - useEffect(() => { - async function fetchIngredients() { - const response = await fetch(`http://localhost:3001/getInventoryItemsForMenu/${start}/${end}`); - const data = await response.json(); - //data.sort((a, b) => a.menu_id - b.menu_id); - setIngredientArr(data); - } +// useEffect(() => { +// async function fetchIngredients() { +// const response = await fetch(`http://localhost:3001/getInventoryItemsForMenu/${start}/${end}`); +// const data = await response.json(); +// //data.sort((a, b) => a.menu_id - b.menu_id); +// setIngredientArr(data); +// } - fetchIngredients(); - }, [start, end]); +// fetchIngredients(); +// }, [start, end]); - return ingredientArr; -} +// return ingredientArr; +// } -let addToCartPromise = Promise.resolve(); //synchronization thing -function AddToCart(type, name, quantity, price) { - const myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); - //console.log("Adding " +quantity + " units of "+ type + ": " + name+ " to cart for user " + myID + " with price " + price); - const item = { type, name, quantity, price }; - - addToCartPromise = addToCartPromise.then(async () => { - const response = await fetch(`http://localhost:3001/addToCart/${myID}`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(item) - }); - const data = await response.json(); - console.log(data.message); - }); -} +// let addToCartPromise = Promise.resolve(); //synchronization thing +// function AddToCart(type, name, quantity, price) { +// const myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); +// //console.log("Adding " +quantity + " units of "+ type + ": " + name+ " to cart for user " + myID + " with price " + price); +// const item = { type, name, quantity, price }; + +// addToCartPromise = addToCartPromise.then(async () => { +// const response = await fetch(`http://localhost:3001/addToCart/${myID}`, { +// method: 'POST', +// headers: { +// 'Content-Type': 'application/json' +// }, +// body: JSON.stringify(item) +// }); +// const data = await response.json(); +// console.log(data.message); +// }); +// } -function GetCartItems(){ - const [myCart, setCart] = useState([]); - var myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); - //console.log("getting cart"); +// function GetCartItems(){ +// const [myCart, setCart] = useState([]); +// var myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); +// //console.log("getting cart"); - useEffect(() => { - async function fetchCart() { - const response = await fetch(`http://localhost:3001/getCart/${myID}`); - const data = await response.json(); - setCart(data.rows[0].orderlist); - //console.log("cart in func: " + data.rows[0].orderlist); - } - fetchCart(); - }, [myID]); - - //console.log("cart: " + myCart); // should log an array of cart items - const items = []; - const modlist = []; - var j = 1; - - if(myCart !== null) { - for (let i = 0; i < myCart.length; i++) { - const element = JSON.parse(myCart[i]); - if(element.type === "item") { - const item = { id: j, name: element.name, price: element.price, qty: 1, mods: [...modlist]} - items.push(item); - modlist.length = 0; - j++; - } else { - if(element.name === "Beef Patty") { - if(element.quantity === -1) - modlist.push("SUB Black Bean Patty"); - } - else if(element.name === "Vanilla Ice Cream") { - if(element.quantity === -1) - modlist.push("CHOCOLATE"); - else if(element.quantity === 0) - modlist.push("VANILLA"); - else if(element.quantity === 1) - modlist.push("COFFEE"); - else - modlist.push("STRAWBERRY"); - } - else if(element.name === "x") { - if(element.quantity === -1) - modlist.push("BUFFALO"); - else if(element.quantity === 0) - modlist.push("BBQ"); - else if(element.quantity === 1) - modlist.push("HONEY MUSTARD"); - else if(element.quantity === 2) - modlist.push("RANCH"); - else if(element.quantity === 3) - modlist.push("SPICY RANCH"); - else if(element.quantity === 4) - modlist.push("GIG EM"); - } - else { - if(element.quantity === -1) - modlist.push("NO " + element.name); - else - modlist.push("EXTRA " + element.name); - } - } - }; - } - return items; -} +// useEffect(() => { +// async function fetchCart() { +// const response = await fetch(`http://localhost:3001/getCart/${myID}`); +// const data = await response.json(); +// setCart(data.rows[0].orderlist); +// //console.log("cart in func: " + data.rows[0].orderlist); +// } +// fetchCart(); +// }, [myID]); + +// //console.log("cart: " + myCart); // should log an array of cart items +// const items = []; +// const modlist = []; +// var j = 1; + +// if(myCart !== null) { +// for (let i = 0; i < myCart.length; i++) { +// const element = JSON.parse(myCart[i]); +// if(element.type === "item") { +// const item = { id: j, name: element.name, price: element.price, qty: 1, mods: [...modlist]} +// items.push(item); +// modlist.length = 0; +// j++; +// } else { +// if(element.name === "Beef Patty") { +// if(element.quantity === -1) +// modlist.push("SUB Black Bean Patty"); +// } +// else if(element.name === "Vanilla Ice Cream") { +// if(element.quantity === -1) +// modlist.push("CHOCOLATE"); +// else if(element.quantity === 0) +// modlist.push("VANILLA"); +// else if(element.quantity === 1) +// modlist.push("COFFEE"); +// else +// modlist.push("STRAWBERRY"); +// } +// else if(element.name === "x") { +// if(element.quantity === -1) +// modlist.push("BUFFALO"); +// else if(element.quantity === 0) +// modlist.push("BBQ"); +// else if(element.quantity === 1) +// modlist.push("HONEY MUSTARD"); +// else if(element.quantity === 2) +// modlist.push("RANCH"); +// else if(element.quantity === 3) +// modlist.push("SPICY RANCH"); +// else if(element.quantity === 4) +// modlist.push("GIG EM"); +// } +// else { +// if(element.quantity === -1) +// modlist.push("NO " + element.name); +// else +// modlist.push("EXTRA " + element.name); +// } +// } +// }; +// } +// return items; +// } -export {GetMenuList, GetIngredients, AddToCart, GetCartItems, GetInventoryList}; +export {GetInventoryList}; From e87b543701cb89ede43c7a433e81ecf508a9aebf Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:56:55 -0500 Subject: [PATCH 11/17] Add files via upload --- pages/Manager.js | 77 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/pages/Manager.js b/pages/Manager.js index 47965a8..56b016d 100644 --- a/pages/Manager.js +++ b/pages/Manager.js @@ -1,15 +1,73 @@ import React, { useState } from 'react'; import styled from 'styled-components'; +import {GetInventoryList} from '../backend/server_functions'; const Manager = () => { const [activeTab, setActiveTab] = useState(0); // Define the active tab state + const inventoryData = GetInventoryList(0,0); - const tabs = [ - { id: 0, name: 'Inventory', tableData: [ // Define the tabs and their table data - { id: 1, name: 'John', age: 28, number: "346-530-4989"}, - { id: 2, name: 'Jane', age: 32, number: "346-530-4989" }, - { id: 3, name: 'Joe', age: 21, number: "346-530-4989" }, + const title = [ + { id: 0, name: 'Inventory', tableData: [] + }, + { id: 1, name: 'Transactions', tableData: [ + { id: 1, name: 'Bob', age: 45 }, + { id: 2, name: 'Alice', age: 36 }, + { id: 3, name: 'Mark', age: 29 }, + ] }, + { id: 2, name: 'Products', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, ] }, + { id: 3, name: 'Customizations', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 4, name: 'Sales', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 5, name: 'Orders', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 6, name: 'Employees', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 7, name: 'Customers', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 8, name: 'Recipes', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 9, name: 'Sizes', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + { id: 10, name: 'Reports', tableData: [ + { id: 1, name: 'Sam', age: 52 }, + { id: 2, name: 'Sara', age: 31 }, + { id: 3, name: 'Tom', age: 24 }, + ] }, + ]; + const tabs = [ + { id: 0, name: 'Inventory', tableData: inventoryData + // [ // Define the tabs and their table data + // { id: 1, name: 'John', age: 28, number: "346-530-4989"}, + // { id: 2, name: 'Jane', age: 32, number: "346-530-4989" }, + // { id: 3, name: 'Joe', age: 21, number: "346-530-4989" }, + // ] + }, { id: 1, name: 'Transactions', tableData: [ { id: 1, name: 'Bob', age: 45 }, { id: 2, name: 'Alice', age: 36 }, @@ -114,13 +172,20 @@ const Manager = () => { - {tab.tableData.map((data) => ( + {/* {tab.tableData.map((data) => ( {data.id} {data.name} {data.age} {data.number} + ))} */} + {tab.tableData.map((data) => ( + + {Object.keys(data).map((key) => ( + {data[key]} + ))} + ))} From 66d5c4e21da84e5453ed9e38014ae2f4321c890a Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Sat, 29 Apr 2023 01:47:52 -0500 Subject: [PATCH 12/17] Created outline for edit functions --- backend/server.js | 216 +++++++++++++++++++++++++- backend/server_functions.js | 297 +++++++++++++++++++++--------------- 2 files changed, 384 insertions(+), 129 deletions(-) diff --git a/backend/server.js b/backend/server.js index 98a5bc7..225e644 100644 --- a/backend/server.js +++ b/backend/server.js @@ -29,7 +29,7 @@ app.get('/queryInventory/:start/:end', async (req, res) => { const end = parseInt(req.params.end); var queryToUse; if((start === 0) && (end === 0)){ - queryToUse = 'SELECT * FROM inventory ORDER BY id'; + queryToUse = 'SELECT * FROM inventory ORDER BY id limit 10'; } else{ queryToUse = 'SELECT * FROM inventory WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; @@ -43,9 +43,219 @@ app.get('/queryInventory/:start/:end', async (req, res) => { console.error("Read query in inventory failed " +err); res.status(500).json({ error: 'Internal server error' }); } - }); +}); +app.get('/queryProducts/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM products ORDER BY id limit 10'; + } + else{ + queryToUse = 'SELECT * FROM products WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } +}); +app.get('/queryCustomizations/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM customizations ORDER BY id limit 10'; + } + else{ + queryToUse = 'SELECT * FROM customizations WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } +}); + +app.get('/querySales/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM sales ORDER BY id limit 10'; + } + else{ + queryToUse = 'SELECT * FROM sales WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } +}); + +app.get('/queryOrders/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM orders ORDER BY sale_id limit 10'; + } + else{ + queryToUse = 'SELECT * FROM orders WHERE id >= ' + start + ' AND sale_id <= ' + end + ' ORDER BY sale_id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } +}); + +app.get('/queryEmployees/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM employees ORDER BY id limit 10'; + } + else{ + queryToUse = 'SELECT * FROM employees WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } +}); + +app.get('/queryCustomers/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM customers ORDER BY id limit 10'; + } + else{ + queryToUse = 'SELECT * FROM customers WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } +}); + +app.get('/queryRecipes/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM recipes ORDER BY product_id limit 10'; + } + else{ + queryToUse = 'SELECT * FROM recipes WHERE product_id >= ' + start + ' AND product_id <= ' + end + ' ORDER BY product_id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } +}); + +app.get('/querySizes/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM sizes ORDER BY id limit 10'; + } + else{ + queryToUse = 'SELECT * FROM sizes WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } +}); -// console.log("cunt") +app.get('/queryReports/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM reports ORDER BY id limit 10'; + } + else{ + queryToUse = 'SELECT * FROM reports WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } +}); +//not done yet +app.post('/add-item', async (req, res) => { + try { + const newItem = req.body; // extract item data from request body + + // Use SQL to insert the new item into the database + const query = 'INSERT INTO items (name, description, price) VALUES ($1, $2, $3)'; + const values = [newItem.name, newItem.description, newItem.price]; + await pool.query(query, values); + + res.status(200).json({ message: 'Item added successfully' }); + } catch (err) { + console.error('Error adding item to database:', err); + res.status(500).json({ message: 'Internal server error' }); + } +}); app.listen(3001, () => { console.log('Server listening on port 5000'); }); \ No newline at end of file diff --git a/backend/server_functions.js b/backend/server_functions.js index 421a973..f21b36d 100644 --- a/backend/server_functions.js +++ b/backend/server_functions.js @@ -1,32 +1,36 @@ import { useState, useEffect } from 'react'; + /* Fetch menu items from list to display in table */ -// function GetMenuList(start, end){ -// const [menuItems, setMenuItems] = useState([]); +function GetInventoryList(start, end){ + const [inventoryItems, setInventoryItems] = useState([]); -// useEffect(() => { -// async function fetchMenuItems() { -// const response = await fetch(`http://localhost:3001/menuRequest/${start}/${end}`); -// const data = await response.json(); -// setMenuItems(data); -// } + useEffect(() => { -// fetchMenuItems(); -// }, [start, end]); + async function fetchInventoryItems() { + // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const response = await fetch(`http://localhost:3001/queryInventory/0/0`); -// console.log(menuItems); -// return menuItems; -// } + const data = await response.json(); + setInventoryItems(data); + console.log("queried") -/* Fetch menu items from list to display in table */ -function GetInventoryList(start, end){ + } + console.log("useEffect") + fetchInventoryItems(); + }, [start, end]); + + return inventoryItems; +} + +function GetProductsList(start, end){ const [inventoryItems, setInventoryItems] = useState([]); useEffect(() => { async function fetchInventoryItems() { // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); - const response = await fetch(`http://localhost:3001/queryInventory/0/0`); + const response = await fetch(`http://localhost:3001/queryProducts/0/0`); const data = await response.json(); setInventoryItems(data); @@ -40,129 +44,170 @@ function GetInventoryList(start, end){ return inventoryItems; } -//fetch all menu items from database table -// function GetAllMenuList(){ -// const [menuItems, setMenuItems] = useState([]); +function GetCustomizationsList(start, end){ + const [inventoryItems, setInventoryItems] = useState([]); -// useEffect(() => { -// async function fetchMenuItems() { -// const response = await fetch(`http://localhost:3001/menuRequestAll/`); -// const data = await response.json(); -// setMenuItems(data); -// } + useEffect(() => { -// fetchMenuItems(); -// }, []); + async function fetchInventoryItems() { + // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const response = await fetch(`http://localhost:3001/queryCustomizations/0/0`); -// return menuItems; -// } + const data = await response.json(); + setInventoryItems(data); + console.log("queried") -//Fetch ingredient list to be display in table -// function GetIngredients(start, end) { -// const [ingredientArr, setIngredientArr] = useState([]); + } + console.log("useEffect") + fetchInventoryItems(); + }, [start, end]); -// useEffect(() => { -// async function fetchIngredients() { -// const response = await fetch(`http://localhost:3001/getInventoryItemsForMenu/${start}/${end}`); -// const data = await response.json(); -// //data.sort((a, b) => a.menu_id - b.menu_id); -// setIngredientArr(data); -// } + return inventoryItems; +} -// fetchIngredients(); -// }, [start, end]); +function GetSalesList(start, end){ + const [inventoryItems, setInventoryItems] = useState([]); -// return ingredientArr; -// } + useEffect(() => { -// let addToCartPromise = Promise.resolve(); //synchronization thing -// function AddToCart(type, name, quantity, price) { -// const myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); -// //console.log("Adding " +quantity + " units of "+ type + ": " + name+ " to cart for user " + myID + " with price " + price); -// const item = { type, name, quantity, price }; - -// addToCartPromise = addToCartPromise.then(async () => { -// const response = await fetch(`http://localhost:3001/addToCart/${myID}`, { -// method: 'POST', -// headers: { -// 'Content-Type': 'application/json' -// }, -// body: JSON.stringify(item) -// }); -// const data = await response.json(); -// console.log(data.message); -// }); -// } + async function fetchInventoryItems() { + // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const response = await fetch(`http://localhost:3001/querySales/0/0`); + + const data = await response.json(); + setInventoryItems(data); + console.log("queried") + + } + console.log("useEffect") + fetchInventoryItems(); + }, [start, end]); + + return inventoryItems; +} +function GetOrdersList(start, end){ + const [inventoryItems, setInventoryItems] = useState([]); + + useEffect(() => { + + async function fetchInventoryItems() { + // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const response = await fetch(`http://localhost:3001/queryOrders/0/0`); + + const data = await response.json(); + setInventoryItems(data); + console.log("queried") + + } + console.log("useEffect") + fetchInventoryItems(); + }, [start, end]); + + return inventoryItems; +} +function GetEmployeesList(start, end){ + const [inventoryItems, setInventoryItems] = useState([]); + + useEffect(() => { + + async function fetchInventoryItems() { + // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const response = await fetch(`http://localhost:3001/queryEmployees/0/0`); + + const data = await response.json(); + setInventoryItems(data); + console.log("queried") + + } + console.log("useEffect") + fetchInventoryItems(); + }, [start, end]); + + return inventoryItems; +} +function GetCustomersList(start, end){ + const [inventoryItems, setInventoryItems] = useState([]); + + useEffect(() => { + + async function fetchInventoryItems() { + // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const response = await fetch(`http://localhost:3001/queryCustomers/0/0`); + + const data = await response.json(); + setInventoryItems(data); + console.log("queried") -// function GetCartItems(){ -// const [myCart, setCart] = useState([]); -// var myID = document.cookie.replace(/(?:(?:^|.*;\s*)sessionId\s*=\s*([^;]*).*$)|^.*$/, "$1"); -// //console.log("getting cart"); + } + console.log("useEffect") + fetchInventoryItems(); + }, [start, end]); + + return inventoryItems; +} +function GetRecipesList(start, end){ + const [inventoryItems, setInventoryItems] = useState([]); + + useEffect(() => { + + async function fetchInventoryItems() { + // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const response = await fetch(`http://localhost:3001/queryRecipes/0/0`); + + const data = await response.json(); + setInventoryItems(data); + console.log("queried") + + } + console.log("useEffect") + fetchInventoryItems(); + }, [start, end]); + + return inventoryItems; +} +function GetSizesList(start, end){ + const [inventoryItems, setInventoryItems] = useState([]); + + useEffect(() => { + + async function fetchInventoryItems() { + // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const response = await fetch(`http://localhost:3001/querySizes/0/0`); + + const data = await response.json(); + setInventoryItems(data); + console.log("queried") + + } + console.log("useEffect") + fetchInventoryItems(); + }, [start, end]); + + return inventoryItems; +} + +// function AddtoInventory(info) { +// const [inventoryItems, setInventoryItems] = useState([]); // useEffect(() => { -// async function fetchCart() { -// const response = await fetch(`http://localhost:3001/getCart/${myID}`); + +// async function fetchInventoryItems() { +// // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); +// const response = await fetch(`http://localhost:3001/querySizes/0/0`); + // const data = await response.json(); -// setCart(data.rows[0].orderlist); -// //console.log("cart in func: " + data.rows[0].orderlist); +// setInventoryItems(data); +// console.log("queried") + // } -// fetchCart(); -// }, [myID]); - -// //console.log("cart: " + myCart); // should log an array of cart items -// const items = []; -// const modlist = []; -// var j = 1; - -// if(myCart !== null) { -// for (let i = 0; i < myCart.length; i++) { -// const element = JSON.parse(myCart[i]); -// if(element.type === "item") { -// const item = { id: j, name: element.name, price: element.price, qty: 1, mods: [...modlist]} -// items.push(item); -// modlist.length = 0; -// j++; -// } else { -// if(element.name === "Beef Patty") { -// if(element.quantity === -1) -// modlist.push("SUB Black Bean Patty"); -// } -// else if(element.name === "Vanilla Ice Cream") { -// if(element.quantity === -1) -// modlist.push("CHOCOLATE"); -// else if(element.quantity === 0) -// modlist.push("VANILLA"); -// else if(element.quantity === 1) -// modlist.push("COFFEE"); -// else -// modlist.push("STRAWBERRY"); -// } -// else if(element.name === "x") { -// if(element.quantity === -1) -// modlist.push("BUFFALO"); -// else if(element.quantity === 0) -// modlist.push("BBQ"); -// else if(element.quantity === 1) -// modlist.push("HONEY MUSTARD"); -// else if(element.quantity === 2) -// modlist.push("RANCH"); -// else if(element.quantity === 3) -// modlist.push("SPICY RANCH"); -// else if(element.quantity === 4) -// modlist.push("GIG EM"); -// } -// else { -// if(element.quantity === -1) -// modlist.push("NO " + element.name); -// else -// modlist.push("EXTRA " + element.name); -// } -// } -// }; -// } -// return items; -// } +// console.log("useEffect") +// fetchInventoryItems(); +// }, [info]); +// return inventoryItems; +// } -export {GetInventoryList}; +export {GetInventoryList, GetProductsList, GetCustomizationsList, GetSalesList, GetOrdersList, GetEmployeesList + , GetCustomersList, GetRecipesList, GetSizesList +}; From c47ab2bd077c489e197f361c4b2e57ac8301dbfd Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Sat, 29 Apr 2023 01:49:36 -0500 Subject: [PATCH 13/17] Created changes to the tables that shows a button The button does not yet work. I only managed to make the button display in the way I wanted and I also made the outline for function calls, which means that the actual SQL statements for querying and inserting into the database are not done yet. --- pages/Manager.js | 222 +++++++++++++++++++++-------------------------- 1 file changed, 101 insertions(+), 121 deletions(-) diff --git a/pages/Manager.js b/pages/Manager.js index 56b016d..9af89fd 100644 --- a/pages/Manager.js +++ b/pages/Manager.js @@ -1,118 +1,51 @@ import React, { useState } from 'react'; import styled from 'styled-components'; -import {GetInventoryList} from '../backend/server_functions'; +import {GetInventoryList, GetProductsList, GetCustomizationsList, GetSalesList, GetOrdersList, GetEmployeesList + , GetCustomersList, GetRecipesList, GetSizesList, AddItemButton} from '../backend/server_functions'; const Manager = () => { const [activeTab, setActiveTab] = useState(0); // Define the active tab state + const [showForm, setShowForm] = useState(false); + + const inventoryData = GetInventoryList(0,0); + const productData = GetProductsList(0,0); + const customizationsData = GetCustomizationsList(0,0); + const salesData = GetSalesList(0,0); + const ordersData = GetOrdersList(0,0); + const employeeData = GetEmployeesList(0,0); + const customerData = GetCustomersList(0,0); + const recipeData = GetRecipesList(0,0); + const sizeData = GetSizesList(0,0); + //fill in data for everything except transactions + // edit function for inventory, products, employees, customers, recipes + // x y z tables for the report const title = [ { id: 0, name: 'Inventory', tableData: [] }, - { id: 1, name: 'Transactions', tableData: [ - { id: 1, name: 'Bob', age: 45 }, - { id: 2, name: 'Alice', age: 36 }, - { id: 3, name: 'Mark', age: 29 }, - ] }, - { id: 2, name: 'Products', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 3, name: 'Customizations', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 4, name: 'Sales', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 5, name: 'Orders', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 6, name: 'Employees', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 7, name: 'Customers', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 8, name: 'Recipes', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 9, name: 'Sizes', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 10, name: 'Reports', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, + { id: 1, name: 'Transactions', tableData: [] }, + { id: 2, name: 'Products', tableData: [] }, + { id: 3, name: 'Customizations', tableData: [] }, + { id: 4, name: 'Sales', tableData: [] }, + { id: 5, name: 'Orders', tableData: [] }, + { id: 6, name: 'Employees', tableData: [] }, + { id: 7, name: 'Customers', tableData: [] }, + { id: 8, name: 'Recipes', tableData: [] }, + { id: 9, name: 'Sizes', tableData: [] }, + { id: 10, name: 'Reports', tableData: [] }, ]; const tabs = [ - { id: 0, name: 'Inventory', tableData: inventoryData - // [ // Define the tabs and their table data - // { id: 1, name: 'John', age: 28, number: "346-530-4989"}, - // { id: 2, name: 'Jane', age: 32, number: "346-530-4989" }, - // { id: 3, name: 'Joe', age: 21, number: "346-530-4989" }, - // ] - }, - { id: 1, name: 'Transactions', tableData: [ - { id: 1, name: 'Bob', age: 45 }, - { id: 2, name: 'Alice', age: 36 }, - { id: 3, name: 'Mark', age: 29 }, - ] }, - { id: 2, name: 'Products', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 3, name: 'Customizations', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 4, name: 'Sales', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 5, name: 'Orders', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 6, name: 'Employees', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 7, name: 'Customers', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 8, name: 'Recipes', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, - { id: 9, name: 'Sizes', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, - ] }, + { id: 0, name: 'Inventory', tableData: inventoryData }, + { id: 1, name: 'Transactions', tableData: []}, + { id: 2, name: 'Products', tableData: productData }, + { id: 3, name: 'Customizations', tableData: customizationsData }, + { id: 4, name: 'Sales', tableData: salesData }, + { id: 5, name: 'Orders', tableData: ordersData }, + { id: 6, name: 'Employees', tableData: employeeData }, + { id: 7, name: 'Customers', tableData: customerData }, + { id: 8, name: 'Recipes', tableData: recipeData }, + { id: 9, name: 'Sizes', tableData: sizeData }, { id: 10, name: 'Reports', tableData: [ { id: 1, name: 'Sam', age: 52 }, { id: 2, name: 'Sara', age: 31 }, @@ -120,11 +53,25 @@ const Manager = () => { ] }, ]; + function handleSubmit(event) { + setShowForm(!showForm); + event.preventDefault(); + // Here, you can send the form data to your Postgres database + // using a fetch request or another method + console.log("handleSubmitCunt") + } + + const handleClick = () => { + console.log("formcunt") + setShowForm(!showForm); + } const handleTabClick = (tabIndex) => { setActiveTab(tabIndex); // Update the active tab state when a tab is clicked }; + return ( +
{ - {/* {tab.tableData.map((data) => ( - - {data.id} - {data.name} - {data.age} - {data.number} - - ))} */} {tab.tableData.map((data) => ( {Object.keys(data).map((key) => ( @@ -194,16 +133,57 @@ const Manager = () => {
- )} + // style={{ + // backgroundColor: '#1e3932', + // height: '100px', + // position: 'fixed', + // bottom: 0, + // left: 0, + // right: 0, + // }} + > + + +
+ {/* */} + {showForm ? ( +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ ) : ( +
+ +
+ )} +
+ + + ) + + } export default Manager; From fd288410054ec2ed5836cccdd1b8e4a210d67ffc Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Mon, 1 May 2023 22:48:46 -0500 Subject: [PATCH 14/17] Changes --- backend/server.js | 101 ++++++++++++-- backend/server_functions.js | 270 ++++++++++++++++++++++++------------ 2 files changed, 275 insertions(+), 96 deletions(-) diff --git a/backend/server.js b/backend/server.js index 225e644..323c515 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,9 +1,11 @@ const express = require('express'); const { Pool } = require('pg'); const cors = require('cors'); +const bodyParser = require('body-parser'); const app = express(); app.use(cors()); +app.use(bodyParser.json()); const pool = new Pool({ 'host': 'csce-315-db.engr.tamu.edu', @@ -231,6 +233,7 @@ app.get('/queryReports/:start/:end', async (req, res) => { queryToUse = 'SELECT * FROM reports WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; } console.log(queryToUse); + const { rows } = await pool.query(queryToUse); res.json(rows); //console.log(rows); @@ -240,22 +243,100 @@ app.get('/queryReports/:start/:end', async (req, res) => { res.status(500).json({ error: 'Internal server error' }); } }); -//not done yet -app.post('/add-item', async (req, res) => { - try { - const newItem = req.body; // extract item data from request body - // Use SQL to insert the new item into the database - const query = 'INSERT INTO items (name, description, price) VALUES ($1, $2, $3)'; - const values = [newItem.name, newItem.description, newItem.price]; - await pool.query(query, values); +app.post('/add-item', async (req, res) => { + try{ + const itemInfo = req.body; // assuming the JSON payload contains all necessary item info + const queryToUse = `INSERT INTO inventory (id, item_name, item_type, item_quantity, item_unit, item_price, date_of_last_update) + VALUES ('${itemInfo.id}', '${itemInfo.name}', '${itemInfo.type}', '${itemInfo.quantity}', '${itemInfo.unit}', '${itemInfo.price}', '${itemInfo.date}');`; + // console.log(queryToUse); + const result = await pool.query(queryToUse); + res.json({ message: 'Item added successfully' }); // send a response back to the client + } + catch(err){ + console.error('Error adding item to database:', err); + res.status(500).json({ message: 'Internal server error' }); + } +}); +app.post('/add-product', async (req, res) => { + try{ + const itemInfo = req.body; // assuming the JSON payload contains all necessary item info + const queryToUse = `INSERT INTO products (id, product_name, product_type, product_price, product_description, date_of_last_update) + VALUES ('${itemInfo.id}', '${itemInfo.name}', '${itemInfo.type}', '${itemInfo.price}', '${itemInfo.description}', '${itemInfo.date}');`; + console.log(queryToUse); + const result = await pool.query(queryToUse); + res.json({ message: 'Item added successfully' }); // send a response back to the client + } + catch(err){ + console.error('Error adding item to database:', err); + res.status(500).json({ message: 'Internal server error' }); + } +}); +app.post('/add-employees', async (req, res) => { + try{ + const itemInfo = req.body; // assuming the JSON payload contains all necessary item info + const queryToUse = `INSERT INTO employees (id, employee_name, employee_position, employee_phone, date_of_last_update) + VALUES ('${itemInfo.id}', '${itemInfo.name}', '${itemInfo.position}', '${itemInfo.phone}', '${itemInfo.date}');`; + console.log(queryToUse); + const result = await pool.query(queryToUse); + res.json({ message: 'Item added successfully' }); // send a response back to the client + } + catch(err){ + console.error('Error adding item to database:', err); + res.status(500).json({ message: 'Internal server error' }); + } +}); +app.post('/add-customers', async (req, res) => { + try{ + const itemInfo = req.body; // assuming the JSON payload contains all necessary item info + const queryToUse = `INSERT INTO customers (id, customer_name, customer_phone, date_of_last_update) + VALUES ('${itemInfo.id}', '${itemInfo.name}', '${itemInfo.phone}', '${itemInfo.date}');`; + console.log(queryToUse); + const result = await pool.query(queryToUse); + res.json({ message: 'Item added successfully' }); // send a response back to the client + } + catch(err){ + console.error('Error adding item to database:', err); + res.status(500).json({ message: 'Internal server error' }); + } +}); - res.status(200).json({ message: 'Item added successfully' }); - } catch (err) { +app.post('/add-recipes', async (req, res) => { + try{ + const itemInfo = req.body; // assuming the JSON payload contains all necessary item info + const queryToUse = `INSERT INTO recipes (product_id, inventory_id, inventory_item, quantity, unit, date_of_last_update) + VALUES ('${itemInfo.p_id}', '${itemInfo.i_id}', '${itemInfo.i_item}', '${itemInfo.quantity}', '${itemInfo.unit}', '${itemInfo.date}');`; + console.log(queryToUse); + const result = await pool.query(queryToUse); + res.json({ message: 'Item added successfully' }); // send a response back to the client + } + catch(err){ console.error('Error adding item to database:', err); res.status(500).json({ message: 'Internal server error' }); } }); +app.get('/salesReport/:start/:end', async (req, res) => { + try { + const start = parseInt(req.params.start); + const end = parseInt(req.params.end); + var queryToUse; + if((start === 0) && (end === 0)){ + queryToUse = 'SELECT * FROM inventory ORDER BY id limit 10'; + } + else{ + queryToUse = 'SELECT * FROM inventory WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; + } + console.log(queryToUse); + const { rows } = await pool.query(queryToUse); + res.json(rows); + //console.log(rows); + } catch (err) { + + console.error("Read query in inventory failed " +err); + res.status(500).json({ error: 'Internal server error' }); + } +}); + app.listen(3001, () => { console.log('Server listening on port 5000'); }); \ No newline at end of file diff --git a/backend/server_functions.js b/backend/server_functions.js index f21b36d..e012dba 100644 --- a/backend/server_functions.js +++ b/backend/server_functions.js @@ -2,212 +2,310 @@ import { useState, useEffect } from 'react'; /* Fetch menu items from list to display in table */ +function GetCurrentInventoryList(start, end){ + return new Promise((resolve, reject) => { + async function fetchInventoryItems() { + const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); + const data = await response.json(); + resolve(data); + } + fetchInventoryItems().catch(reject); + }); +} function GetInventoryList(start, end){ const [inventoryItems, setInventoryItems] = useState([]); - useEffect(() => { - async function fetchInventoryItems() { // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); - const response = await fetch(`http://localhost:3001/queryInventory/0/0`); + const response = await fetch(`http://localhost:3001/queryInventory/0/0`); const data = await response.json(); setInventoryItems(data); - console.log("queried") - } - console.log("useEffect") fetchInventoryItems(); }, [start, end]); - return inventoryItems; } - function GetProductsList(start, end){ - const [inventoryItems, setInventoryItems] = useState([]); + const [productsItems, setproducstItems] = useState([]); useEffect(() => { - async function fetchInventoryItems() { + async function fetchproductsItems() { // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); const response = await fetch(`http://localhost:3001/queryProducts/0/0`); const data = await response.json(); - setInventoryItems(data); - console.log("queried") + setproducstItems(data); + // console.log("queried") } - console.log("useEffect") - fetchInventoryItems(); + // console.log("useEffect") + fetchproductsItems(); }, [start, end]); - return inventoryItems; + return productsItems; } function GetCustomizationsList(start, end){ - const [inventoryItems, setInventoryItems] = useState([]); + const [customizationsItems, setcustomizationsItems] = useState([]); useEffect(() => { - async function fetchInventoryItems() { + async function fetchcustomizationsItems() { // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); const response = await fetch(`http://localhost:3001/queryCustomizations/0/0`); const data = await response.json(); - setInventoryItems(data); - console.log("queried") + setcustomizationsItems(data); + // console.log("queried") } - console.log("useEffect") - fetchInventoryItems(); + // console.log("useEffect") + fetchcustomizationsItems(); }, [start, end]); - return inventoryItems; + return customizationsItems; } function GetSalesList(start, end){ - const [inventoryItems, setInventoryItems] = useState([]); + const [salesItems, setsalesItems] = useState([]); useEffect(() => { - async function fetchInventoryItems() { + async function fetchsalesItems() { // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); const response = await fetch(`http://localhost:3001/querySales/0/0`); const data = await response.json(); - setInventoryItems(data); - console.log("queried") + setsalesItems(data); + // console.log("queried") } - console.log("useEffect") - fetchInventoryItems(); + // console.log("useEffect") + fetchsalesItems(); }, [start, end]); - return inventoryItems; + return salesItems; } function GetOrdersList(start, end){ - const [inventoryItems, setInventoryItems] = useState([]); + const [ordersItems, setordersItems] = useState([]); useEffect(() => { - async function fetchInventoryItems() { + async function fetchordersItems() { // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); const response = await fetch(`http://localhost:3001/queryOrders/0/0`); const data = await response.json(); - setInventoryItems(data); - console.log("queried") + setordersItems(data); + // console.log("queried") } - console.log("useEffect") - fetchInventoryItems(); + // console.log("useEffect") + fetchordersItems(); }, [start, end]); - return inventoryItems; + return ordersItems; } function GetEmployeesList(start, end){ - const [inventoryItems, setInventoryItems] = useState([]); + const [employeesItems, setemployeesItems] = useState([]); useEffect(() => { - async function fetchInventoryItems() { + async function fetchemployeesItems() { // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); const response = await fetch(`http://localhost:3001/queryEmployees/0/0`); const data = await response.json(); - setInventoryItems(data); - console.log("queried") + setemployeesItems(data); + // console.log("queried") } - console.log("useEffect") - fetchInventoryItems(); + // console.log("useEffect") + fetchemployeesItems(); }, [start, end]); - return inventoryItems; + return employeesItems; } function GetCustomersList(start, end){ - const [inventoryItems, setInventoryItems] = useState([]); + const [customersItems, setcustomersItems] = useState([]); useEffect(() => { - async function fetchInventoryItems() { + async function fetchcustomersItems() { // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); const response = await fetch(`http://localhost:3001/queryCustomers/0/0`); const data = await response.json(); - setInventoryItems(data); - console.log("queried") + setcustomersItems(data); + // console.log("queried") } - console.log("useEffect") - fetchInventoryItems(); + // console.log("useEffect") + fetchcustomersItems(); }, [start, end]); - return inventoryItems; + return customersItems; } function GetRecipesList(start, end){ - const [inventoryItems, setInventoryItems] = useState([]); + const [recipeItems, setrecipeItems] = useState([]); useEffect(() => { - async function fetchInventoryItems() { + async function fetchrecipeItems() { // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); const response = await fetch(`http://localhost:3001/queryRecipes/0/0`); const data = await response.json(); - setInventoryItems(data); - console.log("queried") + setrecipeItems(data); + // console.log("queried") } - console.log("useEffect") - fetchInventoryItems(); + // console.log("useEffect") + fetchrecipeItems(); }, [start, end]); - return inventoryItems; + return recipeItems; } function GetSizesList(start, end){ - const [inventoryItems, setInventoryItems] = useState([]); + const [SizeItems, setSizeItems] = useState([]); useEffect(() => { - async function fetchInventoryItems() { + async function fetchSizeItems() { // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); const response = await fetch(`http://localhost:3001/querySizes/0/0`); const data = await response.json(); - setInventoryItems(data); - console.log("queried") + setSizeItems(data); + // console.log("queried") } - console.log("useEffect") - fetchInventoryItems(); + // console.log("useEffect") + fetchSizeItems(); }, [start, end]); - return inventoryItems; + return SizeItems; +} +function AddtoInventory(info) { + // const [message, setMessage] = useState(""); + + async function handleSubmit() { + console.log(info[0]) + const response = await fetch(`http://localhost:3001/add-item`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + id : info[0], + name: info[1], + type: info[2], + quantity: info[3], + unit: info[4], + price: info[5], + date: info[6] + }) + }); + const data = await response.json(); + console.log(data.message); + } + handleSubmit() +} +function AddtoProducts(info) { + async function handleSubmit() { + // console.log(info[0]) + const response = await fetch(`http://localhost:3001/add-product`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + id : info[0], + name: info[1], + type: info[2], + price: info[3], + description: info[4], + date: info[5] + }) + }); + const data = await response.json(); + console.log(data.message); + } + handleSubmit() +} +function AddtoEmployees(info) { + + async function handleSubmit() { + // console.log(info[0]) + const response = await fetch(`http://localhost:3001/add-employees`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + id : info[0], + name: info[1], + position: info[2], + phone: info[3], + date: info[4] + }) + }); + const data = await response.json(); + console.log(data.message); + } + handleSubmit() +} +function AddtoCustomers(info) { + // const [message, setMessage] = useState(""); + + async function handleSubmit() { + console.log(info[0]) + const response = await fetch(`http://localhost:3001/add-customers`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + id : info[0], + name: info[1], + phone : info[2], + date: info[3] + }) + }); + const data = await response.json(); + console.log(data.message); + } + handleSubmit() +} +function AddtoRecipes(info) { + async function handleSubmit() { + // console.log(info[0]) + const response = await fetch(`http://localhost:3001/add-recipes`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + p_id : info[0], + i_id: info[1], + i_item: info[2], + quantity: info[3], + unit: info[4], + date: info[5] + }) + }); + const data = await response.json(); + console.log(data.message); + } + handleSubmit() } -// function AddtoInventory(info) { -// const [inventoryItems, setInventoryItems] = useState([]); - -// useEffect(() => { - -// async function fetchInventoryItems() { -// // const response = await fetch(`http://localhost:3001/queryInventory/${start}/${end}`); -// const response = await fetch(`http://localhost:3001/querySizes/0/0`); - -// const data = await response.json(); -// setInventoryItems(data); -// console.log("queried") - -// } -// console.log("useEffect") -// fetchInventoryItems(); -// }, [info]); - -// return inventoryItems; -// } +function SalesReport(start, end){ + return new Promise((resolve, reject) => { + async function fetchInventoryItems() { + const response = await fetch(`http://localhost:3001/salesReport/${start}/${end}`); + const data = await response.json(); + resolve(data); + } + fetchInventoryItems().catch(reject); + }); +} -export {GetInventoryList, GetProductsList, GetCustomizationsList, GetSalesList, GetOrdersList, GetEmployeesList - , GetCustomersList, GetRecipesList, GetSizesList +export {GetInventoryList, GetCurrentInventoryList, GetProductsList, GetCustomizationsList, GetSalesList, GetOrdersList, GetEmployeesList + , GetCustomersList, GetRecipesList, GetSizesList, AddtoInventory, AddtoCustomers, AddtoEmployees, AddtoProducts, + AddtoRecipes, SalesReport }; + From 9e8e6c4105e5aa29026d55d2d37d4105fd7879f5 Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Mon, 1 May 2023 22:49:16 -0500 Subject: [PATCH 15/17] Changes --- pages/Manager.js | 315 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 275 insertions(+), 40 deletions(-) diff --git a/pages/Manager.js b/pages/Manager.js index 9af89fd..92248a4 100644 --- a/pages/Manager.js +++ b/pages/Manager.js @@ -1,14 +1,20 @@ -import React, { useState } from 'react'; +import React, { useState , useEffect} from 'react'; import styled from 'styled-components'; -import {GetInventoryList, GetProductsList, GetCustomizationsList, GetSalesList, GetOrdersList, GetEmployeesList - , GetCustomersList, GetRecipesList, GetSizesList, AddItemButton} from '../backend/server_functions'; +import {GetInventoryList, GetCurrentInventoryList, GetProductsList, GetCustomizationsList, GetSalesList, GetOrdersList, GetEmployeesList + , GetCustomersList, GetRecipesList, GetSizesList, AddtoInventory, AddtoCustomers, AddtoEmployees, AddtoProducts, + AddtoRecipes, SalesReport} from '../backend/server_functions'; const Manager = () => { const [activeTab, setActiveTab] = useState(0); // Define the active tab state - const [showForm, setShowForm] = useState(false); + const [showInventoryForm, setShowInventoryForm] = useState(false); + const [showProductsForm, setShowProductsForm] = useState(false); + const [showEmployeesForm, setShowEmployeesForm] = useState(false); + const [showCustomersForm, setShowCustomersForm] = useState(false); + const [showRecipesForm, setShowRecipesForm] = useState(false); + const [showReportForm, setShowReportForm] = useState(false); - const inventoryData = GetInventoryList(0,0); + const starting_inventory = GetInventoryList(0, 0) const productData = GetProductsList(0,0); const customizationsData = GetCustomizationsList(0,0); const salesData = GetSalesList(0,0); @@ -18,6 +24,7 @@ const Manager = () => { const recipeData = GetRecipesList(0,0); const sizeData = GetSizesList(0,0); + const [updatedInventory, setUpdatedInventory] = useState([]) //fill in data for everything except transactions // edit function for inventory, products, employees, customers, recipes // x y z tables for the report @@ -35,8 +42,19 @@ const Manager = () => { { id: 9, name: 'Sizes', tableData: [] }, { id: 10, name: 'Reports', tableData: [] }, ]; - const tabs = [ - { id: 0, name: 'Inventory', tableData: inventoryData }, + + // useEffect(() => { + // GetCurrentInventoryList(0, 0) + // .then(data => { + // setUpdatedInventory(data); + // }) + // .catch(error => { + // console.error(error); + // }); + // }, []); + + let tabs = [ + { id: 0, name: 'Inventory', tableData: starting_inventory}, { id: 1, name: 'Transactions', tableData: []}, { id: 2, name: 'Products', tableData: productData }, { id: 3, name: 'Customizations', tableData: customizationsData }, @@ -47,29 +65,126 @@ const Manager = () => { { id: 8, name: 'Recipes', tableData: recipeData }, { id: 9, name: 'Sizes', tableData: sizeData }, { id: 10, name: 'Reports', tableData: [ - { id: 1, name: 'Sam', age: 52 }, - { id: 2, name: 'Sara', age: 31 }, - { id: 3, name: 'Tom', age: 24 }, + {id: 0, name: 'Sales Report', reportData: []}, + {id: 1, name: 'X Report', reportData: []}, + {id: 2, name: 'Z Report', reportData: []}, + {id: 3, name: 'Excess Report', reportData: []}, + {id: 4, name: 'Restock Report', reportData: []}, + {id: 5, name: 'What Sells Together', reportData: []}, ] }, ]; - function handleSubmit(event) { - setShowForm(!showForm); + function handleInventorySubmit(event) { + event.preventDefault(); + if(showInventoryForm){ + const itemID= event.target.elements.id.value; + const itemName = event.target.elements.itemName.value; + const itemType = event.target.elements.itemType.value; + const itemQuantity = event.target.elements.itemQuantity.value; + const itemUnit = event.target.elements.itemUnit.value; + const itemPrice= event.target.elements.itemPrice.value; + const DateOfLastUpdate= event.target.elements.DateOfLastUpdate.value; + const info = [itemID, itemName, itemType, itemQuantity, itemUnit, itemPrice, DateOfLastUpdate] + console.log("inventory") + console.log(info) + AddtoInventory(info) + GetCurrentInventoryList(0, 0) + .then(data => { + tabs[0].tableData = data; + + }) + .catch(error => { + console.error(error); + }); + } + setShowInventoryForm(!showInventoryForm); + } + function handleProductSubmit(event) { + event.preventDefault(); + if(showProductsForm){ + const productID = event.target.elements.id.value; + const productName = event.target.elements.productName.value; + const productType = event.target.elements.productType.value; + const productPrice= event.target.elements.productPrice.value; + const productDescription = event.target.elements.productDescription.value; + const DateOfLastUpdate= event.target.elements.DateOfLastUpdate.value; + const info = [productID, productName,productType, productPrice, productDescription, DateOfLastUpdate] + console.log("product") + + // console.log(info) + AddtoProducts(info) + } + setShowProductsForm(!showProductsForm); + } + function handleEmployeeSubmit(event) { + event.preventDefault(); + if(showEmployeesForm){ + const employeeID = event.target.elements.id.value; + const employeeName = event.target.elements.employeeName.value; + const employeePosition = event.target.elements.employeePosition.value; + const employeePhone = event.target.elements.employeePhone.value; + const DateOfLastUpdate = event.target.elements.DateOfLastUpdate.value; + const info = [employeeID, employeeName, employeePosition, employeePhone, DateOfLastUpdate] + // console.log("employees") + // console.log(info) + AddtoEmployees(info); + } + setShowEmployeesForm(!showEmployeesForm); + } + function handleCustomerSubmit(event) { + event.preventDefault(); + if(showCustomersForm){ + const customerID = event.target.elements.id.value; + const customerName = event.target.elements.customerName.value; + const customerPhone = event.target.elements.customerPhone.value; + const DateOfLastUpdate = event.target.elements.DateOfLastUpdate.value; + const info = [customerID, customerName, customerPhone, DateOfLastUpdate]; + console.log("customer") + + console.log(info) + AddtoCustomers(info) + } + setShowCustomersForm(!showCustomersForm); + } + function handleRecipesSubmit(event) { event.preventDefault(); - // Here, you can send the form data to your Postgres database - // using a fetch request or another method - console.log("handleSubmitCunt") + if(showRecipesForm){ + const product_id = event.target.elements.product_id.value; + const inventory_id = event.target.elements.inventory_id.value; + const inventory_item = event.target.elements.inventory_item.value; + const quantity = event.target.elements.quantity.value; + const unit = event.target.elements.unit.value; + const DateOfLastUpdate = event.target.elements.DateOfLastUpdate.value; + const info = [product_id, inventory_id, inventory_item, quantity, unit, DateOfLastUpdate] + console.log("recipes") + + // console.log(info) + AddtoRecipes(info) + } + setShowRecipesForm(!showRecipesForm); } + function handleReportSubmit(event) { + event.preventDefault(); + if(showReportForm){ + const start = event.target.elements.start.value; + const end = event.target.elements.end.value; + const info = [start, end] + console.log("report") + // console.log(info) + SalesReport(info) + .then(data => { + tabs[0].tableData = data; - const handleClick = () => { - console.log("formcunt") - setShowForm(!showForm); + }) + .catch(error => { + console.error(error); + }); + } + setShowReportForm(!showReportForm); } const handleTabClick = (tabIndex) => { setActiveTab(tabIndex); // Update the active tab state when a tab is clicked }; - - return (
@@ -112,10 +227,9 @@ const Manager = () => { - - - - + {tab.tableData.length > 0 && Object.keys(tab.tableData[0]).map((key) => ( + + ))} @@ -125,6 +239,7 @@ const Manager = () => { ))} + ))}
IDNameAgeNumber{key}
{data[key]}
@@ -133,22 +248,13 @@ const Manager = () => {
- -
- {/* */} - {showForm ? ( +
+ {activeTab === 0 ?
+ {showInventoryForm ? (
-
+ @@ -168,17 +274,146 @@ const Manager = () => { - +
) : (
- +
)} -
+
: null} + {activeTab === 2 ?
+ {showProductsForm ? ( +
+
+ + + + + + + + + + + + + + + + + + + +
+
+ ) : ( +
+ +
+ )} +
: null} + {activeTab === 6 ?
+ {showEmployeesForm ? ( +
+
+ + + + + + + + + + + + + + + +
+
+ ) : ( +
+ +
+ )} +
: null} + {activeTab === 7 ?
+ {showCustomersForm ? ( +
+
+ + + + + + + + + + + + + +
+
+ ) : ( +
+ +
+ )} +
: null} + {activeTab === 8 ?
{showRecipesForm ? ( +
+
+ + + + + + + + + + + + + + + + + + +
+
+ ) : ( +
+ +
+ )} +
: null} + {activeTab === 10 ?
+
+
+ + + + + + +
+
+
+ +
+
: null} +
+ ) From 2931bfafd460cd4ee408606fdf58c8ce44e91b7d Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Tue, 2 May 2023 14:51:22 -0500 Subject: [PATCH 16/17] Functions added for reports --- backend/server.js | 27 +++++++++++++-------------- backend/server_functions.js | 18 +++++++++++------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/backend/server.js b/backend/server.js index 323c515..8fd6fdb 100644 --- a/backend/server.js +++ b/backend/server.js @@ -37,6 +37,7 @@ app.get('/queryInventory/:start/:end', async (req, res) => { queryToUse = 'SELECT * FROM inventory WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; } console.log(queryToUse); + const { rows } = await pool.query(queryToUse); res.json(rows); //console.log(rows); @@ -53,7 +54,7 @@ app.get('/queryProducts/:start/:end', async (req, res) => { var queryToUse; if((start === 0) && (end === 0)){ queryToUse = 'SELECT * FROM products ORDER BY id limit 10'; - } + } else{ queryToUse = 'SELECT * FROM products WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; } @@ -317,22 +318,20 @@ app.post('/add-recipes', async (req, res) => { }); app.get('/salesReport/:start/:end', async (req, res) => { try { - const start = parseInt(req.params.start); - const end = parseInt(req.params.end); - var queryToUse; - if((start === 0) && (end === 0)){ - queryToUse = 'SELECT * FROM inventory ORDER BY id limit 10'; - } - else{ - queryToUse = 'SELECT * FROM inventory WHERE id >= ' + start + ' AND id <= ' + end + ' ORDER BY id'; - } - console.log(queryToUse); + const start = req.params.start; + const end = req.params.end; + const queryToUse = "SELECT p.product_name, COUNT(*) AS total_sales "+ + "FROM orders o "+ + "JOIN sales s ON o.sale_id = s.id " + + "JOIN products p ON o.product_id = p.id " + + "WHERE s.date BETWEEN '"+start+"' AND '"+end+"' " + + "GROUP BY p.product_name "+ + "ORDER BY total_sales DESC;"; + // console.log(queryToUse); const { rows } = await pool.query(queryToUse); res.json(rows); - //console.log(rows); } catch (err) { - - console.error("Read query in inventory failed " +err); + console.error("Read query in sales failed " + err); res.status(500).json({ error: 'Internal server error' }); } }); diff --git a/backend/server_functions.js b/backend/server_functions.js index e012dba..5bbd4b5 100644 --- a/backend/server_functions.js +++ b/backend/server_functions.js @@ -293,19 +293,23 @@ function AddtoRecipes(info) { handleSubmit() } -function SalesReport(start, end){ - return new Promise((resolve, reject) => { - async function fetchInventoryItems() { +function GetSalesReport(start, end){ + const [salesData, setSalesData] = useState([]); + //console.log(`${host}/salesHistoryRequest/${start}/${end}`); + useEffect(() => { + async function fetchSalesReport() { const response = await fetch(`http://localhost:3001/salesReport/${start}/${end}`); const data = await response.json(); - resolve(data); + setSalesData(data); + // console.table(data); } - fetchInventoryItems().catch(reject); - }); + fetchSalesReport(); + }, [start, end]); + return salesData; } export {GetInventoryList, GetCurrentInventoryList, GetProductsList, GetCustomizationsList, GetSalesList, GetOrdersList, GetEmployeesList , GetCustomersList, GetRecipesList, GetSizesList, AddtoInventory, AddtoCustomers, AddtoEmployees, AddtoProducts, - AddtoRecipes, SalesReport + AddtoRecipes, GetSalesReport }; From c64de776c5d620238ff8913c46d7dd0ee62ae384 Mon Sep 17 00:00:00 2001 From: Chenners13 <123605456+Chenners13@users.noreply.github.com> Date: Tue, 2 May 2023 14:51:44 -0500 Subject: [PATCH 17/17] Sales report added --- pages/Manager.js | 146 +++++++++++++++++++++++++++++++---------------- 1 file changed, 98 insertions(+), 48 deletions(-) diff --git a/pages/Manager.js b/pages/Manager.js index 92248a4..dbf1c70 100644 --- a/pages/Manager.js +++ b/pages/Manager.js @@ -2,17 +2,22 @@ import React, { useState , useEffect} from 'react'; import styled from 'styled-components'; import {GetInventoryList, GetCurrentInventoryList, GetProductsList, GetCustomizationsList, GetSalesList, GetOrdersList, GetEmployeesList , GetCustomersList, GetRecipesList, GetSizesList, AddtoInventory, AddtoCustomers, AddtoEmployees, AddtoProducts, - AddtoRecipes, SalesReport} from '../backend/server_functions'; + AddtoRecipes, GetSalesReport} from '../backend/server_functions'; const Manager = () => { const [activeTab, setActiveTab] = useState(0); // Define the active tab state + const [activeReport, setReport] = useState(0); // Define the active tab state + const [startDate, setStartDate] = useState('2020-01-01'); // Define the active tab state + const [endDate, setEndDate] = useState('2024-01-01'); // Define the active tab state + + const [showInventoryForm, setShowInventoryForm] = useState(false); const [showProductsForm, setShowProductsForm] = useState(false); const [showEmployeesForm, setShowEmployeesForm] = useState(false); const [showCustomersForm, setShowCustomersForm] = useState(false); const [showRecipesForm, setShowRecipesForm] = useState(false); const [showReportForm, setShowReportForm] = useState(false); - + const starting_inventory = GetInventoryList(0, 0) const productData = GetProductsList(0,0); @@ -53,7 +58,7 @@ const Manager = () => { // }); // }, []); - let tabs = [ + const tabs = [ { id: 0, name: 'Inventory', tableData: starting_inventory}, { id: 1, name: 'Transactions', tableData: []}, { id: 2, name: 'Products', tableData: productData }, @@ -65,15 +70,16 @@ const Manager = () => { { id: 8, name: 'Recipes', tableData: recipeData }, { id: 9, name: 'Sizes', tableData: sizeData }, { id: 10, name: 'Reports', tableData: [ - {id: 0, name: 'Sales Report', reportData: []}, - {id: 1, name: 'X Report', reportData: []}, - {id: 2, name: 'Z Report', reportData: []}, - {id: 3, name: 'Excess Report', reportData: []}, - {id: 4, name: 'Restock Report', reportData: []}, - {id: 5, name: 'What Sells Together', reportData: []}, + {id: 0, name: 'Sales Report', reportData: GetSalesReport(startDate, endDate)}, + {id: 1, name: 'X Report', reportData: ['X report']}, + {id: 2, name: 'Z Report', reportData: ['Z report']}, + {id: 3, name: 'Excess Report', reportData: ['Excess']}, + {id: 4, name: 'Restock Report', reportData: ['Restock']}, + {id: 5, name: 'What Sells Together', reportData: ['What Sells together']}, ] }, ]; - + // console.log("SALES REPORT") + // console.log(GetSalesReport('2021-01-01', '2024-01-01')) function handleInventorySubmit(event) { event.preventDefault(); if(showInventoryForm){ @@ -90,8 +96,11 @@ const Manager = () => { AddtoInventory(info) GetCurrentInventoryList(0, 0) .then(data => { - tabs[0].tableData = data; - + // tabs[0].tableData = data; + let newTabs = [...tabs] + newTabs[0].tableData = data; + console.log(newTabs) + }) .catch(error => { console.error(error); @@ -111,7 +120,7 @@ const Manager = () => { const info = [productID, productName,productType, productPrice, productDescription, DateOfLastUpdate] console.log("product") - // console.log(info) + console.log(info) AddtoProducts(info) } setShowProductsForm(!showProductsForm); @@ -165,26 +174,19 @@ const Manager = () => { } function handleReportSubmit(event) { event.preventDefault(); - if(showReportForm){ const start = event.target.elements.start.value; const end = event.target.elements.end.value; const info = [start, end] - console.log("report") - // console.log(info) - SalesReport(info) - .then(data => { - tabs[0].tableData = data; - - }) - .catch(error => { - console.error(error); - }); - } - setShowReportForm(!showReportForm); + // console.log("report") + setStartDate(start) + setEndDate(end) } const handleTabClick = (tabIndex) => { setActiveTab(tabIndex); // Update the active tab state when a tab is clicked }; + const handleReportClick = (ReportIndex) => { + setReport(ReportIndex); // Update the active tab state when a tab is clicked + }; return (
@@ -224,27 +226,30 @@ const Manager = () => {
{tabs.map((tab) => (
- - - - {tab.tableData.length > 0 && Object.keys(tab.tableData[0]).map((key) => ( - + {tab.id === 10 ? null: + + (
{key}
+ + + {tab.tableData.length > 0 && Object.keys(tab.tableData[0]).map((key) => ( + + ))} + + + + {tab.tableData.map((data) => ( + + {Object.keys(data).map((key) => ( + + ))} + + ))} - - - - {tab.tableData.map((data) => ( - - {Object.keys(data).map((key) => ( - - ))} - - - ))} - -
{key}
{data[key]}
{data[key]}
+ + + )}
- ))} + ))}
{ {activeTab === 2 ?
{showProductsForm ? (
-
+ @@ -397,9 +402,54 @@ const Manager = () => {
)}
: null} - {activeTab === 10 ?
+ {activeTab === 10 ? + +
+
+
+ {tabs[10].tableData.map((tableData) => ( +
handleReportClick(tableData.id)} + style={{ + backgroundColor: activeReport=== tableData.id ? '#1e3932' : '#00754a', + color: 'white', + padding: '10px', + cursor: 'pointer', + }} + > + {tableData.name} +
+ ))} +
+
+ {tabs[10].tableData.map((reportTab) => ( +
+ + + + {reportTab.reportData.length > 0 && Object.keys(reportTab.reportData[0]).map((key) => ( + + ))} + + + + {reportTab.reportData.map((data) => ( + + {Object.keys(data).map((key) => ( + + ))} + + + ))} + +
{key}
{data[key]}
+
+ ))} +
+
- +