From 7ddaefcb28c0d737efb849380ab9fb67a9185b00 Mon Sep 17 00:00:00 2001 From: DanielRamirezGe Date: Tue, 11 Aug 2020 12:40:56 -0500 Subject: [PATCH] cracion de api y funciones d ecarga masiva --- .gitignore | 2 + app.js | 15 + conf/connection.js | 14 + package-lock.json | 585 +++++++++++++++++++++++++++++++++++ package.json | 23 ++ routes/cargaLibro.js | 112 +++++++ routes/detalleLibro.js | 49 +++ routes/imagenLibro/libro.jpg | Bin 0 -> 24018 bytes routes/index.js | 10 + routes/libroImagen.js | 51 +++ routes/libroNovedades.js | 42 +++ routes/libroSimilar.js | 47 +++ sql/scrpt.sql | 63 ++++ 13 files changed, 1013 insertions(+) create mode 100644 .gitignore create mode 100644 app.js create mode 100644 conf/connection.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 routes/cargaLibro.js create mode 100644 routes/detalleLibro.js create mode 100644 routes/imagenLibro/libro.jpg create mode 100644 routes/index.js create mode 100644 routes/libroImagen.js create mode 100644 routes/libroNovedades.js create mode 100644 routes/libroSimilar.js create mode 100644 sql/scrpt.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b31034 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +.env \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..365cfd5 --- /dev/null +++ b/app.js @@ -0,0 +1,15 @@ +var express = require('express'); +var app = express(); +var cors = require('cors'); +app.get('/', function(req, res) { + res.send('Hello World!'); +}); +require('dotenv').config() +app.use(cors()); + +app.use(express.json()) // for parsing application/json +app.use(express.urlencoded({ extended: true })) +app.use(require('./routes/index.js')) +app.listen(process.env.PORT, function() { + console.log('Example app listening on port ' + process.env.PORT + '!'); +}); diff --git a/conf/connection.js b/conf/connection.js new file mode 100644 index 0000000..6cb0c0a --- /dev/null +++ b/conf/connection.js @@ -0,0 +1,14 @@ +var mysql = require('mysql'); +var connection = mysql.createConnection({ +// HOSTDB = 'localhost' +// USERDB = 'root' +// PASSDB = 'georgechido' +// DB = 'Portal' + host: process.env.HOSTDB || 'localhost', + user: process.env.USERDB || 'root', + password: process.env.PASSDB || 'georgechido', + database: process.env.DB || 'Portal' +}); + + +module.exports = connection; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2dc440d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,585 @@ +{ + "name": "portalapi", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "adler-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", + "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "busboy": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", + "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "requires": { + "dicer": "0.3.0" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cfb": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz", + "integrity": "sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ==", + "requires": { + "adler-32": "~1.2.0", + "crc-32": "~1.2.0", + "printj": "~1.1.2" + } + }, + "codepage": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", + "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", + "requires": { + "commander": "~2.14.1", + "exit-on-epipe": "~1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" + } + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "connect-busboy": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/connect-busboy/-/connect-busboy-0.0.2.tgz", + "integrity": "sha1-rFyclmchcYheV2xmsr/ZXTuxEJc=", + "requires": { + "busboy": "*" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "requires": { + "streamsearch": "0.1.2" + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "requires": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "node-xlsx": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.15.0.tgz", + "integrity": "sha512-rQyhWDJ/k60wQemov7a8MlToastWTidrAVFRwTWV+s53LN/SRwU4lnmc5xuFXx/ay+uaLAsAQBp6BkVob5OjOA==", + "requires": { + "buffer-from": "^1.1.0", + "xlsx": "^0.14.1" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, + "ssf": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.3.tgz", + "integrity": "sha512-pRuUdW0WwyB2doSqqjWyzwCD6PkfxpHAHdZp39K3dp/Hq7f+xfMwNAWIi16DyrRg4gg9c/RvLYkJTSawTPTm1w==", + "requires": { + "frac": "~1.1.2" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "xlsx": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.14.5.tgz", + "integrity": "sha512-s/5f4/mjeWREmIWZ+HtDfh/rnz51ar+dZ4LWKZU3u9VBx2zLdSIWTdXgoa52/pnZ9Oe/Vu1W1qzcKzLVe+lq4w==", + "requires": { + "adler-32": "~1.2.0", + "cfb": "^1.1.2", + "codepage": "~1.14.0", + "commander": "~2.17.1", + "crc-32": "~1.2.0", + "exit-on-epipe": "~1.0.1", + "ssf": "~0.10.2" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6ef9d00 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "portalapi", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://repositorio.acatlan.unam.mx/danielGe/PortalApi.git" + }, + "author": "George", + "license": "ISC", + "dependencies": { + "connect-busboy": "0.0.2", + "cors": "^2.8.5", + "dotenv": "^8.2.0", + "express": "^4.17.1", + "mysql": "^2.18.1", + "node-xlsx": "^0.15.0" + } +} diff --git a/routes/cargaLibro.js b/routes/cargaLibro.js new file mode 100644 index 0000000..4ea8813 --- /dev/null +++ b/routes/cargaLibro.js @@ -0,0 +1,112 @@ + +const connection = require('../conf/connection.js'); +const express = require('express') +var app = express(); +var xlsx = require('node-xlsx'); +var fs = require('fs'); +var busboy = require('connect-busboy'); +var path = require('path'); + +app.use(busboy()); + +function query(consulta) { + return new Promise(function(resolve, reject) { + connection.query(`${consulta}`, (error, results, files) => { + if (error) reject(error); + resolve(results); + }); + }) +} + + +function corregir(cad){ + + var recor = String.fromCharCode(13); + cad = cad.split(recor); + let nuevocad=""; + for(let i=0; i { + + var fstream; + console.log(`Entro`); + req.pipe(req.busboy); + req.busboy.on('file',async function (fieldname, file, filename) { + console.log("Uploading: " + filename); + let saveTo = path.join('.', `/routes/ArchivosCarga/cargaLibro.xlsx`); + console.log('Uploading: ' + saveTo); + file.pipe(fs.createWriteStream(saveTo)); + await readExecel(`cargaLibro.xlsx`); + res.status(200).json({error: false, msj: `Se inserto con exito`}); + }); + + +}); +// + +module.exports = app; + + + diff --git a/routes/detalleLibro.js b/routes/detalleLibro.js new file mode 100644 index 0000000..9e13643 --- /dev/null +++ b/routes/detalleLibro.js @@ -0,0 +1,49 @@ +const connection = require('../conf/connection.js'); +const express = require('express') +var app = express(); +var xlsx = require('node-xlsx'); +var fs = require('fs'); +var busboy = require('connect-busboy'); +var path = require('path'); +const { type } = require('os'); + + +function query(consulta) { + return new Promise(function(resolve, reject) { + connection.query(`${consulta}`, (error, results, files) => { + if (error) reject(error); + resolve(results); + }); + }) +} + + +app.get('/libroDetalle', async(req, res) => { + + let data = req.query; + if( typeof( data.idLibro ) === 'undefined' ){ + res.status(400).json({error: true, msj: 'Falta el ID del libro como parametro'}); + return; + } + console.log(` Este es el id: ${data.idLibro}`); + let sqlString = `SELECT * from Libro where idLibro=${data.idLibro}`; + console.log(` Esta es la cadena : ${sqlString}`); + let respuestaSql = await query(sqlString); + + respuestaSql = respuestaSql[0]; + + if(respuestaSql.length === 0 ){ + res.status(400).json({error: true, msj: 'No se encontro el libro solicitado'}); + return; + } + + try{ + res.status(200).json({error:false, msj: 'exito', data: respuestaSql}) + } + catch(error){ + res.status(400).json({error: true, msj: 'No se pudo obtener la imagen', desc: error}); + return; + } + +}); +module.exports = app diff --git a/routes/imagenLibro/libro.jpg b/routes/imagenLibro/libro.jpg new file mode 100644 index 0000000000000000000000000000000000000000..868352402066f61e4394102b7706e6286bb8806f GIT binary patch literal 24018 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

