├── .gitignore ├── README.md ├── controllers ├── genres.js └── series.js ├── db.json ├── index.js ├── package-lock.json ├── package.json ├── routes ├── genres.js ├── index.js └── series.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Servidor para a Aplicação Minhas Séries - DevPleno 2 | 3 | Version: 2.0 4 | -------------------------------------------------------------------------------- /controllers/genres.js: -------------------------------------------------------------------------------- 1 | const low = require("lowdb"); 2 | const FileAsync = require("lowdb/adapters/FileAsync"); 3 | const adapter = new FileAsync("db.json"); 4 | 5 | const get = async (req, res) => { 6 | const db = await low(adapter); 7 | const result = db.get("genres").value(); 8 | const genres = Object.keys(result).map((each) => { 9 | const newItem = { ...result[each], id: each }; 10 | return newItem; 11 | }); 12 | res.send({ 13 | data: genres, 14 | pagination: { 15 | message: "soon :)", 16 | }, 17 | }); 18 | }; 19 | 20 | const create = async (req, res) => { 21 | const newGenre = req.body; 22 | const db = await low(adapter); 23 | 24 | const result = db.get("genres").value(); 25 | const id = Date.now().toString(); 26 | result[id] = { name: newGenre.name }; 27 | 28 | db.get("genres").push(result).last().write(); 29 | res.send({ ...result[id], id }); 30 | }; 31 | 32 | const getOne = async (req, res) => { 33 | const db = await low(adapter); 34 | const result = db.get("genres").value(); 35 | try { 36 | const genre = result[req.params.id]; 37 | genre['id'] = req.params.id; 38 | res.send(genre); 39 | } catch (error) { 40 | res.send({ status: 'not found' }) 41 | } 42 | }; 43 | 44 | const remove = async (req, res) => { 45 | const db = await low(adapter); 46 | const genre = await db.get("genres").unset(req.params.id).write(); 47 | if (genre.length === 0) { 48 | res.status(401); 49 | res.send({ error: true }); 50 | } else { 51 | res.send({ success: true }); 52 | } 53 | }; 54 | 55 | const update = async (req, res) => { 56 | const db = await low(adapter); 57 | const result = db.get("genres").value(); 58 | 59 | const updateDate = { name: req.body.name }; 60 | result[req.params.id] = updateDate; 61 | 62 | db.get("genres").push(result).last().write(); 63 | res.send(updateDate); 64 | }; 65 | 66 | module.exports = { get, getOne, remove, create, update }; 67 | -------------------------------------------------------------------------------- /controllers/series.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const low = require("lowdb"); 3 | const FileAsync = require("lowdb/adapters/FileAsync"); 4 | const adapter = new FileAsync("db.json"); 5 | 6 | const apiKey = "54bc8a90b9ec3f31addef0c092d7c22e"; 7 | 8 | const getSerieImage = async (name) => { 9 | try { 10 | const url = `https://api.themoviedb.org/3/search/multi?api_key=${apiKey}&language=pt-BR&query=${name}&page=1&include_adult=false`; 11 | const res = await axios.get(url); 12 | return { 13 | poster: `//image.tmdb.org/t/p/original${res.data.results[0].poster_path}`, 14 | background: `//image.tmdb.org/t/p/original${res.data.results[0].backdrop_path}`, 15 | }; 16 | } catch (err) {} 17 | return { poster: "", background: "" }; 18 | }; 19 | 20 | const get = async (req, res) => { 21 | const db = await low(adapter); 22 | // const genres = db.get("genres").value(); 23 | const result = db.get("series").value(); 24 | 25 | const data = []; 26 | Object.keys(result).map((each) => { 27 | result[each]["id"] = each; 28 | // const genreId = result[each].genre_id; 29 | // const genreName = genres[genreId]?.name ?? "Removido"; 30 | // result[each]["genre_name"] = genreName; 31 | const prepareData = { ...result[each] }; 32 | data.push(prepareData); 33 | }); 34 | res.send({ 35 | data, 36 | pagination: { 37 | message: "soon :)", 38 | }, 39 | }); 40 | }; 41 | 42 | const create = async (req, res) => { 43 | const db = await low(adapter); 44 | const newSerie = req.body; 45 | 46 | const images = await getSerieImage(newSerie.name); 47 | 48 | const serieToInsert = { 49 | name: newSerie.name, 50 | status: newSerie.status, 51 | genre_id: newSerie.genre_id, 52 | comments: newSerie.comments, 53 | poster: images.poster, 54 | background: images.background, 55 | }; 56 | 57 | const result = db.get("series").value(); 58 | const id = Date.now().toString(); 59 | result[id] = serieToInsert; 60 | 61 | db.get("series").push(result).last().write(); 62 | res.send(result); 63 | }; 64 | 65 | const getOne = async (req, res) => { 66 | const db = await low(adapter); 67 | const genres = db.get("genres").value(); 68 | const result = db.get("series").value(); 69 | 70 | const serie = result[req.params.id]; 71 | const genreId = serie.genre_id; 72 | const genreName = genres[genreId]?.name; 73 | serie["id"] = req.params.id; 74 | serie["genre_name"] = genreName; 75 | console.log(serie); 76 | res.send(serie); 77 | }; 78 | 79 | const remove = async (req, res) => { 80 | const db = await low(adapter); 81 | const serie = await db.get("series").unset(req.params.id).write(); 82 | if (serie.length === 0) { 83 | res.status(401); 84 | res.send({ error: true }); 85 | } else { 86 | res.send({ success: true }); 87 | } 88 | }; 89 | 90 | const update = async (req, res) => { 91 | const db = await low(adapter); 92 | const updatedSerie = req.body; 93 | 94 | const result = db.get("series").value(); 95 | const images = await getSerieImage(updatedSerie.name); 96 | 97 | const serieToUpdate = { 98 | name: updatedSerie.name, 99 | status: updatedSerie.status, 100 | genre_id: parseInt(updatedSerie.genre_id), 101 | comments: updatedSerie.comments, 102 | poster: images.poster, 103 | background: images.background, 104 | }; 105 | 106 | result[req.params.id] = serieToUpdate; 107 | db.get("series").push(result).last().write(); 108 | res.send(serieToUpdate); 109 | }; 110 | 111 | module.exports = { get, getOne, remove, create, update }; 112 | -------------------------------------------------------------------------------- /db.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | const express = require("express"); 3 | const bodyParser = require("body-parser"); 4 | const low = require("lowdb"); 5 | const FileSync = require("lowdb/adapters/FileSync"); 6 | const app = express(); 7 | 8 | const routes = require("./routes"); 9 | 10 | const port = process.env.PORT || 3002; 11 | 12 | app.use(bodyParser.json({ extended: true })); 13 | app.use("/api", routes); 14 | 15 | const adapter = new FileSync("db.json"); 16 | const db = low(adapter); 17 | 18 | const defaultSerie = { 19 | 1: { 20 | name: "La casa de papel", 21 | status: "WATCHED", 22 | genre_id: 1, 23 | comments: "", 24 | poster: "//image.tmdb.org/t/p/original/yVUAfbrP5HDJugXraB7KQS0yz6Z.jpg", 25 | background: "//image.tmdb.org/t/p/original/piuRhGiQBYWgW668eSNJ2ug5uAO.jpg", 26 | }, 27 | }; 28 | const defaultGenre = { 29 | 1: { name: "Ação" }, 30 | 2: { name: "Comédia" }, 31 | }; 32 | db.defaults({ 33 | series: defaultSerie, 34 | genres: defaultGenre, 35 | count: 0, 36 | }).write(); 37 | 38 | app.get("/", (req, res) => 39 | res.send({ 40 | info: "Minhas Séries Server", 41 | datetime: new Date(), 42 | }) 43 | ); 44 | 45 | app 46 | .listen(port, () => { 47 | console.log("Minhas Séries server running on port", port); 48 | }) 49 | .on("error", (err) => { 50 | console.log("Error running Minhas Séries server"); 51 | console.log(err); 52 | }); 53 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minhas-series-server", 3 | "version": "2.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.7", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 11 | "requires": { 12 | "mime-types": "~2.1.24", 13 | "negotiator": "0.6.2" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 20 | }, 21 | "axios": { 22 | "version": "0.21.1", 23 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", 24 | "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", 25 | "requires": { 26 | "follow-redirects": "^1.10.0" 27 | } 28 | }, 29 | "body-parser": { 30 | "version": "1.19.0", 31 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 32 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 33 | "requires": { 34 | "bytes": "3.1.0", 35 | "content-type": "~1.0.4", 36 | "debug": "2.6.9", 37 | "depd": "~1.1.2", 38 | "http-errors": "1.7.2", 39 | "iconv-lite": "0.4.24", 40 | "on-finished": "~2.3.0", 41 | "qs": "6.7.0", 42 | "raw-body": "2.4.0", 43 | "type-is": "~1.6.17" 44 | } 45 | }, 46 | "bytes": { 47 | "version": "3.1.0", 48 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 49 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 50 | }, 51 | "content-disposition": { 52 | "version": "0.5.3", 53 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 54 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 55 | "requires": { 56 | "safe-buffer": "5.1.2" 57 | } 58 | }, 59 | "content-type": { 60 | "version": "1.0.4", 61 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 62 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 63 | }, 64 | "cookie": { 65 | "version": "0.4.0", 66 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 67 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 68 | }, 69 | "cookie-signature": { 70 | "version": "1.0.6", 71 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 72 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 73 | }, 74 | "debug": { 75 | "version": "2.6.9", 76 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 77 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 78 | "requires": { 79 | "ms": "2.0.0" 80 | } 81 | }, 82 | "depd": { 83 | "version": "1.1.2", 84 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 85 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 86 | }, 87 | "destroy": { 88 | "version": "1.0.4", 89 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 90 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 91 | }, 92 | "dotenv": { 93 | "version": "8.2.0", 94 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 95 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 96 | }, 97 | "ee-first": { 98 | "version": "1.1.1", 99 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 100 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 101 | }, 102 | "encodeurl": { 103 | "version": "1.0.2", 104 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 105 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 106 | }, 107 | "escape-html": { 108 | "version": "1.0.3", 109 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 110 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 111 | }, 112 | "etag": { 113 | "version": "1.8.1", 114 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 115 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 116 | }, 117 | "express": { 118 | "version": "4.17.1", 119 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 120 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 121 | "requires": { 122 | "accepts": "~1.3.7", 123 | "array-flatten": "1.1.1", 124 | "body-parser": "1.19.0", 125 | "content-disposition": "0.5.3", 126 | "content-type": "~1.0.4", 127 | "cookie": "0.4.0", 128 | "cookie-signature": "1.0.6", 129 | "debug": "2.6.9", 130 | "depd": "~1.1.2", 131 | "encodeurl": "~1.0.2", 132 | "escape-html": "~1.0.3", 133 | "etag": "~1.8.1", 134 | "finalhandler": "~1.1.2", 135 | "fresh": "0.5.2", 136 | "merge-descriptors": "1.0.1", 137 | "methods": "~1.1.2", 138 | "on-finished": "~2.3.0", 139 | "parseurl": "~1.3.3", 140 | "path-to-regexp": "0.1.7", 141 | "proxy-addr": "~2.0.5", 142 | "qs": "6.7.0", 143 | "range-parser": "~1.2.1", 144 | "safe-buffer": "5.1.2", 145 | "send": "0.17.1", 146 | "serve-static": "1.14.1", 147 | "setprototypeof": "1.1.1", 148 | "statuses": "~1.5.0", 149 | "type-is": "~1.6.18", 150 | "utils-merge": "1.0.1", 151 | "vary": "~1.1.2" 152 | } 153 | }, 154 | "finalhandler": { 155 | "version": "1.1.2", 156 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 157 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 158 | "requires": { 159 | "debug": "2.6.9", 160 | "encodeurl": "~1.0.2", 161 | "escape-html": "~1.0.3", 162 | "on-finished": "~2.3.0", 163 | "parseurl": "~1.3.3", 164 | "statuses": "~1.5.0", 165 | "unpipe": "~1.0.0" 166 | } 167 | }, 168 | "follow-redirects": { 169 | "version": "1.13.1", 170 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", 171 | "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" 172 | }, 173 | "forwarded": { 174 | "version": "0.1.2", 175 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 176 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 177 | }, 178 | "fresh": { 179 | "version": "0.5.2", 180 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 181 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 182 | }, 183 | "graceful-fs": { 184 | "version": "4.2.4", 185 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 186 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 187 | }, 188 | "http-errors": { 189 | "version": "1.7.2", 190 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 191 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 192 | "requires": { 193 | "depd": "~1.1.2", 194 | "inherits": "2.0.3", 195 | "setprototypeof": "1.1.1", 196 | "statuses": ">= 1.5.0 < 2", 197 | "toidentifier": "1.0.0" 198 | } 199 | }, 200 | "iconv-lite": { 201 | "version": "0.4.24", 202 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 203 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 204 | "requires": { 205 | "safer-buffer": ">= 2.1.2 < 3" 206 | } 207 | }, 208 | "inherits": { 209 | "version": "2.0.3", 210 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 211 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 212 | }, 213 | "ipaddr.js": { 214 | "version": "1.9.1", 215 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 216 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 217 | }, 218 | "is-promise": { 219 | "version": "2.2.2", 220 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", 221 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" 222 | }, 223 | "lodash": { 224 | "version": "4.17.20", 225 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 226 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 227 | }, 228 | "lowdb": { 229 | "version": "1.0.0", 230 | "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", 231 | "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", 232 | "requires": { 233 | "graceful-fs": "^4.1.3", 234 | "is-promise": "^2.1.0", 235 | "lodash": "4", 236 | "pify": "^3.0.0", 237 | "steno": "^0.4.1" 238 | } 239 | }, 240 | "media-typer": { 241 | "version": "0.3.0", 242 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 243 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 244 | }, 245 | "merge-descriptors": { 246 | "version": "1.0.1", 247 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 248 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 249 | }, 250 | "methods": { 251 | "version": "1.1.2", 252 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 253 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 254 | }, 255 | "mime": { 256 | "version": "1.6.0", 257 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 258 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 259 | }, 260 | "mime-db": { 261 | "version": "1.45.0", 262 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", 263 | "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" 264 | }, 265 | "mime-types": { 266 | "version": "2.1.28", 267 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", 268 | "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", 269 | "requires": { 270 | "mime-db": "1.45.0" 271 | } 272 | }, 273 | "ms": { 274 | "version": "2.0.0", 275 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 276 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 277 | }, 278 | "negotiator": { 279 | "version": "0.6.2", 280 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 281 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 282 | }, 283 | "on-finished": { 284 | "version": "2.3.0", 285 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 286 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 287 | "requires": { 288 | "ee-first": "1.1.1" 289 | } 290 | }, 291 | "parseurl": { 292 | "version": "1.3.3", 293 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 294 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 295 | }, 296 | "path-to-regexp": { 297 | "version": "0.1.7", 298 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 299 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 300 | }, 301 | "pify": { 302 | "version": "3.0.0", 303 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 304 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 305 | }, 306 | "proxy-addr": { 307 | "version": "2.0.6", 308 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 309 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 310 | "requires": { 311 | "forwarded": "~0.1.2", 312 | "ipaddr.js": "1.9.1" 313 | } 314 | }, 315 | "qs": { 316 | "version": "6.7.0", 317 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 318 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 319 | }, 320 | "range-parser": { 321 | "version": "1.2.1", 322 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 323 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 324 | }, 325 | "raw-body": { 326 | "version": "2.4.0", 327 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 328 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 329 | "requires": { 330 | "bytes": "3.1.0", 331 | "http-errors": "1.7.2", 332 | "iconv-lite": "0.4.24", 333 | "unpipe": "1.0.0" 334 | } 335 | }, 336 | "safe-buffer": { 337 | "version": "5.1.2", 338 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 339 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 340 | }, 341 | "safer-buffer": { 342 | "version": "2.1.2", 343 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 344 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 345 | }, 346 | "send": { 347 | "version": "0.17.1", 348 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 349 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 350 | "requires": { 351 | "debug": "2.6.9", 352 | "depd": "~1.1.2", 353 | "destroy": "~1.0.4", 354 | "encodeurl": "~1.0.2", 355 | "escape-html": "~1.0.3", 356 | "etag": "~1.8.1", 357 | "fresh": "0.5.2", 358 | "http-errors": "~1.7.2", 359 | "mime": "1.6.0", 360 | "ms": "2.1.1", 361 | "on-finished": "~2.3.0", 362 | "range-parser": "~1.2.1", 363 | "statuses": "~1.5.0" 364 | }, 365 | "dependencies": { 366 | "ms": { 367 | "version": "2.1.1", 368 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 369 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 370 | } 371 | } 372 | }, 373 | "serve-static": { 374 | "version": "1.14.1", 375 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 376 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 377 | "requires": { 378 | "encodeurl": "~1.0.2", 379 | "escape-html": "~1.0.3", 380 | "parseurl": "~1.3.3", 381 | "send": "0.17.1" 382 | } 383 | }, 384 | "setprototypeof": { 385 | "version": "1.1.1", 386 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 387 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 388 | }, 389 | "statuses": { 390 | "version": "1.5.0", 391 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 392 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 393 | }, 394 | "steno": { 395 | "version": "0.4.4", 396 | "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", 397 | "integrity": "sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=", 398 | "requires": { 399 | "graceful-fs": "^4.1.3" 400 | } 401 | }, 402 | "toidentifier": { 403 | "version": "1.0.0", 404 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 405 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 406 | }, 407 | "type-is": { 408 | "version": "1.6.18", 409 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 410 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 411 | "requires": { 412 | "media-typer": "0.3.0", 413 | "mime-types": "~2.1.24" 414 | } 415 | }, 416 | "unpipe": { 417 | "version": "1.0.0", 418 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 419 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 420 | }, 421 | "utils-merge": { 422 | "version": "1.0.1", 423 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 424 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 425 | }, 426 | "vary": { 427 | "version": "1.1.2", 428 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 429 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 430 | } 431 | } 432 | } 433 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minhas-series-server", 3 | "version": "2.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "dependencies": { 7 | "axios": "^0.21.1", 8 | "body-parser": "^1.19.0", 9 | "dotenv": "^8.2.0", 10 | "express": "^4.17.1", 11 | "lowdb": "^1.0.0" 12 | }, 13 | "devDependencies": {}, 14 | "scripts": { 15 | "start": "node index.js" 16 | }, 17 | "keywords": [], 18 | "author": "Tulio Faria", 19 | "license": "MIT" 20 | } 21 | -------------------------------------------------------------------------------- /routes/genres.js: -------------------------------------------------------------------------------- 1 | const router = require("express").Router(); 2 | 3 | const controller = require("../controllers/genres"); 4 | 5 | router.get("/:id", controller.getOne); 6 | router.get("/", controller.get); 7 | router.post("/", controller.create); 8 | router.put("/:id", controller.update); 9 | router.delete("/:id", controller.remove); 10 | 11 | module.exports = router; 12 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | const router = require("express").Router(); 2 | 3 | const series = require("./series"); 4 | const genres = require("./genres"); 5 | 6 | router.get("/", (req, res) => 7 | res.send({ 8 | info: "Minhas Séries Server", 9 | datetime: new Date(), 10 | }) 11 | ); 12 | router.use("/series", series); 13 | router.use("/genres", genres); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /routes/series.js: -------------------------------------------------------------------------------- 1 | const router = require("express").Router(); 2 | 3 | const controller = require("../controllers/series"); 4 | 5 | router.get("/", controller.get); 6 | router.get("/:id", controller.getOne); 7 | router.post("/", controller.create); 8 | router.put("/:id", controller.update); 9 | router.delete("/:id", controller.remove); 10 | 11 | module.exports = router; 12 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.7: 6 | version "1.3.7" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 8 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 9 | dependencies: 10 | mime-types "~2.1.24" 11 | negotiator "0.6.2" 12 | 13 | array-flatten@1.1.1: 14 | version "1.1.1" 15 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 16 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 17 | 18 | axios@^0.19.0: 19 | version "0.19.2" 20 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" 21 | integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== 22 | dependencies: 23 | follow-redirects "1.5.10" 24 | 25 | body-parser@1.19.0, body-parser@^1.19.0: 26 | version "1.19.0" 27 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 28 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 29 | dependencies: 30 | bytes "3.1.0" 31 | content-type "~1.0.4" 32 | debug "2.6.9" 33 | depd "~1.1.2" 34 | http-errors "1.7.2" 35 | iconv-lite "0.4.24" 36 | on-finished "~2.3.0" 37 | qs "6.7.0" 38 | raw-body "2.4.0" 39 | type-is "~1.6.17" 40 | 41 | bytes@3.1.0: 42 | version "3.1.0" 43 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 44 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 45 | 46 | content-disposition@0.5.3: 47 | version "0.5.3" 48 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 49 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 50 | dependencies: 51 | safe-buffer "5.1.2" 52 | 53 | content-type@~1.0.4: 54 | version "1.0.4" 55 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 56 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 57 | 58 | cookie-signature@1.0.6: 59 | version "1.0.6" 60 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 61 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 62 | 63 | cookie@0.4.0: 64 | version "0.4.0" 65 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 66 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 67 | 68 | debug@2.6.9: 69 | version "2.6.9" 70 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 71 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 72 | dependencies: 73 | ms "2.0.0" 74 | 75 | debug@=3.1.0: 76 | version "3.1.0" 77 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 78 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 79 | dependencies: 80 | ms "2.0.0" 81 | 82 | depd@~1.1.2: 83 | version "1.1.2" 84 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 85 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 86 | 87 | destroy@~1.0.4: 88 | version "1.0.4" 89 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 90 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 91 | 92 | dotenv@^8.2.0: 93 | version "8.2.0" 94 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" 95 | integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== 96 | 97 | ee-first@1.1.1: 98 | version "1.1.1" 99 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 100 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 101 | 102 | encodeurl@~1.0.2: 103 | version "1.0.2" 104 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 105 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 106 | 107 | escape-html@~1.0.3: 108 | version "1.0.3" 109 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 110 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 111 | 112 | etag@~1.8.1: 113 | version "1.8.1" 114 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 115 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 116 | 117 | express@^4.17.1: 118 | version "4.17.1" 119 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 120 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 121 | dependencies: 122 | accepts "~1.3.7" 123 | array-flatten "1.1.1" 124 | body-parser "1.19.0" 125 | content-disposition "0.5.3" 126 | content-type "~1.0.4" 127 | cookie "0.4.0" 128 | cookie-signature "1.0.6" 129 | debug "2.6.9" 130 | depd "~1.1.2" 131 | encodeurl "~1.0.2" 132 | escape-html "~1.0.3" 133 | etag "~1.8.1" 134 | finalhandler "~1.1.2" 135 | fresh "0.5.2" 136 | merge-descriptors "1.0.1" 137 | methods "~1.1.2" 138 | on-finished "~2.3.0" 139 | parseurl "~1.3.3" 140 | path-to-regexp "0.1.7" 141 | proxy-addr "~2.0.5" 142 | qs "6.7.0" 143 | range-parser "~1.2.1" 144 | safe-buffer "5.1.2" 145 | send "0.17.1" 146 | serve-static "1.14.1" 147 | setprototypeof "1.1.1" 148 | statuses "~1.5.0" 149 | type-is "~1.6.18" 150 | utils-merge "1.0.1" 151 | vary "~1.1.2" 152 | 153 | finalhandler@~1.1.2: 154 | version "1.1.2" 155 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 156 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 157 | dependencies: 158 | debug "2.6.9" 159 | encodeurl "~1.0.2" 160 | escape-html "~1.0.3" 161 | on-finished "~2.3.0" 162 | parseurl "~1.3.3" 163 | statuses "~1.5.0" 164 | unpipe "~1.0.0" 165 | 166 | follow-redirects@1.5.10: 167 | version "1.5.10" 168 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" 169 | integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== 170 | dependencies: 171 | debug "=3.1.0" 172 | 173 | forwarded@~0.1.2: 174 | version "0.1.2" 175 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 176 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 177 | 178 | fresh@0.5.2: 179 | version "0.5.2" 180 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 181 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 182 | 183 | graceful-fs@^4.1.3: 184 | version "4.2.4" 185 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 186 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 187 | 188 | http-errors@1.7.2: 189 | version "1.7.2" 190 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 191 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 192 | dependencies: 193 | depd "~1.1.2" 194 | inherits "2.0.3" 195 | setprototypeof "1.1.1" 196 | statuses ">= 1.5.0 < 2" 197 | toidentifier "1.0.0" 198 | 199 | http-errors@~1.7.2: 200 | version "1.7.3" 201 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 202 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 203 | dependencies: 204 | depd "~1.1.2" 205 | inherits "2.0.4" 206 | setprototypeof "1.1.1" 207 | statuses ">= 1.5.0 < 2" 208 | toidentifier "1.0.0" 209 | 210 | iconv-lite@0.4.24: 211 | version "0.4.24" 212 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 213 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 214 | dependencies: 215 | safer-buffer ">= 2.1.2 < 3" 216 | 217 | inherits@2.0.3: 218 | version "2.0.3" 219 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 220 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 221 | 222 | inherits@2.0.4: 223 | version "2.0.4" 224 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 225 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 226 | 227 | ipaddr.js@1.9.1: 228 | version "1.9.1" 229 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 230 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 231 | 232 | is-promise@^2.1.0: 233 | version "2.2.2" 234 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" 235 | integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== 236 | 237 | lodash@4: 238 | version "4.17.20" 239 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 240 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 241 | 242 | lowdb@^1.0.0: 243 | version "1.0.0" 244 | resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064" 245 | integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ== 246 | dependencies: 247 | graceful-fs "^4.1.3" 248 | is-promise "^2.1.0" 249 | lodash "4" 250 | pify "^3.0.0" 251 | steno "^0.4.1" 252 | 253 | media-typer@0.3.0: 254 | version "0.3.0" 255 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 256 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 257 | 258 | merge-descriptors@1.0.1: 259 | version "1.0.1" 260 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 261 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 262 | 263 | methods@~1.1.2: 264 | version "1.1.2" 265 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 266 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 267 | 268 | mime-db@1.45.0: 269 | version "1.45.0" 270 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" 271 | integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== 272 | 273 | mime-types@~2.1.24: 274 | version "2.1.28" 275 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" 276 | integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== 277 | dependencies: 278 | mime-db "1.45.0" 279 | 280 | mime@1.6.0: 281 | version "1.6.0" 282 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 283 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 284 | 285 | ms@2.0.0: 286 | version "2.0.0" 287 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 288 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 289 | 290 | ms@2.1.1: 291 | version "2.1.1" 292 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 293 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 294 | 295 | negotiator@0.6.2: 296 | version "0.6.2" 297 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 298 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 299 | 300 | on-finished@~2.3.0: 301 | version "2.3.0" 302 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 303 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 304 | dependencies: 305 | ee-first "1.1.1" 306 | 307 | parseurl@~1.3.3: 308 | version "1.3.3" 309 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 310 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 311 | 312 | path-to-regexp@0.1.7: 313 | version "0.1.7" 314 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 315 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 316 | 317 | pify@^3.0.0: 318 | version "3.0.0" 319 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 320 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 321 | 322 | proxy-addr@~2.0.5: 323 | version "2.0.6" 324 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 325 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 326 | dependencies: 327 | forwarded "~0.1.2" 328 | ipaddr.js "1.9.1" 329 | 330 | qs@6.7.0: 331 | version "6.7.0" 332 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 333 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 334 | 335 | range-parser@~1.2.1: 336 | version "1.2.1" 337 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 338 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 339 | 340 | raw-body@2.4.0: 341 | version "2.4.0" 342 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 343 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 344 | dependencies: 345 | bytes "3.1.0" 346 | http-errors "1.7.2" 347 | iconv-lite "0.4.24" 348 | unpipe "1.0.0" 349 | 350 | safe-buffer@5.1.2: 351 | version "5.1.2" 352 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 353 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 354 | 355 | "safer-buffer@>= 2.1.2 < 3": 356 | version "2.1.2" 357 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 358 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 359 | 360 | send@0.17.1: 361 | version "0.17.1" 362 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 363 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 364 | dependencies: 365 | debug "2.6.9" 366 | depd "~1.1.2" 367 | destroy "~1.0.4" 368 | encodeurl "~1.0.2" 369 | escape-html "~1.0.3" 370 | etag "~1.8.1" 371 | fresh "0.5.2" 372 | http-errors "~1.7.2" 373 | mime "1.6.0" 374 | ms "2.1.1" 375 | on-finished "~2.3.0" 376 | range-parser "~1.2.1" 377 | statuses "~1.5.0" 378 | 379 | serve-static@1.14.1: 380 | version "1.14.1" 381 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 382 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 383 | dependencies: 384 | encodeurl "~1.0.2" 385 | escape-html "~1.0.3" 386 | parseurl "~1.3.3" 387 | send "0.17.1" 388 | 389 | setprototypeof@1.1.1: 390 | version "1.1.1" 391 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 392 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 393 | 394 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 395 | version "1.5.0" 396 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 397 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 398 | 399 | steno@^0.4.1: 400 | version "0.4.4" 401 | resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb" 402 | integrity sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs= 403 | dependencies: 404 | graceful-fs "^4.1.3" 405 | 406 | toidentifier@1.0.0: 407 | version "1.0.0" 408 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 409 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 410 | 411 | type-is@~1.6.17, type-is@~1.6.18: 412 | version "1.6.18" 413 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 414 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 415 | dependencies: 416 | media-typer "0.3.0" 417 | mime-types "~2.1.24" 418 | 419 | unpipe@1.0.0, unpipe@~1.0.0: 420 | version "1.0.0" 421 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 422 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 423 | 424 | utils-merge@1.0.1: 425 | version "1.0.1" 426 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 427 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 428 | 429 | vary@~1.1.2: 430 | version "1.1.2" 431 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 432 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 433 | --------------------------------------------------------------------------------