From beea9ef8cd4cc8922bca7df776ecaa5a4a89223c Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 6 Oct 2017 12:55:53 -0500 Subject: [PATCH 1/2] finished hw --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 2 +- README.md | 85 ---- controllers/addFoodRoutes.js | 11 + controllers/routes.js | 128 ++++++ models/food.js | 39 ++ models/index.js | 28 +- models/meal-entry.js | 23 ++ models/meal-tracker.js | 24 ++ models/test.js | 22 - package-lock.json | 769 +++++++++++++++++++++++++++++++++++ package.json | 9 +- public/styles/style.css | 9 + routes/test.js | 37 -- server.js | 33 -- server/server.js | 36 ++ views/index.hbs | 81 ++++ 17 files changed, 1144 insertions(+), 192 deletions(-) create mode 100644 .DS_Store delete mode 100644 README.md create mode 100644 controllers/addFoodRoutes.js create mode 100644 controllers/routes.js create mode 100755 models/food.js mode change 100644 => 100755 models/index.js create mode 100755 models/meal-entry.js create mode 100755 models/meal-tracker.js delete mode 100644 models/test.js create mode 100644 package-lock.json mode change 100644 => 100755 package.json create mode 100644 public/styles/style.css delete mode 100644 routes/test.js delete mode 100644 server.js create mode 100644 server/server.js create mode 100644 views/index.hbs diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Personal API - Weekend Lab - -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) - -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!): - -```bash -# git add changed-files -# git commit -m "detailed description of what I changed" -git push heroku master -heroku open -``` - -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. - -## Step 1: Verify the Test Routes in Postman - -Since we're building a JSON API with no front-end (yet), Postman will come in handy for testing our work. - -Make sure you've **installed dependencies** and added a `.env` file with your **Mongo DB credentials**. Then **run the server** with the placeholder code. - -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: - -```json -{ - "name": "test item 1" -} -``` - -## Step 2: Build Your Main Schema/Model - -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? diff --git a/controllers/addFoodRoutes.js b/controllers/addFoodRoutes.js new file mode 100644 index 0000000..f2c509f --- /dev/null +++ b/controllers/addFoodRoutes.js @@ -0,0 +1,11 @@ +const express = require('express'); +const _ = require('lodash'); +const router = express.Router(); + +let db = require('../models'); + + + + + +module.exports = router; \ No newline at end of file diff --git a/controllers/routes.js b/controllers/routes.js new file mode 100644 index 0000000..2c9c317 --- /dev/null +++ b/controllers/routes.js @@ -0,0 +1,128 @@ +const express = require('express'); +const _ = require('lodash'); +const {ObjectID} = require('mongodb'); +const router = express.Router(); + + +let db = require('../models'); + + +router.get('/', (req, res) => { + db.Food.find({}).then((data) => { + if(!data) { + res.status(500).send(); + } + res.send(data); + }).catch((err) => { + res.status(400).send(); + }); +}); + + +router.post('/', (req, res) => { + let body = _.pick(req.body, Object.keys(db.Food.schema.paths)); + let food = new db.Food(body); + + food.save().then((data) => { + res.send(data); + }).catch((err) => { + res.status(400).send(); + }); +}); + + +// Find Food by ObjectID +router.get('/:id', (req, res) => { + let id = req.params.id; + if (!ObjectID.isValid(id)) { + return res.status(404).send(); + } + + db.Food.findById(id).then((foundItem) => { + if (!foundItem) { + return res.status(404).send(`Error finding item with ObjectID: ${id}`); + } + res.send(foundItem); + }).catch((err) => { + res.status(400).send(); + }); +}); + + +// Update a Food Entry + +router.patch('/:id', (req, res) => { + let id = req.params.id; + if (!ObjectID.isValid(id)) { + return res.status(404).send(); + } + + db.Food.findByIdAndUpdate(id, { + $set: req.body, + new: true + }).then((foundItem) => { + if (!foundItem) { + return res.status(404).send(`Error updating item with ObjectID: ${id}`); + } + res.send(foundItem); + }).catch((err) => { + res.send(400).send(); + }); +}); + + +// Delete a Food Entry + +router.delete('/:id', (req, res) => { + let id = req.params.id; + if (!ObjectID.isValid(id)) { + return res.status(404).send(); + } + + db.Food.findByIdAndRemove(id).then((removeItem) => { + if (!removeItem) { + return res.status(404).send(`Error removing item with ObejctID: ${id}`); + } + + res.send({ + 'Removed Item': `${removeItem.name}`, + 'Object ID': `${id}`, + }); + }).catch((err) => { + res.status(400).send(); + }); +}); + + + + + + + + + + + +// router.get('/addFood', (req, res) => { +// res.render('index'); +// }); + + +// router.post('/addFood', (req, res) => { +// let bodyPaths = _.pick(req.body, Object.keys(db.Food.schema.paths)); +// let food = new db.Food(bodyPaths); +// let infoPaths = _.pick(req.body, Object.keys(db.NutritionInfo.schema.paths)); + +// food.NutritionInfo.push(infoPaths); +// food.save().then((food) => { +// res.send(); +// }).catch((e) => { +// res.status(400).send("Unable to save to database"); +// }); +// }); + + + + + +module.exports = router; \ No newline at end of file diff --git a/models/food.js b/models/food.js new file mode 100755 index 0000000..8d029b1 --- /dev/null +++ b/models/food.js @@ -0,0 +1,39 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +let nutritionInfoSchema = new Schema({ + servingSizeAmount: Number, + servingSizeUnit: String, + servingSizeDescription: String, + calories: Number, + totalFat: Number, + sodium: Number, + sugar: Number, + protein: Number, + fiber: Number +}); + +let foodSchema = new Schema({ + name: { + type: String, + required: true + }, + imageUrl: { + type: String, + default: "" + }, + tags: [{ + type: String, + default: "" + }], + NutritionInfo: [nutritionInfoSchema] +}); + +let NutritionInfo = mongoose.model('NutritionInfo', nutritionInfoSchema); +let Food = mongoose.model('Food', foodSchema); + + +module.exports = { + NutritionInfo, + Food, +}; diff --git a/models/index.js b/models/index.js old mode 100644 new mode 100755 index 84420bf..4c0b124 --- a/models/index.js +++ b/models/index.js @@ -1,18 +1,24 @@ const mongoose = require('mongoose'); require('dotenv').config(); -// TODO: include all model files here (and export models together below) -const testModels = require('./test'); +mongoose.Promise = global.Promise; -// connect to Mongo DB -mongoose.connection.openUri(process.env.MONGODB_URI || process.env.DB_CONN, {}, function(err, conn) { - if (err) { - console.log('Error connecting to Mongo DB.', err); - } else { - console.log('Mongoose successfully connected to Mongo DB.'); - } +const food = require('./food'); +const mealEntry = require('./meal-entry'); +const mealTracker = require('./meal-tracker'); + + +mongoose.connection.openUri(process.env.MONGODB_URI || process.env.DB_MONGO_URI_LOCAL, { + useMongoClient: true }); + + +// export module.exports = { - // TODO: add references to all models here - Test: testModels.Test + NutritionInfo: food.NutritionInfo, + Food: food.Food, + FoodServing: mealEntry.FoodServing, + MealEntry: mealEntry.MealEntry, + MealDay: mealTracker.MealDay, + MealTracker: mealTracker.MealTracker, }; diff --git a/models/meal-entry.js b/models/meal-entry.js new file mode 100755 index 0000000..80fb7a6 --- /dev/null +++ b/models/meal-entry.js @@ -0,0 +1,23 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const foodServingSchema = new Schema({ + food: { + type: Schema.Types.ObjectId, + ref: 'Food' + }, + numServings: Number +}); + +const mealEntrySchema = new Schema({ + time: Date, + foodItems: [foodServingSchema] +}); + +const FoodServing = mongoose.model('FoodServing', foodServingSchema); +const MealEntry = mongoose.model('MealEntry', mealEntrySchema); + +module.exports = { + FoodServing, + MealEntry, +}; diff --git a/models/meal-tracker.js b/models/meal-tracker.js new file mode 100755 index 0000000..4dc6a4c --- /dev/null +++ b/models/meal-tracker.js @@ -0,0 +1,24 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const mealDaySchema = new Schema({ + date: Date, + isCheatDay: Boolean, + meals: [{ + type: Schema.Types.ObjectId, + ref: 'MealEntry' + }] +}); + +const trackerSchema = new Schema({ + name: String, + mealDays: [mealDaySchema] +}); + +const MealDay = mongoose.model('MealDay', mealDaySchema); +const MealTracker = mongoose.model('MealTracker', trackerSchema); + +module.exports = { + MealDay: MealDay, + MealTracker: MealTracker, +}; 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/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a2f4e05 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,769 @@ +{ + "name": "food-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" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "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=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "optional": true + } + } + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "optional": true + }, + "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" + } + }, + "foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" + }, + "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=" + }, + "handlebars": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", + "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + } + } + }, + "hbs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.0.1.tgz", + "integrity": "sha1-S/2YZQ3IydrESzyprfnAmOi8M7Y=", + "requires": { + "handlebars": "4.0.5", + "walk": "2.3.9" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "handlebars": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", + "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=", + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + } + } + } + }, + "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=" + }, + "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", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "kareem": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", + "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "optional": true + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "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" + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "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" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + } + }, + "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=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "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=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "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=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "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" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "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=" + }, + "walk": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.9.tgz", + "integrity": "sha1-MbTbZnjyrgHDnqn7hyWpAx5Vins=", + "requires": { + "foreachasync": "3.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } +} diff --git a/package.json b/package.json old mode 100644 new mode 100755 index 7027857..ee5acf4 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { - "name": "custom-api", + "name": "food-api", "version": "1.0.0", - "description": "", + "description": "Data API for keeping track of nutrition information. Like a food/nutrition tracker/diary.", "main": "server.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "start": "node server/server.js" }, "author": "", "license": "ISC", @@ -12,6 +12,9 @@ "body-parser": "^1.18.2", "dotenv": "^4.0.0", "express": "^4.16.1", + "hbs": "^4.0.1", + "lodash": "^4.17.4", + "mongodb": "^2.2.31", "mongoose": "^4.12.0" } } diff --git a/public/styles/style.css b/public/styles/style.css new file mode 100644 index 0000000..02b83ac --- /dev/null +++ b/public/styles/style.css @@ -0,0 +1,9 @@ + + +.container { + /*width: 100%; + margin: 0 auto; + padding: 40px 40px 40px 300px;*/ + padding: 50px 50px 50px 400px; + /*margin-right: 100%;*/ +} \ No newline at end of file diff --git a/routes/test.js b/routes/test.js deleted file mode 100644 index b5f9646..0000000 --- a/routes/test.js +++ /dev/null @@ -1,37 +0,0 @@ -// this is an example file showing how you might define route handlers - -const db = require('../models'); - -function getTestItems(req, res) { - db.Test.find({}, function(err, data) { - if (err) { - console.log('Error retrieving test items from DB.', err); - res.status(500).send('Internal server error'); - } else { - res.json(data); - } - }); -} - -function createTestItem(req, res) { - const newTestItem = db.Test({ - name: req.body.name, - count: req.body.count, - time: req.body.time, - }); - - newTestItem.save(function(err, data) { - if (err) { - console.log('Error saving test item to DB.', err); - res.status(500).send('Internal server error'); - } else { - res.status(201).json(data); - } - }); -} - -// functions are exported here so they can be referenced in server.js to respond to incoming requests -module.exports = { - getTestItems: getTestItems, - createTestItem: createTestItem, -}; diff --git a/server.js b/server.js deleted file mode 100644 index 3978150..0000000 --- a/server.js +++ /dev/null @@ -1,33 +0,0 @@ -// dependencies -const express = require('express'); -const bodyParser = require('body-parser'); - -// 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() - }); -}); -// 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 - -// start app -app.listen(port, function(err) { - if (err) { - console.log(`Error starting server on port ${port}`, err); - } else { - console.log(`Server running on port ${port}.`); - } -}); diff --git a/server/server.js b/server/server.js new file mode 100644 index 0000000..8c37d2e --- /dev/null +++ b/server/server.js @@ -0,0 +1,36 @@ +const express = require('express'); +const app = express(); +const hbs = require('hbs'); +let bodyParser = require('body-parser'); +const port = process.env.PORT || 3000; + + +app.set('view engine', 'hbs'); + +app.use(bodyParser.urlencoded({ extended: true })); +app.use(bodyParser.json()); + +app.use(express.static('public')); + +const api = require('../controllers/routes.js'); +app.use('/api', api); + + + +// Redirect for API testing +app.get('/', (req, res) => { + res.redirect('/api'); +}); + + + + + + + +app.listen(port, () => { + console.log(`Node.js server started up on http://localhost:${port}`); +}); + + + diff --git a/views/index.hbs b/views/index.hbs new file mode 100644 index 0000000..3411051 --- /dev/null +++ b/views/index.hbs @@ -0,0 +1,81 @@ + + + + Document + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+ + + + + + \ No newline at end of file From 4c8c63eda00b55917ce52a09ebd9561d82b219cd Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 6 Oct 2017 15:01:02 -0500 Subject: [PATCH 2/2] route helper added to clean up routes file --- .DS_Store | Bin 6148 -> 8196 bytes routes/helpers/routes_helpers.js | 98 +++++++++++++++++++++++++++++++ routes/routes.js | 50 ++++++++++++++++ server/server.js | 2 +- 4 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 routes/helpers/routes_helpers.js create mode 100644 routes/routes.js diff --git a/.DS_Store b/.DS_Store index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..e2706546c0bd067fe6ca380a4c50ab34d941d853 100644 GIT binary patch literal 8196 zcmeHLO>h)N6n<~>!_0(`0SU&;cqj$GbU3`W|p1V zO+ttjwbY9R>J2o_ft?eUA03qO5P)noHS3?dZdqZ2O1y8|YL z4fBwJkb$KPu-Ls0aul~a;4g~bJ;Te{S=Y50s1_!ui$Q_C4HXU+^A`zgf|s52@>$!> z65y+B-nKkH9{(OARn;}MDc5aU)5{cREv6-%} zIF4XrY*aA21X~QFU(w=ec=jQ9-SA#xdIKMzK~y~QY|MYSfuTh`otn5Zbl5hbIpDbd`I<$cR_ypv|ZBb!khJX-HS&UKC#Oy(cTxpr~F@iOY_oNnie zw(gq;Z98RMFuh^lobp-el;;-wKHhQIA}njmsA|zOpEU_!mCSyEc`C}+S2jjBKe{d6 zx$lX-`TA82>gqL$a*AkieCs*OES#9M41at?_j0CVSkBl`$?~kMZKfT4!d#8pWqE#G zQ**txUfWo9RYD}SRT?g4t@B08pXOt7U*I=U<>J3Tep4Ls8cA9zm3MS=- zB+aX<8tRoctzA}iDecihM9U7PLsmUG{XFd{Z_#!u2}w2N6Skf;ZPC=FbW7?{d8j1V z6pd??9!Va~xf2t#NRJPDAgO8R*sz1T=O4?P4o&Gx8oR!!d0jtEX@vO>8U~w?)S7G) zTg^FWO~yq{rt3(9opkvehBGAXJWRvua0xEM+wdNI1UKL&d;wp>H*g!ig}d+*`~tth z@9+ow34f!6jo5_EsNrVZi5(cnZrq3au?KtcC=TK?cns5c7SG`*>NtjZJdYmwcoAR0 zSMfD`1FzsU`~a`xhj;^T;wShieulU3Hr^4_i5y_EI9H*k>NyftacsF@#NwDHo$_C|tEUUnWQMN?sIQ;M8dl#<5$M8AaBGG*ZKf=%OEBr-* ztHA~moQ4}QiY>Sm+przC;SSu3U4irt;Zrz(M@W8YJc+|Nf~PQtCW&txEi91uN;rvA z_#(c9FOv)};boHHn|Kx9!D|(wJ6x8Vu=swZ=t`-AW4q26wU>pu7!uZ&0|QlJ63s0B zKXm{9|Chs5!#RWugbX|&2C%w6)!$1mzu#faV(l0`qx7)E`ppT;A(XK$teuDBWP@;= lx5WZqGO%;PawuUql&py4ANU^uOMd-^_kVc*GetgJ=^ykz_PYQ8 delta 105 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGpJ516q~502;ws^0>w5KPGg_gAhnpCgF}!R pBnTAa1`@77th%xAJM(0I8AV3M$)+;eJWLRCKt?lcj^~-f3;-`E4{!hg diff --git a/routes/helpers/routes_helpers.js b/routes/helpers/routes_helpers.js new file mode 100644 index 0000000..ced5cba --- /dev/null +++ b/routes/helpers/routes_helpers.js @@ -0,0 +1,98 @@ +const _ = require('lodash'); +const {ObjectID} = require('mongodb'); +let db = require('../../models'); + + + +let getFood = (req, res) => { + db.Food.find({}).then((data) => { + if(!data) { + res.status(500).send(); + } + res.send(data); + }).catch((err) => { + res.status(400).send(); + }); +}; + + +let postFood = (req, res) => { + let body = _.pick(req.body, Object.keys(db.Food.schema.paths)); + let food = new db.Food(body); + + food.save().then((data) => { + res.status(201).send(data); + }).catch((err) => { + res.status(400).send(); + }); +}; + + +let getFoodById = (req, res) => { + let id = req.params.id; + if (!ObjectID.isValid(id)) { + return res.status(404).send(); + } + + db.Food.findById(id).then((foundItem) => { + if (!foundItem) { + return res.status(404).send(`Error finding item with ObjectID: ${id}`); + } + res.send(foundItem); + }).catch((err) => { + res.status(400).send(); + }); +}; + + +let updateFoodById = (req, res) => { + let id = req.params.id; + if (!ObjectID.isValid(id)) { + return res.sendStatus(404); + } + + db.Food.findByIdAndUpdate(id, { + $set: req.body, + new: true + }).then((foundItem) => { + if (!foundItem) { + return res.status(404).send(`Error updating item with ObjectID: ${id}`); + } + res.send(foundItem); + }).catch((err) => { + res.sendStatus(400); + }); +}; + + +let deleteItemById = (req, res) => { + let id = req.params.id; + if (!ObjectID.isValid(id)) { + return res.sendStatus(404); + } + + db.Food.findByIdAndRemove(id).then((removeItem) => { + if (!removeItem) { + return res.status(404).send(`Error removing item with ObejctID: ${id}`); + } + + res.send({ + 'Removed Item': `${removeItem.name}`, + 'Object ID': `${id}`, + }); + }).catch((err) => { + res.sendStatus(400); + }); +}; + + + + + +module.exports = { + getFood, + postFood, + getFoodById, + updateFoodById, + deleteItemById +}; \ No newline at end of file diff --git a/routes/routes.js b/routes/routes.js new file mode 100644 index 0000000..10fdc29 --- /dev/null +++ b/routes/routes.js @@ -0,0 +1,50 @@ +const express = require('express'); +const _ = require('lodash'); +const {ObjectID} = require('mongodb'); +const router = express.Router(); + + +let db = require('../models'); +let helpers = require('./helpers/routes_helpers'); + + +router.route('/') + .get(helpers.getFood) + .post(helpers.postFood); + + + +router.route('/:id') + .get(helpers.getFoodById) + .put(helpers.updateFoodById) + .delete(helpers.deleteItemById); + + +module.exports = router; + + + + + + + + + + +// router.get('/addFood', (req, res) => { +// res.render('index'); +// }); + + +// router.post('/addFood', (req, res) => { +// let bodyPaths = _.pick(req.body, Object.keys(db.Food.schema.paths)); +// let food = new db.Food(bodyPaths); +// let infoPaths = _.pick(req.body, Object.keys(db.NutritionInfo.schema.paths)); + +// food.NutritionInfo.push(infoPaths); +// food.save().then((food) => { +// res.send(); +// }).catch((e) => { +// res.status(400).send("Unable to save to database"); +// }); +// }); diff --git a/server/server.js b/server/server.js index 8c37d2e..b06a065 100644 --- a/server/server.js +++ b/server/server.js @@ -12,7 +12,7 @@ app.use(bodyParser.json()); app.use(express.static('public')); -const api = require('../controllers/routes.js'); +const api = require('../routes/routes.js'); app.use('/api', api);