Merge branch 'master' into feat/register
This commit is contained in:
		| @@ -33,7 +33,6 @@ const addWinnerWithWine = async (winner, wine) => { | |||||||
|     wine: savedWine, |     wine: savedWine, | ||||||
|     color: winner.color |     color: winner.color | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   if (exisitingWinner == undefined) { |   if (exisitingWinner == undefined) { | ||||||
|     const newWinner = new Winner({ |     const newWinner = new Winner({ | ||||||
|       name: winner.name, |       name: winner.name, | ||||||
|   | |||||||
| @@ -5,10 +5,13 @@ const Attendee = require(path.join(__dirname, "/schemas/Attendee")); | |||||||
| const PreLotteryWine = require(path.join(__dirname, "/schemas/PreLotteryWine")); | const PreLotteryWine = require(path.join(__dirname, "/schemas/PreLotteryWine")); | ||||||
| const VirtualWinner = require(path.join(__dirname, "/schemas/VirtualWinner")); | const VirtualWinner = require(path.join(__dirname, "/schemas/VirtualWinner")); | ||||||
| const Lottery = require(path.join(__dirname, "/schemas/Purchase")); | const Lottery = require(path.join(__dirname, "/schemas/Purchase")); | ||||||
|  | const { WineNotFound } = require(path.join(__dirname, "/vinlottisErrors")); | ||||||
|  |  | ||||||
| const Message = require(path.join(__dirname, "/message")); | const Message = require(path.join(__dirname, "/message")); | ||||||
| const historyRepository = require(path.join(__dirname, "/history")); | const historyRepository = require(path.join(__dirname, "/history")); | ||||||
| const wineRepository = require(path.join(__dirname, "/wine")); | const wineRepository = require(path.join(__dirname, "/wine")); | ||||||
|  | const winnerRepository = require(path.join(__dirname, "/winner")); | ||||||
|  | const prelotteryWineRepository = require(path.join(__dirname, "/prelotteryWine")); | ||||||
|  |  | ||||||
| const { | const { | ||||||
|   WinnerNotFound, |   WinnerNotFound, | ||||||
| @@ -17,11 +20,36 @@ const { | |||||||
|   LotteryByDateNotFound |   LotteryByDateNotFound | ||||||
| } = require(path.join(__dirname, "/vinlottisErrors")); | } = require(path.join(__dirname, "/vinlottisErrors")); | ||||||
|  |  | ||||||
|  | const moveUnfoundPrelotteryWineToWines = async (error, tempWine) => { | ||||||
|  |   if(!(error instanceof WineNotFound)) { | ||||||
|  |     throw error | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if(!tempWine.winner) { | ||||||
|  |     throw new WinnerNotFound() | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   const prelotteryWine = await prelotteryWineRepository.wineById(tempWine._id); | ||||||
|  |   const winner = await winnerRepository.winnerById(tempWine.winner.id, true); | ||||||
|  |  | ||||||
|  |   return wineRepository | ||||||
|  |     .addWine(prelotteryWine) | ||||||
|  |     .then(_ => prelotteryWineRepository.addWinnerToWine(prelotteryWine, winner)) // prelotteryWine.deleteById | ||||||
|  |     .then(_ => historyRepository.addWinnerWithWine(winner, prelotteryWine)) | ||||||
|  |     .then(_ => winnerRepository.setWinnerChosenById(winner.id)) | ||||||
|  | } | ||||||
|  |  | ||||||
| const archive = (date, raffles, stolen, wines) => { | const archive = (date, raffles, stolen, wines) => { | ||||||
|   const { blue, red, yellow, green } = raffles; |   const { blue, red, yellow, green } = raffles; | ||||||
|   const bought = blue + red + yellow + green; |   const bought = blue + red + yellow + green; | ||||||
|  |  | ||||||
|   return Promise.all(wines.map(wine => wineRepository.findWine(wine))).then(resolvedWines => { |   return Promise.all( | ||||||
|  |     wines.map(wine => wineRepository | ||||||
|  |       .findWine(wine) | ||||||
|  |       .catch(error => moveUnfoundPrelotteryWineToWines(error, wine) | ||||||
|  |           .then(_ => wineRepository.findWine(wine)) | ||||||
|  |       )) | ||||||
|  |   ).then(resolvedWines => { | ||||||
|     const lottery = new Lottery({ |     const lottery = new Lottery({ | ||||||
|       date, |       date, | ||||||
|       blue, |       blue, | ||||||
|   | |||||||
| @@ -1,35 +0,0 @@ | |||||||
| const path = require("path"); |  | ||||||
| const Highscore = require(path.join(__dirname, "/schemas/Highscore")); |  | ||||||
|  |  | ||||||
| async function findSavePerson(foundWinner, wonWine, date) { |  | ||||||
|   let person = await Highscore.findOne({ |  | ||||||
|     name: foundWinner.name |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   if (person == undefined) { |  | ||||||
|     let newPerson = new Highscore({ |  | ||||||
|       name: foundWinner.name, |  | ||||||
|       wins: [ |  | ||||||
|         { |  | ||||||
|           color: foundWinner.color, |  | ||||||
|           date: date, |  | ||||||
|           wine: wonWine |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     await newPerson.save(); |  | ||||||
|   } else { |  | ||||||
|     person.wins.push({ |  | ||||||
|       color: foundWinner.color, |  | ||||||
|       date: date, |  | ||||||
|       wine: wonWine |  | ||||||
|     }); |  | ||||||
|     person.markModified("wins"); |  | ||||||
|     await person.save(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   return person; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| module.exports.findSavePerson = findSavePerson; |  | ||||||
| @@ -23,7 +23,7 @@ const addWines = wines => { | |||||||
|       country: wine.country, |       country: wine.country, | ||||||
|       id: wine.id |       id: wine.id | ||||||
|     }); |     }); | ||||||
|  |     console.log(newPrelotteryWine) | ||||||
|     return newPrelotteryWine.save(); |     return newPrelotteryWine.save(); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -87,7 +87,6 @@ router.get("/chat/history", chatController.getAllHistory); | |||||||
| router.delete("/chat/history", mustBeAuthenticated, chatController.deleteHistory); | router.delete("/chat/history", mustBeAuthenticated, chatController.deleteHistory); | ||||||
|  |  | ||||||
| router.post("/login", userController.login); | router.post("/login", userController.login); | ||||||
|  |  | ||||||
| router.get("/logout", userController.logout); | router.get("/logout", userController.logout); | ||||||
| if(process.env !== "production") { | if(process.env !== "production") { | ||||||
|     // We don't want to hide registering behind a |     // We don't want to hide registering behind a | ||||||
|   | |||||||
| @@ -10,17 +10,19 @@ const redactWinnerInfoMapper = winner => { | |||||||
|   }; |   }; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const addWinners = winners => { | const addWinner = winner => { | ||||||
|   return Promise.all( |   let newWinner = new VirtualWinner({ | ||||||
|     winners.map(winner => { |  | ||||||
|       let newWinnerElement = new VirtualWinner({ |  | ||||||
|     name: winner.name, |     name: winner.name, | ||||||
|     color: winner.color, |     color: winner.color, | ||||||
|     timestamp_drawn: new Date().getTime() |     timestamp_drawn: new Date().getTime() | ||||||
|   }); |   }); | ||||||
|    |    | ||||||
|       return newWinnerElement.save(); |   return newWinner.save() | ||||||
|     }) | } | ||||||
|  |  | ||||||
|  | const addWinners = winners => { | ||||||
|  |   return Promise.all( | ||||||
|  |     winners.map(winner => addWinner(winner)) | ||||||
|   ); |   ); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -49,6 +51,14 @@ const winnerById = (id, isAdmin = false) => { | |||||||
|   }); |   }); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | const setWinnerChosenById = (id) => { | ||||||
|  |   return VirtualWinner.findOne({id: id}).then(winner => { | ||||||
|  |     winner.prize_selected = true | ||||||
|  |     winner.markModified("wins") | ||||||
|  |     return winner.save() | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
| const updateWinnerById = (id, updateModel) => { | const updateWinnerById = (id, updateModel) => { | ||||||
|   return VirtualWinner.findOne({ id: id }).then(winner => { |   return VirtualWinner.findOne({ id: id }).then(winner => { | ||||||
|     if (winner == null) { |     if (winner == null) { | ||||||
| @@ -86,10 +96,12 @@ const deleteWinners = () => { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|  |   addWinner, | ||||||
|   addWinners, |   addWinners, | ||||||
|   allWinners, |   allWinners, | ||||||
|   winnerById, |   winnerById, | ||||||
|   updateWinnerById, |   updateWinnerById, | ||||||
|   deleteWinnerById, |   deleteWinnerById, | ||||||
|   deleteWinners |   deleteWinners, | ||||||
|  |   setWinnerChosenById | ||||||
| }; | }; | ||||||
|   | |||||||
							
								
								
									
										78
									
								
								db/seedSingleDay.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								db/seedSingleDay.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | const session = require("express-session"); | ||||||
|  | const mongoose = require("mongoose"); | ||||||
|  | const MongoStore = require("connect-mongo")(session); | ||||||
|  | mongoose.promise = global.Promise; | ||||||
|  | mongoose | ||||||
|  |   .connect("mongodb://localhost/vinlottis", { | ||||||
|  |     useCreateIndex: true, | ||||||
|  |     useNewUrlParser: true, | ||||||
|  |     useUnifiedTopology: true, | ||||||
|  |     serverSelectionTimeoutMS: 10000 // initial connection timeout | ||||||
|  |   }) | ||||||
|  |   .then(_ => console.log("Mongodb connection established!")) | ||||||
|  |   .catch(err => { | ||||||
|  |     console.log(err); | ||||||
|  |     console.error("ERROR! Mongodb required to run."); | ||||||
|  |     process.exit(1); | ||||||
|  |   }); | ||||||
|  | mongoose.set("debug", false); | ||||||
|  |  | ||||||
|  | const path = require("path") | ||||||
|  | const prelotteryWineRepository = require(path.join(__dirname, "../api/prelotteryWine")); | ||||||
|  | const attendeeRepository = require(path.join(__dirname, "../api/attendee")); | ||||||
|  |  | ||||||
|  | async function add() { | ||||||
|  |     const wines = [ | ||||||
|  |         { | ||||||
|  |             vivinoLink: 'https://www.vinmonopolet.no/Land/Frankrike/Devevey-Bourgogne-Hautes-C%C3%B4tes-de-Beaune-Rouge-2018/p/12351301', | ||||||
|  |             name: 'Devevey Bourgogne Hautes-Côtes de Beaune Rouge 2018', | ||||||
|  |             rating: 3, | ||||||
|  |             id: '12351301', | ||||||
|  |             year: 2018, | ||||||
|  |             image: "https://bilder.vinmonopolet.no/cache/300x300-0/12351301-1.jpg", | ||||||
|  |             price: '370', | ||||||
|  |             country: "Frankrike" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             vivinoLink: 'https://www.vinmonopolet.no/Land/Frankrike/Devevey-Rully-La-Chaume-Rouge-2018/p/12351101', | ||||||
|  |             name: 'Devevey Rully La Chaume Rouge 2018', | ||||||
|  |             rating: 4, | ||||||
|  |             id: '12351101', | ||||||
|  |             year: 2018, | ||||||
|  |             image: 'https://bilder.vinmonopolet.no/cache/300x300-0/12351101-1.jpg', | ||||||
|  |             price: '372', | ||||||
|  |             country: 'Frankrike' | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     const attendees = [ | ||||||
|  |         { | ||||||
|  |             name: "Kasper Rynning-Tønnesen", | ||||||
|  |             red: 0, | ||||||
|  |             blue: 10, | ||||||
|  |             green: 0, | ||||||
|  |             yellow: 0, | ||||||
|  |             phoneNumber: 97777777, | ||||||
|  |             winner: false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             name: "Kevin Midbøe", | ||||||
|  |             red: 3, | ||||||
|  |             blue: 3, | ||||||
|  |             green: 3, | ||||||
|  |             yellow: 3, | ||||||
|  |             phoneNumber: 95012321, | ||||||
|  |             winner: false | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     await prelotteryWineRepository.addWines(wines) | ||||||
|  |     await Promise.all(attendees.map(attendee => attendeeRepository.addAttendee(attendee))) | ||||||
|  |  | ||||||
|  |     console.log("Added some wines, and 2 attendees to database.") | ||||||
|  |     process.exit(1) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | add() | ||||||
| @@ -1,9 +1,17 @@ | |||||||
| <template> | <template> | ||||||
|   <main class="container"> |   <main class="container"> | ||||||
|  |     <div class="header"> | ||||||
|       <h1>Alle foreslåtte viner</h1> |       <h1>Alle foreslåtte viner</h1> | ||||||
|  |       <router-link class="vin-button" to="/anbefal"> | ||||||
|  |         Anbefal ny vin | ||||||
|  |         <i class="icon icon--arrow-right"></i> | ||||||
|  |       </router-link> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|     <section class="wines-container"> |     <section class="wines-container"> | ||||||
|       <p v-if="wines == undefined || wines.length == 0">Ingen har foreslått noe enda!</p> |       <p v-if="wines == undefined || wines.length == 0"> | ||||||
|  |         Ingen har foreslått noe enda! | ||||||
|  |       </p> | ||||||
|  |  | ||||||
|       <RequestedWineCard |       <RequestedWineCard | ||||||
|         v-for="requestedWine in wines" |         v-for="requestedWine in wines" | ||||||
| @@ -20,12 +28,12 @@ | |||||||
| import RequestedWineCard from "@/ui/RequestedWineCard"; | import RequestedWineCard from "@/ui/RequestedWineCard"; | ||||||
| export default { | export default { | ||||||
|   components: { |   components: { | ||||||
|     RequestedWineCard |     RequestedWineCard, | ||||||
|   }, |   }, | ||||||
|   data() { |   data() { | ||||||
|     return { |     return { | ||||||
|       wines: undefined, |       wines: undefined, | ||||||
|       isAdmin: false |       isAdmin: false, | ||||||
|     }; |     }; | ||||||
|   }, |   }, | ||||||
|   mounted() { |   mounted() { | ||||||
| @@ -33,18 +41,18 @@ export default { | |||||||
|   }, |   }, | ||||||
|   methods: { |   methods: { | ||||||
|     filterOutDeletedWine(wine) { |     filterOutDeletedWine(wine) { | ||||||
|       this.wines = this.wines.filter(item => item.wine._id !== wine._id); |       this.wines = this.wines.filter((item) => item.wine._id !== wine._id); | ||||||
|     }, |     }, | ||||||
|     fetchRequestedWines() { |     fetchRequestedWines() { | ||||||
|       return fetch("/api/requests") |       return fetch("/api/requests") | ||||||
|         .then(resp => { |         .then((resp) => { | ||||||
|           this.isAdmin = resp.headers.get("vinlottis-admin") == "true"; |           this.isAdmin = resp.headers.get("vinlottis-admin") == "true"; | ||||||
|           return resp; |           return resp; | ||||||
|         }) |         }) | ||||||
|         .then(resp => resp.json()) |         .then((resp) => resp.json()) | ||||||
|         .then(response => (this.wines = response.wines)); |         .then((response) => (this.wines = response.wines)); | ||||||
|     } |     }, | ||||||
|   } |   }, | ||||||
| }; | }; | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| @@ -65,4 +73,30 @@ h1 { | |||||||
|   color: $matte-text-color; |   color: $matte-text-color; | ||||||
|   font-weight: normal; |   font-weight: normal; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .header { | ||||||
|  |   display: flex; | ||||||
|  |   justify-content: space-between; | ||||||
|  |  | ||||||
|  |   @include mobile { | ||||||
|  |     flex-direction: column; | ||||||
|  |  | ||||||
|  |     a { | ||||||
|  |       align-self: flex-end; | ||||||
|  |       margin-bottom: 4rem; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | a.vin-button { | ||||||
|  |   display: flex; | ||||||
|  |   justify-content: center; | ||||||
|  |   align-items: center; | ||||||
|  |   height: calc(4rem - 20px); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | a .icon { | ||||||
|  |   margin-left: 1rem; | ||||||
|  |   vertical-align: middle; | ||||||
|  | } | ||||||
| </style> | </style> | ||||||
|   | |||||||
| @@ -112,11 +112,21 @@ const routes = [ | |||||||
|     name: "Topplisten", |     name: "Topplisten", | ||||||
|     component: HighscorePage |     component: HighscorePage | ||||||
|   }, |   }, | ||||||
|  |   { | ||||||
|  |     path: "/anbefal", | ||||||
|  |     name: "Anbefal ny vin", | ||||||
|  |     component: RequestWine | ||||||
|  |   }, | ||||||
|   { |   { | ||||||
|     path: "/request", |     path: "/request", | ||||||
|     name: "Etterspør vin", |     name: "Etterspør vin", | ||||||
|     component: RequestWine |     component: RequestWine | ||||||
|   }, |   }, | ||||||
|  |   { | ||||||
|  |     path: "/anbefalte", | ||||||
|  |     name: "Anbefalte viner", | ||||||
|  |     component: AllRequestedWines | ||||||
|  |   }, | ||||||
|   { |   { | ||||||
|     path: "/requested-wines", |     path: "/requested-wines", | ||||||
|     name: "Etterspurte vin", |     name: "Etterspurte vin", | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								package.json
									
									
									
									
									
								
							| @@ -9,25 +9,26 @@ | |||||||
|     "watch": "yarn webpack serve --mode development --env development", |     "watch": "yarn webpack serve --mode development --env development", | ||||||
|     "start": "node server.js", |     "start": "node server.js", | ||||||
|     "dev": "cross-env NODE_ENV=development node server.js", |     "dev": "cross-env NODE_ENV=development node server.js", | ||||||
|     "test": "echo \"Error: no test specified\" && exit 1" |     "test": "echo \"Error: no test specified\" && exit 1", | ||||||
|  |     "seed:single": "node db/seedSingleDay.js" | ||||||
|   }, |   }, | ||||||
|   "author": "", |   "author": "", | ||||||
|   "license": "ISC", |   "license": "ISC", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@sentry/browser": "^5.28.0", |     "@sentry/browser": "^6.2.0", | ||||||
|     "@sentry/integrations": "^5.28.0", |     "@sentry/integrations": "^6.2.0", | ||||||
|     "@zxing/library": "^0.18.3", |     "@zxing/library": "^0.18.3", | ||||||
|     "canvas-confetti": "^1.2.0", |     "canvas-confetti": "^1.2.0", | ||||||
|     "cross-env": "^7.0.3", |  | ||||||
|     "chart.js": "^2.9.3", |     "chart.js": "^2.9.3", | ||||||
|     "connect-mongo": "^3.2.0", |     "connect-mongo": "^3.2.0", | ||||||
|  |     "cross-env": "^7.0.3", | ||||||
|     "express": "^4.17.1", |     "express": "^4.17.1", | ||||||
|     "express-session": "^1.17.0", |     "express-session": "^1.17.0", | ||||||
|     "moment": "^2.24.0", |     "moment": "^2.24.0", | ||||||
|     "mongoose": "^5.11.4", |     "mongoose": "^5.11.4", | ||||||
|     "node-fetch": "^2.6.0", |     "node-fetch": "^2.6.0", | ||||||
|     "node-sass": "^5.0.0", |     "node-sass": "^5.0.0", | ||||||
|     "node-schedule": "^1.3.2", |     "node-schedule": "^2.0.0", | ||||||
|     "passport": "^0.4.1", |     "passport": "^0.4.1", | ||||||
|     "passport-local": "^1.0.0", |     "passport-local": "^1.0.0", | ||||||
|     "passport-local-mongoose": "^6.0.1", |     "passport-local-mongoose": "^6.0.1", | ||||||
| @@ -35,7 +36,7 @@ | |||||||
|     "socket.io": "^3.0.3", |     "socket.io": "^3.0.3", | ||||||
|     "socket.io-client": "^3.0.3", |     "socket.io-client": "^3.0.3", | ||||||
|     "vue": "~2.6", |     "vue": "~2.6", | ||||||
|     "vue-router": "~3.4.9", |     "vue-router": "~3.5.1", | ||||||
|     "vuex": "^3.6.0", |     "vuex": "^3.6.0", | ||||||
|     "web-push": "^3.4.3" |     "web-push": "^3.4.3" | ||||||
|   }, |   }, | ||||||
| @@ -44,24 +45,24 @@ | |||||||
|     "@babel/preset-env": "~7.12", |     "@babel/preset-env": "~7.12", | ||||||
|     "babel-loader": "~8.2.2", |     "babel-loader": "~8.2.2", | ||||||
|     "clean-webpack-plugin": "^3.0.0", |     "clean-webpack-plugin": "^3.0.0", | ||||||
|     "core-js": "3.8.1", |     "core-js": "3.9.0", | ||||||
|     "css-loader": "^5.0.1", |     "css-loader": "^5.0.1", | ||||||
|     "file-loader": "^6.2.0", |     "file-loader": "^6.2.0", | ||||||
|     "friendly-errors-webpack-plugin": "~1.7", |     "friendly-errors-webpack-plugin": "~1.7", | ||||||
|     "google-maps-api-loader": "^1.1.1", |     "google-maps-api-loader": "^1.1.1", | ||||||
|     "html-webpack-plugin": "5.0.0-alpha.15", |     "html-webpack-plugin": "5.2.0", | ||||||
|     "mini-css-extract-plugin": "~1.3.2", |     "mini-css-extract-plugin": "~1.3.2", | ||||||
|     "optimize-css-assets-webpack-plugin": "~5.0.4", |     "optimize-css-assets-webpack-plugin": "~5.0.4", | ||||||
|     "redis": "^3.0.2", |     "redis": "^3.0.2", | ||||||
|     "sass-loader": "~10.1.0", |     "sass-loader": "~11.0.1", | ||||||
|     "url-loader": "^4.1.1", |     "url-loader": "^4.1.1", | ||||||
|     "vue-loader": "~15.9.5", |     "vue-loader": "~15.9.5", | ||||||
|     "vue-style-loader": "~4.1", |     "vue-style-loader": "~4.1", | ||||||
|     "vue-template-compiler": "^2.6.12", |     "vue-template-compiler": "^2.6.12", | ||||||
|     "webpack": "~5.10.0", |     "webpack": "~5.23.0", | ||||||
|     "webpack-bundle-analyzer": "^4.2.0", |     "webpack-bundle-analyzer": "~4.4.0", | ||||||
|     "webpack-cli": "~4.2.0", |     "webpack-cli": "~4.5.0", | ||||||
|     "webpack-dev-server": "~3.11", |     "webpack-dev-server": "~3.11", | ||||||
|     "webpack-merge": "~5.4" |     "webpack-merge": "~5.7.3" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -95,3 +95,4 @@ app.use("/subscription", subscriptionApi); | |||||||
| app.use("/", (req, res) => res.sendFile(path.join(__dirname + "/public/dist/index.html"))); | app.use("/", (req, res) => res.sendFile(path.join(__dirname + "/public/dist/index.html"))); | ||||||
|  |  | ||||||
| server.listen(30030); | server.listen(30030); | ||||||
|  | console.log("Server listening on :30030") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user