oRj!AB0I~8_B&8mi;(7Xs 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 BZh-&* literal 0 HcmV?d00001 diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..5d28ded --- /dev/null +++ b/routes/index.js @@ -0,0 +1,10 @@ +var express = require('express') +var app = express() + +app.use(require('./cargaLibro')); +app.use(require('./libroImagen')); +app.use(require('./detalleLibro')); +app.use(require('./libroNovedades')); +app.use(require('./libroSimilar')); + +module.exports = app; \ No newline at end of file diff --git a/routes/libroImagen.js b/routes/libroImagen.js new file mode 100644 index 0000000..5be7378 --- /dev/null +++ b/routes/libroImagen.js @@ -0,0 +1,51 @@ +const connection = require('../conf/connection.js'); +const express = require('express') +var app = express(); +var xlsx = require('node-xlsx'); +var fs = require('fs'); +var busboy = require('connect-busboy'); +var path = require('path'); +const { type } = require('os'); + + +function query(consulta) { + return new Promise(function(resolve, reject) { + connection.query(`${consulta}`, (error, results, files) => { + if (error) reject(error); + resolve(results); + }); + }) +} + + +app.get('/libroImagen', async(req, res) => { + + let data = req.query; + if( typeof( data.idLibro ) === 'undefined' ){ + res.status(400).json({error: true, msj: 'Falta el ID del libro como parametro'}); + return; + } + console.log(` Este es el id: ${data.idLibro}`); + let sqlString = `SELECT * from Imagen where idLibro=${data.idLibro}`; + console.log(` Esta es la cadena : ${sqlString}`); + let respuestaSql = await query(sqlString); + if(respuestaSql.length === 0 ){ + res.status(400).json({error: true, msj: 'No se encontro el libro solicitado'}); + return; + } + + try{ + + respuestaSql = respuestaSql[0]; + let img = fs.readFileSync(path.join('.', `/routes/imagenLibro/libro.jpg`)); + res.writeHead(200, {'Content-Type': 'image/jpg' }); + res.end(img, 'binary') + return; + } + catch(error){ + res.status(400).json({error: true, msj: 'No se pudo obtener la imagen', desc: error}); + return; + } + +}); +module.exports = app diff --git a/routes/libroNovedades.js b/routes/libroNovedades.js new file mode 100644 index 0000000..f6aa598 --- /dev/null +++ b/routes/libroNovedades.js @@ -0,0 +1,42 @@ +const connection = require('../conf/connection.js'); +const express = require('express') +var app = express(); +var xlsx = require('node-xlsx'); +var fs = require('fs'); +var busboy = require('connect-busboy'); +var path = require('path'); +const { type } = require('os'); + + +function query(consulta) { + return new Promise(function(resolve, reject) { + connection.query(`${consulta}`, (error, results, files) => { + if (error) reject(error); + resolve(results); + }); + }) +} + + +app.get('/librosNovedades', async(req, res) => { + + + let sqlString = `SELECT * FROM Libro ORDER BY year DESC LIMIT 10;`; + console.log(` Esta es la cadena : ${sqlString}`); + let respuestaSql = await query(sqlString); + + if(respuestaSql.length === 0 ){ + res.status(400).json({error: true, msj: 'No se pudo hacer la consulta'}); + return; + } + + try{ + res.status(200).json({error:false, msj: 'exito', data: respuestaSql}) + } + catch(error){ + res.status(400).json({error: true, msj: 'No se pudo obtener la imagen', desc: error}); + return; + } + +}); +module.exports = app diff --git a/routes/libroSimilar.js b/routes/libroSimilar.js new file mode 100644 index 0000000..e352e8a --- /dev/null +++ b/routes/libroSimilar.js @@ -0,0 +1,47 @@ +const connection = require('../conf/connection.js'); +const express = require('express') +var app = express(); +var xlsx = require('node-xlsx'); +var fs = require('fs'); +var busboy = require('connect-busboy'); +var path = require('path'); +const { type } = require('os'); + + +function query(consulta) { + return new Promise(function(resolve, reject) { + connection.query(`${consulta}`, (error, results, files) => { + if (error) reject(error); + resolve(results); + }); + }) +} + + +app.get('/librosSimilares', async(req, res) => { + + + let data = req.query; + if( typeof( data.categoria ) === 'undefined' ){ + res.status(400).json({error: true, msj: 'Falta la categoria del libro como parametro'}); + return; + } + let sqlString = `SELECT * FROM Libro WHERE categoria=${data.categoria} LIMIT 3;`; + console.log(` Esta es la cadena : ${sqlString}`); + let respuestaSql = await query(sqlString); + + if(respuestaSql.length === 0 ){ + res.status(400).json({error: true, msj: 'No se pudo hacer la consulta'}); + return; + } + + try{ + res.status(200).json({error:false, msj: 'exito', data: respuestaSql}) + } + catch(error){ + res.status(400).json({error: true, msj: 'No se pudo obtener la imagen', desc: error}); + return; + } + +}); +module.exports = app diff --git a/sql/scrpt.sql b/sql/scrpt.sql new file mode 100644 index 0000000..6904d59 --- /dev/null +++ b/sql/scrpt.sql @@ -0,0 +1,63 @@ +DROP DATABASE Portal; +CREATE DATABASE Portal; +USE Portal; + +CREATE TABLE `Libro` ( + `idLibro` integer PRIMARY KEY NOT NULL AUTO_INCREMENT, + `isbn` varchar(100), + `titulo` varchar(250), + `categoria` varchar(100), + `autor` varchar(100), + `paginas` integer, + `impresion` varchar(150), + `precio` varchar(100), + `version` varchar(100), + `descripcion` text, + `year` integer +); + +CREATE TABLE `PdfLibro` ( + `idPdf` integer PRIMARY KEY NOT NULL AUTO_INCREMENT, + `idLibro`integer, + `ruta` varchar(250) +); + +CREATE TABLE `Imagen` ( + `idImagen` integer PRIMARY KEY NOT NULL AUTO_INCREMENT, + `idLibro`integer, + `ruta` varchar(250) +); + +CREATE TABLE `Visualizacion` ( + `idVisualizacion` integer PRIMARY KEY NOT NULL AUTO_INCREMENT, + `idLibro`integer, + `ruta` varchar(250) +); + +CREATE TABLE `Video` ( + `idVideo` integer PRIMARY KEY NOT NULL AUTO_INCREMENT, + `idLibro`integer, + `ruta` varchar(250) +); + +CREATE TABLE `Compra` ( + `idCompra` integer PRIMARY KEY NOT NULL AUTO_INCREMENT, + `idLibro`integer, + `ruta` varchar(250) +); + +CREATE TABLE `Admin` ( + `idAdmin` integer PRIMARY KEY NOT NULL AUTO_INCREMENT, + `usuario` varchar(100), + `password` varchar(350) +); + +ALTER TABLE `Imagen` ADD FOREIGN KEY (`idLibro`) REFERENCES `Libro` (`idLibro`); + +ALTER TABLE `Visualizacion` ADD FOREIGN KEY (`idLibro`) REFERENCES `Libro` (`idLibro`); + +ALTER TABLE `Compra` ADD FOREIGN KEY (`idLibro`) REFERENCES `Libro` (`idLibro`); + +ALTER TABLE `Video` ADD FOREIGN KEY (`idLibro`) REFERENCES `Libro` (`idLibro`); + +ALTER TABLE `PdfLibro` ADD FOREIGN KEY (`idLibro`) REFERENCES `Libro` (`idLibro`);