Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. exports.getMtgSkTradersOffers = (req, res, next) => {
  2.   const cardConditionsMap = {
  3.     1: "MT",
  4.     2: "NM",
  5.     3: "EX",
  6.     4: "GD",
  7.     5: "LP",
  8.     6: "PL",
  9.     7: "PO"
  10.   };
  11.  
  12.   const buildFilterObj = type => {
  13.     let { language, condition, foil } = req.query;
  14.     language = parseInt(language);
  15.     condition = parseInt(condition);
  16.     foil = parseInt(foil);
  17.  
  18.     let filterObj = {};
  19.  
  20.     if (type === "market") {
  21.       if (condition) {
  22.         filterObj["minCondition"] = cardConditionsMap[condition];
  23.       }
  24.  
  25.       if (language) {
  26.         filterObj["idLanguage"] = language;
  27.       }
  28.  
  29.       if (foil) {
  30.         filterObj["isFoil"] = foil === 1 ? true : false;
  31.       }
  32.     } else if (type === "local") {
  33.       // metakoment:// tuna by v podstate mohol byt len else, ale pride mi ze to pomaha citatelnosti
  34.       if (condition) {
  35.         filterObj["condition"] = { $lte: condition };
  36.       }
  37.       if (language) {
  38.         filterObj["language.idLanguage"] = language;
  39.       }
  40.       if (foil) {
  41.         filterObj["isFoil"] = foil === 1 ? true : false;
  42.       }
  43.     }
  44.  
  45.     return filterObj;
  46.   };
  47.  
  48.   const addPrintingInfoToArticle = (article, printing) => {
  49.     //Local article has article.seller as string, market article has it in article.seller.username, we want string
  50.     let seller = article.seller;
  51.     if (typeof article.seller === "object") {
  52.       seller = article.seller.username;
  53.     }
  54.     //Local article has condition as number, market article as string, we want string
  55.     let condition = article.condition;
  56.     if (typeof article.condition === "number") {
  57.       condition = cardConditionsMap[condition];
  58.     }
  59.     return {
  60.       ...article,
  61.       name: printing.enName,
  62.       expansion: printing.expansionName,
  63.       seller,
  64.       condition,
  65.       rarity: printing.rarity,
  66.       image: printing.image,
  67.       website: printing.website
  68.     };
  69.   };
  70.  
  71.   const getMtgSkMarketTraders = () => {
  72.     return new Promise((resolve, reject) => {
  73.       User.find({ trading: true }, (err, users) => {
  74.         if (err) reject(err);
  75.  
  76.         let traders = users.filter(user => user.trading === true);
  77.  
  78.         let marketTraderNames = [];
  79.  
  80.         traders.forEach(trader => {
  81.           if (!trader.locally) marketTraderNames.push(trader.cardmarket);
  82.         });
  83.  
  84.         resolve(marketTraderNames);
  85.       });
  86.     });
  87.   };
  88.  
  89.   const getPrintingsFromCardmarket = cardName => {
  90.     return new Promise((resolve, reject) => {
  91.       Client.request("GET", "/ws/v2.0/output.json/products/find", {
  92.         search: cardName
  93.       })
  94.         .then(marketResponse => {
  95.           if (marketResponse.status !== 200)
  96.             return next(["Na Cardmarkete sa nenaΕ‘la tΓ‘to karta."]);
  97.           let marketResponseJson = JSON.parse(marketResponse.response);
  98.           const printings = marketResponseJson.product;
  99.           resolve(printings);
  100.         })
  101.         .catch(err => {
  102.           reject(err);
  103.         });
  104.     });
  105.   };
  106.  
  107.   const getCardmarketOffers = (printing, traders, filters) => {
  108.     return new Promise((resolve, reject) => {
  109.       Client.request(
  110.         "GET",
  111.         "/ws/v2.0/output.json/articles/" + printing.idProduct,
  112.         { ...filters, start: 0, maxResults: 1000 }
  113.       )
  114.         .then(marketResponse => {
  115.           if (!marketResponse.response) resolve([]); //If there is no response, there are no articles for given product, so we return empty array
  116.           const marketResponseJson = JSON.parse(marketResponse.response);
  117.           const articles = marketResponseJson.article;
  118.  
  119.           let mtgSkTradersArticles = articles.filter(article =>
  120.             traders.includes(article.seller.username)
  121.           );
  122.  
  123.           let mtgSkTradersOffers = mtgSkTradersArticles.map(article =>
  124.             addPrintingInfoToArticle(article, printing)
  125.           );
  126.           resolve(mtgSkTradersOffers);
  127.         })
  128.         .catch(err => {
  129.           reject(err);
  130.         });
  131.     });
  132.   };
  133.  
  134.   const getLocalOffers = (printing, filters) => {
  135.     return new Promise((resolve, reject) => {
  136.       Article.find(
  137.         { idProduct: printing.idProduct, ...filters },
  138.         null,
  139.         { lean: true }, //returns Object instead of Document
  140.         (err, articles) => {
  141.           if (err) return reject(err);
  142.  
  143.           let localOffers = articles.map(article =>
  144.             addPrintingInfoToArticle(article, printing)
  145.           );
  146.  
  147.           resolve(localOffers);
  148.         }
  149.       );
  150.     });
  151.   };
  152.  
  153.   /**
  154.    * There are two types of traders on MtG.sk: local and market
  155.    * Offers of local traders are stored in local database
  156.    * Offers of market traders are fetched from Cardmarket API
  157.    */
  158.   const getAllOffersForPrinting = (printing, marketTraders) => {
  159.     return new Promise((resolve, reject) => {
  160.       let offersPromises = [
  161.         getLocalOffers(printing, buildFilterObj("local")),
  162.         getCardmarketOffers(printing, marketTraders, buildFilterObj("market"))
  163.       ];
  164.  
  165.       Promise.all(offersPromises)
  166.         .then(([localOffers, marketOffers]) =>
  167.           resolve([...marketOffers, ...localOffers])
  168.         )
  169.         .catch(err => reject(err));
  170.     });
  171.   };
  172.  
  173.   let prereqPromises = [
  174.     getMtgSkMarketTraders(),
  175.     getPrintingsFromCardmarket(req.query.cardName)
  176.   ];
  177.   Promise.all(prereqPromises).then(([marketTraders, printings]) => {
  178.     let printingOfferPromises = printings.map(printing => {
  179.       return new Promise((resolve, reject) => {
  180.         getAllOffersForPrinting(printing, marketTraders)
  181.           .then(offers => resolve(offers))
  182.           .catch(err => reject(err));
  183.       });
  184.     });
  185.  
  186.     Promise.all(printingOfferPromises)
  187.       .then(listOfOffersPerPrinting => {
  188.         let listOfAllOffers = listOfOffersPerPrinting.reduce(
  189.           (acc, val) => acc.concat(val),
  190.           []
  191.         );
  192.  
  193.         res.send(listOfAllOffers);
  194.       })
  195.       .catch(err => {
  196.         console.log(err);
  197.         res.next(["Vyskytla sa chyba :("]);
  198.       });
  199.   });
  200. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement