Get stores from vinmonopolet.
Update all endpoint names to distinguish between wine and store actions. Renamed wineController to vinmonopoletController.
This commit is contained in:
		
							
								
								
									
										85
									
								
								api/controllers/vinmonopoletController.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								api/controllers/vinmonopoletController.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | |||||||
|  | const path = require("path"); | ||||||
|  | const vinmonopoletRepository = require(path.join(__dirname, "../vinmonopolet")); | ||||||
|  |  | ||||||
|  | function searchWines(req, res) { | ||||||
|  |   const { name, page } = req.query; | ||||||
|  |  | ||||||
|  |   return vinmonopoletRepository.searchWinesByName(name, page).then(wines => | ||||||
|  |     res.json({ | ||||||
|  |       wines: wines, | ||||||
|  |       count: wines.length, | ||||||
|  |       page: page, | ||||||
|  |       success: true | ||||||
|  |     }) | ||||||
|  |   ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function wineByEAN(req, res) { | ||||||
|  |   const { ean } = req.params; | ||||||
|  |  | ||||||
|  |   return vinmonopoletRepository.searchByEAN(ean).then(wines => | ||||||
|  |     res.json({ | ||||||
|  |       wines: wines, | ||||||
|  |       success: true | ||||||
|  |     }) | ||||||
|  |   ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function wineById(req, res) { | ||||||
|  |   const { id } = req.params; | ||||||
|  |  | ||||||
|  |   return vinmonopoletRepository.searchById(id).then(wines => | ||||||
|  |     res.json({ | ||||||
|  |       wine: wines[0], | ||||||
|  |       success: true | ||||||
|  |     }) | ||||||
|  |   ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function allStores(req, res) { | ||||||
|  |   return vinmonopoletRepository | ||||||
|  |     .allStores() | ||||||
|  |     .then(stores => | ||||||
|  |       res.send({ | ||||||
|  |         stores, | ||||||
|  |         success: true | ||||||
|  |       }) | ||||||
|  |     ) | ||||||
|  |     .catch(error => { | ||||||
|  |       const { statusCode, message } = error; | ||||||
|  |  | ||||||
|  |       return res.status(statusCode || 500).send({ | ||||||
|  |         message: message || "Unexpected error occured while fetch all vinmonopolet stores.", | ||||||
|  |         success: false | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function searchStores(req, res) { | ||||||
|  |   const { name } = req.query; | ||||||
|  |  | ||||||
|  |   return vinmonopoletRepository | ||||||
|  |     .searchStoresByName(name) | ||||||
|  |     .then(stores => | ||||||
|  |       res.send({ | ||||||
|  |         stores, | ||||||
|  |         success: true | ||||||
|  |       }) | ||||||
|  |     ) | ||||||
|  |     .catch(error => { | ||||||
|  |       const { statusCode, message } = error; | ||||||
|  |  | ||||||
|  |       return res.status(statusCode || 500).send({ | ||||||
|  |         message: message || "Unexpected error occured while fetch all vinmonopolet stores.", | ||||||
|  |         success: false | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |   searchWines, | ||||||
|  |   wineByEAN, | ||||||
|  |   wineById, | ||||||
|  |   allStores, | ||||||
|  |   searchStores | ||||||
|  | }; | ||||||
| @@ -1,44 +0,0 @@ | |||||||
| const path = require("path"); |  | ||||||
| const vinmonopoletRepository = require(path.join(__dirname, "../vinmonopolet")); |  | ||||||
|  |  | ||||||
| function search(req, res) { |  | ||||||
|   const { query, page } = req.query; |  | ||||||
|   console.log(query, page); |  | ||||||
|  |  | ||||||
|   return vinmonopoletRepository.searchByQuery(query, page).then(wines => |  | ||||||
|     res.json({ |  | ||||||
|       wines: wines, |  | ||||||
|       count: wines.length, |  | ||||||
|       page: page, |  | ||||||
|       success: true |  | ||||||
|     }) |  | ||||||
|   ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function ean(req, res) { |  | ||||||
|   const { ean } = req.params; |  | ||||||
|  |  | ||||||
|   return vinmonopoletRepository.searchByEAN(ean).then(wines => |  | ||||||
|     res.json({ |  | ||||||
|       wines: wines, |  | ||||||
|       success: true |  | ||||||
|     }) |  | ||||||
|   ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function id(req, res) { |  | ||||||
|   const { id } = req.params; |  | ||||||
|  |  | ||||||
|   return vinmonopoletRepository.searchById(id).then(wines => |  | ||||||
|     res.json({ |  | ||||||
|       wine: wines[0], |  | ||||||
|       success: true |  | ||||||
|     }) |  | ||||||
|   ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| module.exports = { |  | ||||||
|   search, |  | ||||||
|   ean, |  | ||||||
|   id |  | ||||||
| }; |  | ||||||
| @@ -17,14 +17,22 @@ const convertToOurWineObject = wine => { | |||||||
|   } |   } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const searchByQuery = async (query, page = 1) => { | const convertToOurStoreObject = store => { | ||||||
|  |   return { | ||||||
|  |     id: store.storeId, | ||||||
|  |     name: store.storeName, | ||||||
|  |     ...store.address | ||||||
|  |   }; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | const searchWinesByName = async (name, page = 1) => { | ||||||
|   const pageSize = 15; |   const pageSize = 15; | ||||||
|   let url = new URL( |   let url = new URL( | ||||||
|     `https://apis.vinmonopolet.no/products/v0/details-normal?productShortNameContains=gato&maxResults=15` |     `https://apis.vinmonopolet.no/products/v0/details-normal?productShortNameContains=gato&maxResults=15` | ||||||
|   ); |   ); | ||||||
|   url.searchParams.set("maxResults", pageSize); |   url.searchParams.set("maxResults", pageSize); | ||||||
|   url.searchParams.set("start", pageSize * (page - 1)); |   url.searchParams.set("start", pageSize * (page - 1)); | ||||||
|   url.searchParams.set("productShortNameContains", query); |   url.searchParams.set("productShortNameContains", name); | ||||||
|  |  | ||||||
|   const vinmonopoletResponse = await fetch(url, { |   const vinmonopoletResponse = await fetch(url, { | ||||||
|     headers: { |     headers: { | ||||||
| @@ -50,14 +58,14 @@ const searchByQuery = async (query, page = 1) => { | |||||||
|   return winesConverted; |   return winesConverted; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const searchByEAN = ean => { | const wineByEAN = ean => { | ||||||
|   const url = `https://app.vinmonopolet.no/vmpws/v2/vmp/products/barCodeSearch/${ean}`; |   const url = `https://app.vinmonopolet.no/vmpws/v2/vmp/products/barCodeSearch/${ean}`; | ||||||
|   return fetch(url) |   return fetch(url) | ||||||
|     .then(resp => resp.json()) |     .then(resp => resp.json()) | ||||||
|     .then(response => response.map(convertToOurWineObject)); |     .then(response => response.map(convertToOurWineObject)); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const searchById = id => { | const wineById = id => { | ||||||
|   const url = `https://apis.vinmonopolet.no/products/v0/details-normal?productId=${id}`; |   const url = `https://apis.vinmonopolet.no/products/v0/details-normal?productId=${id}`; | ||||||
|   const options = { |   const options = { | ||||||
|     headers: { |     headers: { | ||||||
| @@ -70,8 +78,36 @@ const searchById = id => { | |||||||
|     .then(response => response.map(convertToOurWineObject)); |     .then(response => response.map(convertToOurWineObject)); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| module.exports = { | const allStores = () => { | ||||||
|   searchByQuery, |   const url = `https://apis.vinmonopolet.no/stores/v0/details`; | ||||||
|   searchByEAN, |   const options = { | ||||||
|   searchById |     headers: { | ||||||
|  |       "Ocp-Apim-Subscription-Key": config.vinmonopoletToken | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   return fetch(url, options) | ||||||
|  |     .then(resp => resp.json()) | ||||||
|  |     .then(response => response.map(convertToOurStoreObject)); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | const searchStoresByName = name => { | ||||||
|  |   const url = `https://apis.vinmonopolet.no/stores/v0/details?storeNameContains=${name}`; | ||||||
|  |   const options = { | ||||||
|  |     headers: { | ||||||
|  |       "Ocp-Apim-Subscription-Key": config.vinmonopoletToken | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   return fetch(url, options) | ||||||
|  |     .then(resp => resp.json()) | ||||||
|  |     .then(response => response.map(convertToOurStoreObject)); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |   searchWinesByName, | ||||||
|  |   wineByEAN, | ||||||
|  |   wineById, | ||||||
|  |   allStores, | ||||||
|  |   searchStoresByName | ||||||
| }; | }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user