Merge branch 'master' into feat/register
This commit is contained in:
		| @@ -33,7 +33,6 @@ const addWinnerWithWine = async (winner, wine) => { | ||||
|     wine: savedWine, | ||||
|     color: winner.color | ||||
|   }; | ||||
|  | ||||
|   if (exisitingWinner == undefined) { | ||||
|     const newWinner = new Winner({ | ||||
|       name: winner.name, | ||||
|   | ||||
| @@ -5,10 +5,13 @@ const Attendee = require(path.join(__dirname, "/schemas/Attendee")); | ||||
| const PreLotteryWine = require(path.join(__dirname, "/schemas/PreLotteryWine")); | ||||
| const VirtualWinner = require(path.join(__dirname, "/schemas/VirtualWinner")); | ||||
| const Lottery = require(path.join(__dirname, "/schemas/Purchase")); | ||||
| const { WineNotFound } = require(path.join(__dirname, "/vinlottisErrors")); | ||||
|  | ||||
| const Message = require(path.join(__dirname, "/message")); | ||||
| const historyRepository = require(path.join(__dirname, "/history")); | ||||
| const wineRepository = require(path.join(__dirname, "/wine")); | ||||
| const winnerRepository = require(path.join(__dirname, "/winner")); | ||||
| const prelotteryWineRepository = require(path.join(__dirname, "/prelotteryWine")); | ||||
|  | ||||
| const { | ||||
|   WinnerNotFound, | ||||
| @@ -17,11 +20,36 @@ const { | ||||
|   LotteryByDateNotFound | ||||
| } = 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 { blue, red, yellow, green } = raffles; | ||||
|   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({ | ||||
|       date, | ||||
|       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, | ||||
|       id: wine.id | ||||
|     }); | ||||
|  | ||||
|     console.log(newPrelotteryWine) | ||||
|     return newPrelotteryWine.save(); | ||||
|   }); | ||||
|  | ||||
|   | ||||
| @@ -87,7 +87,6 @@ router.get("/chat/history", chatController.getAllHistory); | ||||
| router.delete("/chat/history", mustBeAuthenticated, chatController.deleteHistory); | ||||
|  | ||||
| router.post("/login", userController.login); | ||||
|  | ||||
| router.get("/logout", userController.logout); | ||||
| if(process.env !== "production") { | ||||
|     // We don't want to hide registering behind a | ||||
|   | ||||
| @@ -10,17 +10,19 @@ const redactWinnerInfoMapper = winner => { | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| const addWinners = winners => { | ||||
|   return Promise.all( | ||||
|     winners.map(winner => { | ||||
|       let newWinnerElement = new VirtualWinner({ | ||||
| const addWinner = winner => { | ||||
|   let newWinner = new VirtualWinner({ | ||||
|     name: winner.name, | ||||
|     color: winner.color, | ||||
|     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) => { | ||||
|   return VirtualWinner.findOne({ id: id }).then(winner => { | ||||
|     if (winner == null) { | ||||
| @@ -86,10 +96,12 @@ const deleteWinners = () => { | ||||
| }; | ||||
|  | ||||
| module.exports = { | ||||
|   addWinner, | ||||
|   addWinners, | ||||
|   allWinners, | ||||
|   winnerById, | ||||
|   updateWinnerById, | ||||
|   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> | ||||
|   <main class="container"> | ||||
|     <div class="header"> | ||||
|       <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"> | ||||
|       <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 | ||||
|         v-for="requestedWine in wines" | ||||
| @@ -20,12 +28,12 @@ | ||||
| import RequestedWineCard from "@/ui/RequestedWineCard"; | ||||
| export default { | ||||
|   components: { | ||||
|     RequestedWineCard | ||||
|     RequestedWineCard, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       wines: undefined, | ||||
|       isAdmin: false | ||||
|       isAdmin: false, | ||||
|     }; | ||||
|   }, | ||||
|   mounted() { | ||||
| @@ -33,18 +41,18 @@ export default { | ||||
|   }, | ||||
|   methods: { | ||||
|     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() { | ||||
|       return fetch("/api/requests") | ||||
|         .then(resp => { | ||||
|         .then((resp) => { | ||||
|           this.isAdmin = resp.headers.get("vinlottis-admin") == "true"; | ||||
|           return resp; | ||||
|         }) | ||||
|         .then(resp => resp.json()) | ||||
|         .then(response => (this.wines = response.wines)); | ||||
|     } | ||||
|   } | ||||
|         .then((resp) => resp.json()) | ||||
|         .then((response) => (this.wines = response.wines)); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| @@ -65,4 +73,30 @@ h1 { | ||||
|   color: $matte-text-color; | ||||
|   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> | ||||
|   | ||||
| @@ -112,11 +112,21 @@ const routes = [ | ||||
|     name: "Topplisten", | ||||
|     component: HighscorePage | ||||
|   }, | ||||
|   { | ||||
|     path: "/anbefal", | ||||
|     name: "Anbefal ny vin", | ||||
|     component: RequestWine | ||||
|   }, | ||||
|   { | ||||
|     path: "/request", | ||||
|     name: "Etterspør vin", | ||||
|     component: RequestWine | ||||
|   }, | ||||
|   { | ||||
|     path: "/anbefalte", | ||||
|     name: "Anbefalte viner", | ||||
|     component: AllRequestedWines | ||||
|   }, | ||||
|   { | ||||
|     path: "/requested-wines", | ||||
|     name: "Etterspurte vin", | ||||
|   | ||||
							
								
								
									
										27
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								package.json
									
									
									
									
									
								
							| @@ -9,25 +9,26 @@ | ||||
|     "watch": "yarn webpack serve --mode development --env development", | ||||
|     "start": "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": "", | ||||
|   "license": "ISC", | ||||
|   "dependencies": { | ||||
|     "@sentry/browser": "^5.28.0", | ||||
|     "@sentry/integrations": "^5.28.0", | ||||
|     "@sentry/browser": "^6.2.0", | ||||
|     "@sentry/integrations": "^6.2.0", | ||||
|     "@zxing/library": "^0.18.3", | ||||
|     "canvas-confetti": "^1.2.0", | ||||
|     "cross-env": "^7.0.3", | ||||
|     "chart.js": "^2.9.3", | ||||
|     "connect-mongo": "^3.2.0", | ||||
|     "cross-env": "^7.0.3", | ||||
|     "express": "^4.17.1", | ||||
|     "express-session": "^1.17.0", | ||||
|     "moment": "^2.24.0", | ||||
|     "mongoose": "^5.11.4", | ||||
|     "node-fetch": "^2.6.0", | ||||
|     "node-sass": "^5.0.0", | ||||
|     "node-schedule": "^1.3.2", | ||||
|     "node-schedule": "^2.0.0", | ||||
|     "passport": "^0.4.1", | ||||
|     "passport-local": "^1.0.0", | ||||
|     "passport-local-mongoose": "^6.0.1", | ||||
| @@ -35,7 +36,7 @@ | ||||
|     "socket.io": "^3.0.3", | ||||
|     "socket.io-client": "^3.0.3", | ||||
|     "vue": "~2.6", | ||||
|     "vue-router": "~3.4.9", | ||||
|     "vue-router": "~3.5.1", | ||||
|     "vuex": "^3.6.0", | ||||
|     "web-push": "^3.4.3" | ||||
|   }, | ||||
| @@ -44,24 +45,24 @@ | ||||
|     "@babel/preset-env": "~7.12", | ||||
|     "babel-loader": "~8.2.2", | ||||
|     "clean-webpack-plugin": "^3.0.0", | ||||
|     "core-js": "3.8.1", | ||||
|     "core-js": "3.9.0", | ||||
|     "css-loader": "^5.0.1", | ||||
|     "file-loader": "^6.2.0", | ||||
|     "friendly-errors-webpack-plugin": "~1.7", | ||||
|     "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", | ||||
|     "optimize-css-assets-webpack-plugin": "~5.0.4", | ||||
|     "redis": "^3.0.2", | ||||
|     "sass-loader": "~10.1.0", | ||||
|     "sass-loader": "~11.0.1", | ||||
|     "url-loader": "^4.1.1", | ||||
|     "vue-loader": "~15.9.5", | ||||
|     "vue-style-loader": "~4.1", | ||||
|     "vue-template-compiler": "^2.6.12", | ||||
|     "webpack": "~5.10.0", | ||||
|     "webpack-bundle-analyzer": "^4.2.0", | ||||
|     "webpack-cli": "~4.2.0", | ||||
|     "webpack": "~5.23.0", | ||||
|     "webpack-bundle-analyzer": "~4.4.0", | ||||
|     "webpack-cli": "~4.5.0", | ||||
|     "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"))); | ||||
|  | ||||
| server.listen(30030); | ||||
| console.log("Server listening on :30030") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user