368 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			368 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import fetch from "node-fetch";
 | |
| 
 | |
| const BASE_URL = window.location.origin;
 | |
| 
 | |
| const statistics = () => {
 | |
|   return fetch("/api/purchase/statistics")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const colorStatistics = () => {
 | |
|   return fetch("/api/purchase/statistics/color")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const highscoreStatistics = () => {
 | |
|   return fetch("/api/highscore/statistics")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const overallWineStatistics = () => {
 | |
|   return fetch("/api/wines/statistics/overall")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const allRequestedWines = () => {;
 | |
|   return fetch("/api/request/all")
 | |
|     .then(resp => {
 | |
|       const isAdmin = resp.headers.get("vinlottis-admin") == "true";
 | |
|       const getWinesFromBody = (resp) => resp.json().then(body => body.wines);
 | |
|       return Promise.all([getWinesFromBody(resp), isAdmin]);
 | |
|     });
 | |
| };
 | |
| 
 | |
| const chartWinsByColor = () => {
 | |
|   return fetch("/api/purchase/statistics/color")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const chartPurchaseByColor = () => {
 | |
|   return fetch("/api/purchase/statistics")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const prelottery = () => {
 | |
|   return fetch("/api/wines/prelottery")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const sendLottery = sendObject => {
 | |
|   const options = {
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     method: "POST",
 | |
|     body: JSON.stringify(sendObject)
 | |
|   };
 | |
| 
 | |
|   return fetch("/api/lottery", options)
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const sendLotteryWinners = sendObject => {
 | |
|   const options = {
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     method: "POST",
 | |
|     body: JSON.stringify(sendObject)
 | |
|   };
 | |
| 
 | |
|   return fetch("/api/lottery/winners", options)
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const addAttendee = sendObject => {
 | |
|   const options = {
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     method: "POST",
 | |
|     body: JSON.stringify(sendObject)
 | |
|   };
 | |
| 
 | |
|   return fetch("/api/virtual/attendee/add", options)
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const getVirtualWinner = () => {
 | |
|   return fetch("/api/virtual/winner/draw")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const attendeesSecure = () => {
 | |
|   return fetch("/api/virtual/attendee/all/secure")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const winnersSecure = () => {
 | |
|   return fetch("/api/virtual/winner/all/secure")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const winners = () => {
 | |
|   return fetch("/api/virtual/winner/all")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const deleteRequestedWine = wineToBeDeleted => {
 | |
|   const options = {
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     method: "DELETE"
 | |
|   };
 | |
| 
 | |
|   return fetch("api/request/" + wineToBeDeleted.id, options)
 | |
|     .then(resp => resp.json());
 | |
| }
 | |
| 
 | |
| const deleteWinners = () => {
 | |
|   const options = {
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     method: "DELETE"
 | |
|   };
 | |
| 
 | |
|   return fetch("/api/virtual/winner/all", options)
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const deleteAttendees = () => {
 | |
|   const options = {
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     method: "DELETE"
 | |
|   };
 | |
| 
 | |
|   return fetch("/api/virtual/attendee/all", options)
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const attendees = () => {
 | |
|   return fetch("/api/virtual/attendee/all")
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const requestNewWine = (wine) => {
 | |
|   const options = {
 | |
|     method: "POST",
 | |
|      headers: {
 | |
|       'Accept': 'application/json',
 | |
|       'Content-Type': 'application/json'
 | |
|     },
 | |
|     body: JSON.stringify({ wine })
 | |
|   }
 | |
| 
 | |
|   return fetch("/api/request/new-wine", options)
 | |
|     .then(resp => resp.json())
 | |
| }
 | |
| 
 | |
| const logWines = wines => {
 | |
|   const options = {
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     method: "POST",
 | |
|     body: JSON.stringify(wines)
 | |
|   };
 | |
| 
 | |
|   return fetch("/api/log/wines", options)
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const wineSchema = () => {
 | |
|   const url = new URL("/api/wineinfo/schema", BASE_URL);
 | |
| 
 | |
|   return fetch(url.href).then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const barcodeToVinmonopolet = id => {
 | |
|   return fetch("/api/wineinfo/")
 | |
|     .then(async resp => {
 | |
|       if (!resp.ok) {
 | |
|         if (resp.status == 404) {
 | |
|           throw await resp.json();
 | |
|         }
 | |
|       } else {
 | |
|         return resp.json();
 | |
|       }
 | |
|     });
 | |
| };
 | |
| 
 | |
| const searchForWine = searchString => {
 | |
|   return fetch("/api/wineinfo/search?query=" + searchString)
 | |
|     .then(async resp => {
 | |
|       if (!resp.ok) {
 | |
|         if (resp.status == 404) {
 | |
|           throw await resp.json();
 | |
|         }
 | |
|       } else {
 | |
|         return resp.json();
 | |
|       }
 | |
|     });
 | |
| };
 | |
| 
 | |
| 
 | |
| const handleErrors = async resp => {
 | |
|   if ([400, 409].includes(resp.status)) {
 | |
|     throw await resp.json();
 | |
|   } else {
 | |
|     console.error("Unexpected error occured when login/register user:", resp);
 | |
|     throw await resp.json();
 | |
|   }
 | |
| };
 | |
| 
 | |
| const login = (username, password) => {
 | |
|   const options = {
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     method: "POST",
 | |
|     body: JSON.stringify({ username, password })
 | |
|   };
 | |
| 
 | |
|   return fetch("/api/login", options)
 | |
|     .then(resp => {
 | |
|       if (resp.ok) {
 | |
|         return resp.json();
 | |
|       } else {
 | |
|         return handleErrors(resp);
 | |
|       }
 | |
|     });
 | |
| };
 | |
| 
 | |
| const register = (username, password) => {
 | |
|   const options = {
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     method: "POST",
 | |
|     body: JSON.stringify({ username, password })
 | |
|   };
 | |
| 
 | |
|   return fetch("/api/register", options)
 | |
|     .then(resp => {
 | |
|       if (resp.ok) {
 | |
|         return resp.json();
 | |
|       } else {
 | |
|         return handleErrors(resp);
 | |
|       }
 | |
|     });
 | |
| };
 | |
| 
 | |
| const getChatHistory = (page=1, limit=10) => {
 | |
|   const url = new URL("/api/chat/history", BASE_URL);
 | |
|   if (!isNaN(page)) url.searchParams.append("page", page);
 | |
|   if (!isNaN(limit)) url.searchParams.append("limit", limit);
 | |
| 
 | |
|   return fetch(url.href)
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const finishedDraw = () => {
 | |
|   const options = {
 | |
|     method: 'POST'
 | |
|   }
 | |
| 
 | |
|   return fetch("/api/virtual/finish", options)
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const getAmIWinner = id => {
 | |
|   return fetch(`/api/winner/${id}`)
 | |
|     .then(resp => resp.json());
 | |
| };
 | |
| 
 | |
| const postWineChosen = (id, wineName) => {
 | |
|   const options = {
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     method: "POST",
 | |
|     body: JSON.stringify({ wineName: wineName })
 | |
|   };
 | |
| 
 | |
|   return fetch(`/api/winner/${id}`, options)
 | |
|     .then(resp => {
 | |
|       if (resp.ok) {
 | |
|         return resp.json();
 | |
|       } else {
 | |
|         return handleErrors(resp);
 | |
|       }
 | |
|     });
 | |
| };
 | |
| 
 | |
| const historyAll = () => {
 | |
|   return fetch(`/api/lottery/all`)
 | |
|     .then(resp => {
 | |
|       if (resp.ok) {
 | |
|         return resp.json();
 | |
|       } else {
 | |
|         return handleErrors(resp);
 | |
|       }
 | |
|     });
 | |
| }
 | |
| 
 | |
| const historyByDate = (date) => {
 | |
|   return fetch(`/api/lottery/by-date/${ date }`)
 | |
|     .then(resp => {
 | |
|       if (resp.ok) {
 | |
|         return resp.json();
 | |
|       } else {
 | |
|         return handleErrors(resp);
 | |
|       }
 | |
|     });
 | |
| }
 | |
| 
 | |
| const getWinnerByName = (name) => {
 | |
|   const encodedName = encodeURIComponent(name)
 | |
| 
 | |
|   return fetch(`/api/lottery/by-name/${name}`)
 | |
|     .then(resp => {
 | |
|      if (resp.ok) {
 | |
|       return resp.json();
 | |
|      } else {
 | |
|       return handleErrors(resp);
 | |
|      }
 | |
|     })
 | |
| }
 | |
| 
 | |
| export {
 | |
|   statistics,
 | |
|   colorStatistics,
 | |
|   highscoreStatistics,
 | |
|   overallWineStatistics,
 | |
|   chartWinsByColor,
 | |
|   chartPurchaseByColor,
 | |
|   prelottery,
 | |
|   sendLottery,
 | |
|   sendLotteryWinners,
 | |
|   logWines,
 | |
|   wineSchema,
 | |
|   barcodeToVinmonopolet,
 | |
|   searchForWine,
 | |
|   requestNewWine,
 | |
|   allRequestedWines,
 | |
|   login,
 | |
|   register,
 | |
|   addAttendee,
 | |
|   getVirtualWinner,
 | |
|   attendeesSecure,
 | |
|   attendees,
 | |
|   winners,
 | |
|   winnersSecure,
 | |
|   deleteWinners,
 | |
|   deleteAttendees,
 | |
|   deleteRequestedWine,
 | |
|   getChatHistory,
 | |
|   finishedDraw,
 | |
|   getAmIWinner,
 | |
|   postWineChosen,
 | |
|   historyAll,
 | |
|   historyByDate,
 | |
|   getWinnerByName
 | |
| };
 |