|
| 1 | +require("dotenv").config(); |
| 2 | + |
| 3 | +const axios = require("axios"); |
| 4 | +const async = require("async"); |
| 5 | +const moment = require("moment-timezone"); |
| 6 | +moment.tz.setDefault("UTC"); |
| 7 | + |
| 8 | +// Axios |
| 9 | +const $http = axios.create({ |
| 10 | + baseURL: `http://localhost:${process.env.PORT}/offline_api` |
| 11 | +}); |
| 12 | + |
| 13 | +function generateSessions(id) { |
| 14 | + let sessions = []; |
| 15 | + let nums = id |
| 16 | + .replace("tt", "") |
| 17 | + .split("") |
| 18 | + .map(item => { |
| 19 | + let num = parseInt(item); |
| 20 | + if (num === 0) { |
| 21 | + num = 1; |
| 22 | + } |
| 23 | + if (num > 6) { |
| 24 | + num = num - 2; |
| 25 | + } |
| 26 | + return num; |
| 27 | + }); |
| 28 | + nums.splice(nums[3], 0, nums[0]); |
| 29 | + nums.shift(); |
| 30 | + nums.forEach((num, index) => { |
| 31 | + let date = moment() |
| 32 | + .startOf("day") |
| 33 | + .add(index, "days"); |
| 34 | + for (let i = 0; i < num; i++) { |
| 35 | + let pos = index + i <= nums.length ? index + i : index + i - nums.length; |
| 36 | + let hours = nums[pos] + 12; |
| 37 | + let mins = |
| 38 | + nums[pos] < 2.5 ? 0 : nums[pos] < 5 ? 15 : nums[pos] < 7.5 ? 30 : 45; |
| 39 | + sessions.push({ |
| 40 | + id: `${id}_${i}`, |
| 41 | + time: moment(date) |
| 42 | + .add(hours, "hours") |
| 43 | + .add(mins, "minutes"), |
| 44 | + seats: Math.round( |
| 45 | + 200 - |
| 46 | + nums.reduce((acc, val) => { |
| 47 | + return acc + val; |
| 48 | + }) + |
| 49 | + num * i |
| 50 | + ) |
| 51 | + }); |
| 52 | + } |
| 53 | + }); |
| 54 | + return sessions.sort((a, b) => { |
| 55 | + if (a.time < b.time) { |
| 56 | + return -1; |
| 57 | + } else { |
| 58 | + return a.time > b.time; |
| 59 | + } |
| 60 | + }); |
| 61 | +} |
| 62 | + |
| 63 | +function cleanData(movie) { |
| 64 | + if ( |
| 65 | + movie.Rated === "N/A" || |
| 66 | + movie.Rated === "UNRATED" || |
| 67 | + movie.Rated === "NOT RATED" |
| 68 | + ) { |
| 69 | + let last = parseInt(movie.imdbID[movie.imdbID.length - 1]); |
| 70 | + movie.Rated = last < 7 ? (last < 4 ? "G" : "PG-13") : "R"; |
| 71 | + } |
| 72 | + return movie; |
| 73 | +} |
| 74 | + |
| 75 | +module.exports = { |
| 76 | + data: [], |
| 77 | + getData(callback) { |
| 78 | + if (!this.data.length) { |
| 79 | + let ids = process.env.IMDB_IDS.split(","); |
| 80 | + let data = []; |
| 81 | + async.each( |
| 82 | + ids, |
| 83 | + function(id, callback) { |
| 84 | + if (!data.find(item => item.id === id)) { |
| 85 | + $http.get(`?i=${id}`).then( |
| 86 | + function(response) { |
| 87 | + if (!response.data.Error) { |
| 88 | + data.push({ |
| 89 | + id, |
| 90 | + movie: cleanData(response.data), |
| 91 | + sessions: generateSessions(id) |
| 92 | + }); |
| 93 | + } else { |
| 94 | + console.log(response.data.Error); |
| 95 | + } |
| 96 | + callback(); |
| 97 | + }, |
| 98 | + function(err) { |
| 99 | + callback(err); |
| 100 | + } |
| 101 | + ); |
| 102 | + } else { |
| 103 | + callback(); |
| 104 | + } |
| 105 | + }, |
| 106 | + err => { |
| 107 | + if (err) { |
| 108 | + callback(err, null); |
| 109 | + } else { |
| 110 | + this.data = ids.map(id => data.find(item => id === item.id)); |
| 111 | + callback(null, this.data); |
| 112 | + } |
| 113 | + } |
| 114 | + ); |
| 115 | + } else { |
| 116 | + callback(null, this.data); |
| 117 | + } |
| 118 | + } |
| 119 | +}; |
0 commit comments