From 820ee6db90fd86973adafa67e81855ab4ba488e9 Mon Sep 17 00:00:00 2001 From: James Tang Date: Fri, 6 Oct 2017 09:36:59 -0500 Subject: [PATCH 1/9] ready for heroku deploy attempt #1 --- package-lock.json | 547 ++++++++++++++++++++++++++++++++++++++++++++++ server.js | 2 +- 2 files changed, 548 insertions(+), 1 deletion(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1dc2608 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,547 @@ +{ + "name": "custom-api", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "4.17.4" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + } + }, + "bson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", + "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "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=" + }, + "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.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dotenv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" + }, + "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.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + }, + "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=" + }, + "express": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.1.tgz", + "integrity": "sha512-STB7LZ4N0L+81FJHGla2oboUHTk4PaN1RsOkoRh9OSeEKylvF5hwKYVX1xCLFaCT7MD0BNG/gX2WFMLqY6EMBw==", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "hooks-fixed": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.0.tgz", + "integrity": "sha1-oB2JTVKsf2WZu7H2PfycQR33DLo=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "kareem": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", + "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "mongodb": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.31.tgz", + "integrity": "sha1-GUBEXGYeGSF7s7+CRdmFSq71SNs=", + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.15", + "readable-stream": "2.2.7" + } + }, + "mongodb-core": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.15.tgz", + "integrity": "sha1-hB9TuH//9MdFgYnDXIroJ+EWl2Q=", + "requires": { + "bson": "1.0.4", + "require_optional": "1.0.1" + } + }, + "mongoose": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.12.0.tgz", + "integrity": "sha1-ul3POxM4yEmC+XdMEMoEkxAs2DA=", + "requires": { + "async": "2.1.4", + "bson": "1.0.4", + "hooks-fixed": "2.0.0", + "kareem": "1.5.0", + "mongodb": "2.2.31", + "mpath": "0.3.0", + "mpromise": "0.5.5", + "mquery": "2.3.2", + "ms": "2.0.0", + "muri": "1.2.2", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" + } + }, + "mpath": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", + "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" + }, + "mpromise": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", + "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" + }, + "mquery": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.2.tgz", + "integrity": "sha512-KXWMypZSvhCuqRtza+HMQZdYw7PfFBjBTFvP31NNAq0OX0/NTIgpcDpkWQ2uTxk6vGQtwQ2elhwhs+ZvCA8OaA==", + "requires": { + "bluebird": "3.5.1", + "debug": "2.6.9", + "regexp-clone": "0.0.1", + "sliced": "0.0.5" + }, + "dependencies": { + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "muri": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/muri/-/muri-1.2.2.tgz", + "integrity": "sha1-YxmBMmUNsIoEzHnM0A3Tia/SYxw=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "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.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "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=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.4.1" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "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=" + } + } +} diff --git a/server.js b/server.js index 3978150..6bbf90f 100644 --- a/server.js +++ b/server.js @@ -24,7 +24,7 @@ app.post('/test', testRoutes.createTestItem); // TODO: delete the above dummy routes and add your actual routes // start app -app.listen(port, function(err) { +app.listen(process.env.PORT || 3000) { if (err) { console.log(`Error starting server on port ${port}`, err); } else { From f02d9f5a27d6af9df3456f86df14af4e99a50674 Mon Sep 17 00:00:00 2001 From: James Tang Date: Fri, 6 Oct 2017 09:49:10 -0500 Subject: [PATCH 2/9] heroku deploy attempt #2 --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 6bbf90f..3978150 100644 --- a/server.js +++ b/server.js @@ -24,7 +24,7 @@ app.post('/test', testRoutes.createTestItem); // TODO: delete the above dummy routes and add your actual routes // start app -app.listen(process.env.PORT || 3000) { +app.listen(port, function(err) { if (err) { console.log(`Error starting server on port ${port}`, err); } else { From 50fb4802086929ae414a4574487800f419e58a76 Mon Sep 17 00:00:00 2001 From: James Tang Date: Fri, 6 Oct 2017 14:55:42 -0500 Subject: [PATCH 3/9] ver2 --- models/index.js | 6 ++++-- models/pokemon.js | 27 +++++++++++++++++++++++ models/test.js | 22 ------------------- models/trainer.js | 24 +++++++++++++++++++++ seed.js | 43 ++++++++++++++++++++++++++++++++++++ server.js | 55 ++++++++++++++++++++++++++++++++++++----------- 6 files changed, 140 insertions(+), 37 deletions(-) create mode 100644 models/pokemon.js delete mode 100644 models/test.js create mode 100644 models/trainer.js create mode 100644 seed.js diff --git a/models/index.js b/models/index.js index 84420bf..154e495 100644 --- a/models/index.js +++ b/models/index.js @@ -1,7 +1,8 @@ const mongoose = require('mongoose'); require('dotenv').config(); // TODO: include all model files here (and export models together below) -const testModels = require('./test'); +const pokemonModels = require('./pokemon'); +const trainerModels = require('./trainer'); // connect to Mongo DB mongoose.connection.openUri(process.env.MONGODB_URI || process.env.DB_CONN, {}, function(err, conn) { @@ -14,5 +15,6 @@ mongoose.connection.openUri(process.env.MONGODB_URI || process.env.DB_CONN, {}, module.exports = { // TODO: add references to all models here - Test: testModels.Test + Pokemon: pokemonModels.PokemonData, + Trainer: trainerModels.TrainerData, }; diff --git a/models/pokemon.js b/models/pokemon.js new file mode 100644 index 0000000..feb9e77 --- /dev/null +++ b/models/pokemon.js @@ -0,0 +1,27 @@ +const mongoose = require('mongoose'); + +const pokemonSchema = new mongoose.Schema({ + pokemonData: { + name: String, + pokedexNumber: Number, + pokemonType: String, + specialAbility: String, + height: String, + weight: String + }, + baseStats: { + hp: Number, + attack: Number, + defense: Number, + specialAttack: Number, + specialDefense: Number, + speed: Number + }, +}); + + +const PokemonData = mongoose.model('PokemonData', pokemonSchema); + +module.exports = { + PokemonData: PokemonData, +}; diff --git a/models/test.js b/models/test.js deleted file mode 100644 index f6e5c91..0000000 --- a/models/test.js +++ /dev/null @@ -1,22 +0,0 @@ -const mongoose = require('mongoose'); - -const TestSchema = new mongoose.Schema({ - name: { - type: String, - required: true - }, - count: { - type: Number, - default: 42 - }, - time: { - type: Date, - default: Date.now - } -}); - -const Test = mongoose.model('Test', TestSchema); - -module.exports = { - Test: Test -} diff --git a/models/trainer.js b/models/trainer.js new file mode 100644 index 0000000..f20c398 --- /dev/null +++ b/models/trainer.js @@ -0,0 +1,24 @@ +const mongoose = require('mongoose'); + +const trainerSchema = new mongoose.Schema({ + name: { + type: String, + unique: true, + required: true + }, + location: { + type: String, + unique: true, + required: true + }, + pokemon: [{ + type: mongoose.Schema.Types.ObjectId, + ref: 'Pokemon' + }], +}); + +const TrainerData = mongoose.model('TrainerData', trainerSchema); + +module.exports = { + TrainerData: TrainerData, +}; diff --git a/seed.js b/seed.js new file mode 100644 index 0000000..4eeaa1e --- /dev/null +++ b/seed.js @@ -0,0 +1,43 @@ +const mongoose = require('mongoose') +const db = require('./models'); + +const pikachu = new db.Pokemon({ + pokemonData: { + name: 'Pikachu', + pokedexNumber: 025, + pokemonType: 'Eletric', + specialAbility: 'Static', + height: '1′4″ (0.41m)', + weight: '13.2 lbs (6.0 kg)' + }, + baseStats: { + hp: 35, + attack: 55, + defense: 40, + specialAttack: 50, + specialDefense: 50, + speed: 90 + } +}); + +pikachu.save(function(err, savedItem) { + if (err) { + console.log('Error saving Pokemon.', err); + } else { + console.log('Pikachu has been saved.'); + } +}); + +const ash = new db.Trainer({ + name: 'Ash', + location: 'Pallet Town', + pokemon: [], +}); + +ash.save(function(err, savedItem) { + if (err) { + console.log('Error saving Trainer.', err); + } else { + console.log('Trainer has been saved.'); + } +}); diff --git a/server.js b/server.js index 3978150..27af386 100644 --- a/server.js +++ b/server.js @@ -1,27 +1,56 @@ // dependencies const express = require('express'); const bodyParser = require('body-parser'); +const db = require('./models'); // app config const app = express(); const port = process.env.PORT || 3000; app.use(bodyParser.json()); -// app routes -// you can add route handlers directly in this file like this: -app.get('/', function(req, res) { - res.json({ - message: 'Hello, world!', - type: 'greeting', - time: new Date() + app.get('/pokemon', function(req, res) { + db.Pokemon.find({}, function(err, data) { + if (err) { + res.status(500).send('Error getting data.'); + } else { + res.json(data); + } + }); + }); + + app.get('/trainer', function(req, res) { + db.Trainer.find({}, function(err, data) { + if (err) { + res.status(500).send('Error getting data.'); + } else { + res.json(data); + } + }); }); -}); -// or you can import route handlers from other files like this: -const testRoutes = require('./routes/test'); -app.get('/test', testRoutes.getTestItems); -app.post('/test', testRoutes.createTestItem); -// TODO: delete the above dummy routes and add your actual routes + app.get('/pokemon/:id', function(req, res) { + var pokemonId = req.params.id; + db.Pokemon.findOne({_id: pokemonId}, function(err, foundPokemon) { + if (err) { + res.status(500).send('Error retreiving data.'); + } else { + res.json(foundPokemon); + } + }) + }); + +app.post('/pokemon', function (req, res) { + var japaneseName = db.Pokemon({ + name: req.body.name, + }); + + japaneseName.save(function (err, name) { + res.send(`japaneseName added: ${name}`) + }); + + console.log('typeOfPokemon added', req.body); + +}); // start app app.listen(port, function(err) { From 05ec4a0005abba13be00e6c7605b1303967d4d6c Mon Sep 17 00:00:00 2001 From: James Tang Date: Sat, 7 Oct 2017 22:46:56 -0500 Subject: [PATCH 4/9] ver4 THIS ONE WORKS --- models/pokemon.js | 2 +- package-lock.json | 18 ++++++++++++++++++ package.json | 2 ++ server.js | 33 ++++++++++++++++++++++++++++++--- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/models/pokemon.js b/models/pokemon.js index feb9e77..e2fe97b 100644 --- a/models/pokemon.js +++ b/models/pokemon.js @@ -3,7 +3,7 @@ const mongoose = require('mongoose'); const pokemonSchema = new mongoose.Schema({ pokemonData: { name: String, - pokedexNumber: Number, + pokedexNumber: String, pokemonType: String, specialAbility: String, height: String, diff --git a/package-lock.json b/package-lock.json index 1dc2608..37a4575 100644 --- a/package-lock.json +++ b/package-lock.json @@ -194,6 +194,19 @@ "unpipe": "1.0.0" } }, + "flat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.0.0.tgz", + "integrity": "sha512-ji/WMv2jdsE+LaznpkIF9Haax0sdpTBozrz/Dtg4qSRMfbs8oVg4ypJunIRYPiMLvH/ed6OflXbnbTIKJhtgeg==", + "requires": { + "is-buffer": "1.1.5" + } + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -235,6 +248,11 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", diff --git a/package.json b/package.json index 7027857..22e40b7 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "body-parser": "^1.18.2", "dotenv": "^4.0.0", "express": "^4.16.1", + "flat": "^4.0.0", + "flatten": "^1.0.2", "mongoose": "^4.12.0" } } diff --git a/server.js b/server.js index 27af386..2cfb161 100644 --- a/server.js +++ b/server.js @@ -2,6 +2,7 @@ const express = require('express'); const bodyParser = require('body-parser'); const db = require('./models'); +const flatten = require('flat'); // app config const app = express(); @@ -40,16 +41,42 @@ app.use(bodyParser.json()); }); app.post('/pokemon', function (req, res) { - var japaneseName = db.Pokemon({ - name: req.body.name, + var japaneseName = new db.Pokemon({ + pokemonData: { + name: req.body.name, + pokedexNumber: req.body.pokedexNumber, + pokemonType: req.body.Type, + specialAbility: req.body.specialAbility, + height: req.body.height, + weight: req.body.weight + }, }); japaneseName.save(function (err, name) { res.send(`japaneseName added: ${name}`) + console.log('typeOfPokemon added', name); }); +}); - console.log('typeOfPokemon added', req.body); +app.put('/pokemon/:id', function(req, res) { + var pokemonId = req.params.id; + var updatePokemon = { + pokemonData: { + name: req.body.pokemonData.name, + pokedexNumber: req.body.pokemonData.pokedexNumber, + pokemonType: req.body.pokemonData.pokemonType + }, + // baseStats: {} + }; + db.Pokemon.findByIdAndUpdate({_id: pokemonId}, updatePokemon, (err, updatePokemon) => { + res.json(updatePokemon); + if (err) { + console.log(err); + } else { + console.log('COME BACK TO ME'); + } + }); }); // start app From 19385b0afb4b7d417af869ad7344ff9dca058430 Mon Sep 17 00:00:00 2001 From: James Tang Date: Mon, 9 Oct 2017 17:17:04 -0500 Subject: [PATCH 5/9] ver 5 --- server.js | 53 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/server.js b/server.js index 2cfb161..86a3606 100644 --- a/server.js +++ b/server.js @@ -9,6 +9,7 @@ const app = express(); const port = process.env.PORT || 3000; app.use(bodyParser.json()); +// CRUD POKEMON DATA app.get('/pokemon', function(req, res) { db.Pokemon.find({}, function(err, data) { if (err) { @@ -19,16 +20,6 @@ app.use(bodyParser.json()); }); }); - app.get('/trainer', function(req, res) { - db.Trainer.find({}, function(err, data) { - if (err) { - res.status(500).send('Error getting data.'); - } else { - res.json(data); - } - }); - }); - app.get('/pokemon/:id', function(req, res) { var pokemonId = req.params.id; db.Pokemon.findOne({_id: pokemonId}, function(err, foundPokemon) { @@ -64,7 +55,10 @@ app.put('/pokemon/:id', function(req, res) { pokemonData: { name: req.body.pokemonData.name, pokedexNumber: req.body.pokemonData.pokedexNumber, - pokemonType: req.body.pokemonData.pokemonType + pokemonType: req.body.pokemonData.pokemonType, + specialAbility: req.body.pokemonData.specialAbility, + height: req.body.pokemonData.height, + weight: req.body.pokemonData.weight }, // baseStats: {} }; @@ -79,6 +73,43 @@ app.put('/pokemon/:id', function(req, res) { }); }); +app.delete('/pokemon/:id', function(req, res) { + var pokemonId = req.params.id; + db.Pokemon.findOneAndRemove({_id: pokemonId}, function(err, deletePokemon) { + res.json(deletePokemon); + }); + console.log('Pokemon Deleted', req.params); +}); + +// CRUD TRAINER DATA +app.get('/trainer', function(req, res) { + db.Trainer.find({}, function(err, data) { + if (err) { + res.status(500).send('Error getting data.'); + } else { + res.json(data); + } + }); +}); + +app.get('/trainer/:id', function(req, res) { + var trainerId = req.params.id; + db.Trainer.findOne({_id: trainerId}, function(err, foundTrainer) { + if (err) { + res.status(500).send('Error retreiving data.'); + } else { + res.json(foundTrainer); + } + }) +}); + +app.post('/trainer', function (req, res) { + var newName = new db.Trainer({ + trainerData: { + name: req.body.name + }, + }); + // start app app.listen(port, function(err) { if (err) { From 44c23a41b1a87322c07d4e5ad38302893ea57f98 Mon Sep 17 00:00:00 2001 From: James Tang Date: Mon, 9 Oct 2017 18:03:40 -0500 Subject: [PATCH 6/9] heroku push --- server.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index 86a3606..6b467d7 100644 --- a/server.js +++ b/server.js @@ -105,10 +105,16 @@ app.get('/trainer/:id', function(req, res) { app.post('/trainer', function (req, res) { var newName = new db.Trainer({ - trainerData: { - name: req.body.name - }, + name: req.body.name, + location: req.body.location, + pokemon:[] + }); + + newName.save(function (err, name) { + res.send(`New Name added: ${name}`) + console.log('New name added', name); }); +}); // start app app.listen(port, function(err) { From da2568eadb8b20d54c997e3d2a88ed655fd237d1 Mon Sep 17 00:00:00 2001 From: James Tang Date: Mon, 9 Oct 2017 20:41:42 -0500 Subject: [PATCH 7/9] ver 10 WORKING --- server.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index 6b467d7..42c0746 100644 --- a/server.js +++ b/server.js @@ -68,7 +68,7 @@ app.put('/pokemon/:id', function(req, res) { if (err) { console.log(err); } else { - console.log('COME BACK TO ME'); + console.log('COME BACK TO ME POKEMON!'); } }); }); @@ -107,7 +107,7 @@ app.post('/trainer', function (req, res) { var newName = new db.Trainer({ name: req.body.name, location: req.body.location, - pokemon:[] + // pokemon:[] }); newName.save(function (err, name) { @@ -116,6 +116,24 @@ app.post('/trainer', function (req, res) { }); }); +app.put('/trainer/:id', function(req, res) { + var trainerId = req.params.id; + var updateTrainer = { + name: req.body.name, + location: req.body.location, + pokemon: [] + }; + + db.Trainer.findByIdAndUpdate({_id: trainerId}, updateTrainer, (err, updateTrainer) => { + res.json(updateTrainer); + if (err) { + console.log(err); + } else { + console.log('COME BACK TO ME POKEMON!'); + } + }); +}); + // start app app.listen(port, function(err) { if (err) { From 7ac0d625dae1cfaabbc55d30aa39c7a6f56d0db7 Mon Sep 17 00:00:00 2001 From: James Tang Date: Mon, 9 Oct 2017 20:50:34 -0500 Subject: [PATCH 8/9] working copy final ver 30 --- server.js | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/server.js b/server.js index 42c0746..49ceed3 100644 --- a/server.js +++ b/server.js @@ -31,7 +31,7 @@ app.use(bodyParser.json()); }) }); -app.post('/pokemon', function (req, res) { + app.post('/pokemon', function (req, res) { var japaneseName = new db.Pokemon({ pokemonData: { name: req.body.name, @@ -49,7 +49,7 @@ app.post('/pokemon', function (req, res) { }); }); -app.put('/pokemon/:id', function(req, res) { + app.put('/pokemon/:id', function(req, res) { var pokemonId = req.params.id; var updatePokemon = { pokemonData: { @@ -73,7 +73,7 @@ app.put('/pokemon/:id', function(req, res) { }); }); -app.delete('/pokemon/:id', function(req, res) { + app.delete('/pokemon/:id', function(req, res) { var pokemonId = req.params.id; db.Pokemon.findOneAndRemove({_id: pokemonId}, function(err, deletePokemon) { res.json(deletePokemon); @@ -82,7 +82,7 @@ app.delete('/pokemon/:id', function(req, res) { }); // CRUD TRAINER DATA -app.get('/trainer', function(req, res) { + app.get('/trainer', function(req, res) { db.Trainer.find({}, function(err, data) { if (err) { res.status(500).send('Error getting data.'); @@ -92,7 +92,7 @@ app.get('/trainer', function(req, res) { }); }); -app.get('/trainer/:id', function(req, res) { + app.get('/trainer/:id', function(req, res) { var trainerId = req.params.id; db.Trainer.findOne({_id: trainerId}, function(err, foundTrainer) { if (err) { @@ -103,7 +103,7 @@ app.get('/trainer/:id', function(req, res) { }) }); -app.post('/trainer', function (req, res) { + app.post('/trainer', function (req, res) { var newName = new db.Trainer({ name: req.body.name, location: req.body.location, @@ -116,7 +116,7 @@ app.post('/trainer', function (req, res) { }); }); -app.put('/trainer/:id', function(req, res) { + app.put('/trainer/:id', function(req, res) { var trainerId = req.params.id; var updateTrainer = { name: req.body.name, @@ -134,8 +134,16 @@ app.put('/trainer/:id', function(req, res) { }); }); + app.delete('/trainer/:id', function(req, res) { + var trainerId = req.params.id; + db.Trainer.findOneAndRemove({_id: trainerId}, function(err, deleteTrainer) { + res.json(deleteTrainer); + }); + console.log('Trainer Deleted', req.params); +}); + // start app -app.listen(port, function(err) { + app.listen(port, function(err) { if (err) { console.log(`Error starting server on port ${port}`, err); } else { From 37ad90af2f8f291119bdaabe845c0cafe044929c Mon Sep 17 00:00:00 2001 From: James Tang Date: Tue, 10 Oct 2017 21:02:22 -0500 Subject: [PATCH 9/9] readme final --- README.md | 110 ++++++++++++++++++++++-------------------------------- 1 file changed, 45 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index 1c17588..cd538d2 100644 --- a/README.md +++ b/README.md @@ -1,85 +1,65 @@ -# Personal API - Weekend Lab +TABLE OF CONTENTS +1. DESCRIPTION OF THE API +2. URL TO THE API +3. METHODS AND ENDPOINTS OF THE API +4. REQUIREMENTS AND BASIC STRUCTURE FOR THE API -It's time to have some fun and play with the technologies you've learned in the past week. Your goal is to start your own API. -Your API can be related to whatever you like, but its Mongo DB must have at least 2 schemas/models that are connected by reference. -For example, if your API is for keeping track of various hotels, it would need to reference another type of object besides hotels. You might choose to provide more information about the cities your hotels are found in beyond a simple string like "Austin" or "Orlando". Your `City` schema/model could contain information about the city iself like city name, state, local attractions, and of course a list of related hotels connected by reference. -### Your API should have: -* Well-organized **JSON API** Endpoints -* The ability to **read** (`GET`) each type of resource **as a collection** -* The ability to **read** (`GET`) each type of resource **by specific ID** -* The ability to **create** (`POST`) a new resource of each type -* At least one **update** (`PUT`) endpoint -* At least one **delete** (`DELETE`) endpoint -Try to start by completing the schema/model and implementing endpoints for only one type of resource and expand from there to include other schemas/models/endpoints. -Fork and clone this repo. You can use the placeholder code in this repo as a starting point. -## Step 0: Deploy to Heroku -Before we start coding, let's prepare to deploy our API on Heroku so other developers can access our API from any computer. -You can find full instructions here: [Deploying Express Apps to Heroku](https://github.com/SF-WDI-LABS/shared_modules/blob/master/how-to/heroku-mean-stack-deploy.md) +--------------------------------------------------------------------------------------------------- +1. Description of what your API does. +This API is a built datebase to track Pokemon trainers and their respective Pokemon. +Example: Ash Ketchum -- Pikachu. -As you continue to work on this project, you'll need to remember to push your changes to Heroku (just like you would with Github!): +2. The URL to the database is https://peaceful-sands-51099.herokuapp.com/ -```bash -# git add changed-files -# git commit -m "detailed description of what I changed" -git push heroku master -heroku open -``` +3. Maps out the API endpoints (method + path combos) +The API end points are '/trainer', '/pokemon', '/trainer:id/', '/pokemon:id' -It's common for code to break "in production" even when it works fine "in development" on your computer (due to different environment variables, missing dependenies, etc). Do your best to debug! Let us know if you get stuck on deployment issues. +In the '/trainer' endpoint is where all the trainer data is stored. Name of the trainer, location of where the trainer is from and what Pokemon the Trainer has. +In the '/trainer:id' endpoint is where you can find the specific trainer through their unique ID. +In the '/pokemon' endpoint is where all the information on the Pokemon is stored. Name of the Pokemon, type, number in the Pokedex, ability, height, weight, and all base stats. +In the '/pokemon:id' endpoint you can find all information on a specific Pokemon based off their unique ID. -## Step 1: Verify the Test Routes in Postman +The expected responses for these endpoints is when you use any CRUD operation the data is able to be manipulated in the database. You can add onto the existing data in the database, edit the data, make new data, or even delete all the data. The way you want to use the database is up to the user. -Since we're building a JSON API with no front-end (yet), Postman will come in handy for testing our work. +4. The basic properties of the schema model are as follows. +PokemonSchema +name: String, +pokedexNumber: String, +pokemonType: String, +specialAbility: String, +height: String, +weight: String -Make sure you've **installed dependencies** and added a `.env` file with your **Mongo DB credentials**. Then **run the server** with the placeholder code. +baseStats: { +hp: Number, +attack: Number, +defense: Number, +specialAttack: Number, +specialDefense: Number, +speed: Number -Use Postman to verify that the `GET /test` and `POST /test` endpoints work, confirming that our server can connect to our Mongo DB and complete operations on demand. For the `POST` endpoint, you can simply submit an object with a `name` property, and then it should appear in your next `GET /test` request: +And for Trainers +name: { + type: String, + unique: true, + required: true -```json -{ - "name": "test item 1" -} -``` +location: { + type: String, + unique: true, + required: true -## Step 2: Build Your Main Schema/Model +pokemon: [{ + type: mongoose.Schema.Types.ObjectId, + ref: 'Pokemon' -Next, go to the `models/` folder and add a new file for your main schema/model. For now we'll create it without a reference to any other schemas/models. - -Be sure to export the model from the file and then modify `models/index.js`. It should require the file you just created and then export the models from it so they can be used more directly while preparing responses for our routes. - -## Step 3: Create Your Primary Endpoints - -Now go to the `routes/` folder and create a new file to handle your endpoints for the primary model. It should contain function definitions for handling various endpoints (`GET`, `POST`, etc) related to your primary model. - -Start with the `GET` method for retrieving all matching resources. Then add a function for adding new resources (`POST`). Then add a function for retireving a specific resource by ID (`GET`, with path parameter). - -Make sure that for each function, you modify `server.js` to register the functions as endpoint/route handlers. - -## Step 4: Check Your Work in Postman - -Open up Postman with your new code running on `localhost`. Hit your new `GET` and `POST` endpoints a few times to verify everything is working as expected. - -If it's all working, add/commit your changes to git. Push to Github to backup your code. Push to Heroku so other people can use your newly created endpoints. - -Return to Postman and test again, making sure that your code is working "in production" on the URL Heroku provided for your API server. - -## Step 5: Add Your Other Schemas/Models/Endpoints - -Now it's time to expand on what you've done. Piece by piece, add the other schemas/models and endpoints you planned. - -Be sure to test your endpoints as you go in Postman. Also don't forget to commit your changes and deploy to Heroku from time to time. - -## Options for Extra Challenge - -- **Add even more schemas/models/enpoints.** Thinking of more detailed information is usually fairly easy, but the code to support it gets more difficult the more detail is added. -- **Add support for query parameters** to limit/filter responses on your endpoints that retrieve all resources in a collection. For example, you might limit items based on rating, time/date range, tags, etc. -- **Document all the endpoints of your API** in a markdown file. What does each endpoint do? How should a new user of your API get started? +I have left the following in the examples for you because those are the requirements to make this database. Inside the folder there will also be dependencies in the package.json folder. Do not forget to download those.