From 6b3da98428b688c586e0f69cbc1228716f63faca Mon Sep 17 00:00:00 2001 From: Tanner Sirota Date: Tue, 19 Mar 2019 08:09:21 -0700 Subject: [PATCH] Initial steps of searching on backend --- package-lock.json | 77 +++++++++++++++----- server/controllers/booking.js | 8 +-- server/controllers/user.js | 16 ++--- server/data.json | 91 ++++++++++++++++++++++++ server/fake-db.js | 48 ++----------- server/routes/rentals.js | 40 ++++++++--- src/app/common/service/helper.service.ts | 2 +- 7 files changed, 193 insertions(+), 89 deletions(-) create mode 100644 server/data.json diff --git a/package-lock.json b/package-lock.json index 204e7495..6d80efb0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1227,6 +1227,7 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, + "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -2879,7 +2880,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "constants-browserify": { "version": "1.0.0", @@ -3276,7 +3278,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "dev": true, + "optional": true }, "depd": { "version": "1.1.2", @@ -4263,7 +4266,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -4284,12 +4288,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4304,17 +4310,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4431,7 +4440,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4443,6 +4453,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4457,6 +4468,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4464,12 +4476,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4488,6 +4502,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4568,7 +4583,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -4580,6 +4596,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -4665,7 +4682,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4701,6 +4719,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4720,6 +4739,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4763,12 +4783,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -4777,6 +4799,7 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4789,6 +4812,7 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, + "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -4826,7 +4850,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true + "dev": true, + "optional": true }, "get-stream": { "version": "3.0.0", @@ -5015,7 +5040,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "dev": true, + "optional": true }, "has-value": { "version": "1.0.0", @@ -5731,7 +5757,8 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "dev": true, + "optional": true }, "is-windows": { "version": "1.0.2", @@ -6431,6 +6458,7 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -6443,7 +6471,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "optional": true } } }, @@ -6752,7 +6781,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "dev": true, + "optional": true }, "map-visit": { "version": "1.0.0", @@ -7501,6 +7531,7 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, + "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -8509,6 +8540,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, + "optional": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -8520,6 +8552,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -8530,7 +8563,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "optional": true } } }, @@ -8539,6 +8573,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, + "optional": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -8549,6 +8584,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, + "optional": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -8559,6 +8595,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, + "optional": true, "requires": { "pinkie-promise": "^2.0.0" } @@ -9897,6 +9934,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, + "optional": true, "requires": { "is-utf8": "^0.2.0" } @@ -11227,6 +11265,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, + "optional": true, "requires": { "string-width": "^1.0.2 || 2" } diff --git a/server/controllers/booking.js b/server/controllers/booking.js index ab33ef7f..616c2f47 100644 --- a/server/controllers/booking.js +++ b/server/controllers/booking.js @@ -15,9 +15,7 @@ exports.createBooking = function(req, res) { .populate('user') .exec(function(err, foundRental) { if (err) { - return res.status(422).send({ - errors: normalizeErrors(err.errors) - }); + return res.status(422).send({errors: normalizeErrors(err.errors)}); } if (foundRental.user.id === user.id ) { @@ -33,9 +31,7 @@ exports.createBooking = function(req, res) { booking.save(function(err) { if (err) { - return res.status(422).send({ - errors: normalizeErrors(err.errors) - }); + return res.status(422).send({errors: normalizeErrors(err.errors)}); } foundRental.save(); diff --git a/server/controllers/user.js b/server/controllers/user.js index 81fc22ea..9cb6bf71 100644 --- a/server/controllers/user.js +++ b/server/controllers/user.js @@ -13,9 +13,7 @@ exports.auth = function(req, res) { User.findOne({email}, function(err, user) { if (err) { - return res.status(422).send({ - errors: normalizeErrors(err.errors) - }); + return res.status(422).send({errors: normalizeErrors(err.errors)}); } if (!user) { @@ -58,9 +56,7 @@ exports.register = function(req, res) { User.findOne({email}, function(err, existingUser) { if (err) { - return res.status(422).send({ - errors: normalizeErrors(err.errors) - }); + return res.status(422).send({errors: normalizeErrors(err.errors)}); } if (existingUser) { @@ -77,9 +73,7 @@ exports.register = function(req, res) { user.save(function(err) { if (err) { - return res.status(422).send({ - errors: normalizeErrors(err.errors) - }); + return res.status(422).send({errors: normalizeErrors(err.errors)}); } return res.json({'registered': true}); @@ -94,9 +88,7 @@ exports.authMiddleware = function(req, res, next) { const user = parseToken(token); User.findById(user.userId, function(err, user) { if (err) { - return res.status(422).send({ - errors: normalizeErrors(err.errors) - }); + return res.status(422).send({errors: normalizeErrors(err.errors)}); } if (user) { diff --git a/server/data.json b/server/data.json new file mode 100644 index 00000000..d735c1e0 --- /dev/null +++ b/server/data.json @@ -0,0 +1,91 @@ +{ + "rentals": [{ + "title": "Nice view on ocean", + "city": "San Francisco", + "street": "Main street", + "category": "condo", + "image": "https://booksync-jerga-prod.s3.amazonaws.com/uploads/rental/image/5/image.jpeg", + "bedrooms": 4, + "shared": false, + "description": "Very nice apartment in center of the city.", + "dailyRate": 43 + }, + { + "title": "Modern apartment in center", + "city": "New York", + "street": "Time Square", + "category": "apartment", + "image": "https://booksync-jerga-prod.s3.amazonaws.com/uploads/rental/image/5/image.jpeg", + "bedrooms": 1, + "shared": true, + "description": "Very nice apartment in center of the city.", + "dailyRate": 11 + }, + { + "title": "Old house in nature", + "city": "Spisska Nova Ves", + "street": "Banicka 1", + "category": "house", + "image": "https://booksync-jerga-prod.s3.amazonaws.com/uploads/rental/image/5/image.jpeg", + "bedrooms": 5, + "shared": false, + "description": "Very nice apartment in center of the city.", + "dailyRate": 23 + }, + { + "title": "Amazing modern place", + "city": "San Francisco", + "street": "Green street", + "category": "house", + "image": "https://booksync-jerga-prod.s3.amazonaws.com/uploads/rental/image/5/image.jpeg", + "bedrooms": 2, + "shared": false, + "description": "Hiking routes 10 min walking away", + "dailyRate": 140 + }, + { + "title": "Apartment In China Town", + "city": "San Francisco", + "street": "Union Street", + "category": "apartment", + "image": "https://booksync-jerga-prod.s3.amazonaws.com/uploads/rental/image/5/image.jpeg", + "bedrooms": 3, + "shared": false, + "description": "Very nice apartment in China Town", + "dailyRate": 89 + }, + { + "title": "House with Garden", + "city": "New York", + "street": "Long Island, Queens", + "category": "house", + "image": "https://booksync-jerga-prod.s3.amazonaws.com/uploads/rental/image/5/image.jpeg", + "bedrooms": 6, + "shared": false, + "description": "Very nice house in Long Island with garden", + "dailyRate": 189 + }, + { + "title": "Cozy modern Condo", + "city": "New York", + "street": "Penn Station", + "category": "condo", + "image": "https://booksync-jerga-prod.s3.amazonaws.com/uploads/rental/image/5/image.jpeg", + "bedrooms": 3, + "shared": true, + "description": "Building close to Penn Station", + "dailyRate": 68 + } + ], + "users": [{ + "username": "Test User", + "email": "test@gmail.com", + "password": "testtest" + },{ + "username": "Test User1", + "email": "test1@gmail.com", + "password": "testtest1" + } + ] + } + \ No newline at end of file diff --git a/server/fake-db.js b/server/fake-db.js index 9e966fdc..7ddd5b2e 100644 --- a/server/fake-db.js +++ b/server/fake-db.js @@ -1,57 +1,19 @@ const Rental = require('./models/rental'); const User = require('./models/user'); +const fakeDbData = require('./data.json'); +const Booking = require('./models/booking'); class FakeDB { constructor () { - this.rentals = [{ - title: "Nice view on ocean", - city: "San Francisco", - street: "Main street", - category: "condo", - image: "https://booksync-jerga-prod.s3.amazonaws.com/uploads/rental/image/5/image.jpeg", - bedrooms: 4, - shared: true, - description: "Very nice apartment in center of the city.", - dailyRate: 43 - }, - { - title: "Modern apartment in center", - city: "New York", - street: "Times Square", - category: "apartment", - image: "https://booksync-jerga-prod.s3.amazonaws.com/uploads/rental/image/5/image.jpeg", - bedrooms: 1, - shared: false, - description: "Very nice apartment in center of the city.", - dailyRate: 11 - }, - { - title: "Old house in nature", - city: "Spisska Nova Ves", - street: "Banicka 1", - category: "house", - image: "https://booksync-jerga-prod.s3.amazonaws.com/uploads/rental/image/5/image.jpeg", - bedrooms: 5, - shared: true, - description: "Very nice apartment in center of the city.", - dailyRate: 23 - }]; - - this.users = [{ - username: "Test User", - email: "test@gmail.com", - password: "testtest" - }, { - username: "Test User1", - email: "test1@gmail.com", - password: "test1" - }]; + this.rentals = fakeDbData.rentals; + this.users = fakeDbData.users; } async cleanDb() { await User.deleteMany(); await Rental.deleteMany(); + await Booking.deleteMany(); } pushDataToDb() { diff --git a/server/routes/rentals.js b/server/routes/rentals.js index 011fe245..e84629db 100644 --- a/server/routes/rentals.js +++ b/server/routes/rentals.js @@ -2,19 +2,12 @@ const express = require('express'); const router = express.Router(); const Rental = require('../models/rental'); const UserCtrl = require('../controllers/user'); +const { normalizeErrors } = require('../helpers/mongoose'); router.get('/secret', UserCtrl.authMiddleware, function(req, res) { res.json({"secret": true}); }); -router.get('', function(req, res) { - Rental.find({}) - .select('-bookings') - .exec(function(err, foundRentals) { - res.json(foundRentals); - }); -}); - router.get('/:id', function(req, res) { const rentalId = req.params.id; @@ -32,4 +25,35 @@ router.get('/:id', function(req, res) { }); }); +router.get('', function(req, res) { + const city = req.query.city; + + if (city) { + Rental.find({city: city.toLowerCase()}) + .select('-bookings') + .exec(function(err, filteredRentals) { + if (err) { + return res.status(422).send({errors: normalizeErrors(err.errors)}); + } + + if (filteredRentals.length === 0) { + return res.status(422).send({errors: + [{title: 'No Rental Found!', detail: `There are no rentals for city ${city}`}] + }); + } + + return res.json(filteredRentals); + + }); + } else { + Rental.find({}) + .select('-bookings') + .exec(function(err, foundRentals) { + + return res.json(foundRentals); + }); + } +}); + + module.exports = router; \ No newline at end of file diff --git a/src/app/common/service/helper.service.ts b/src/app/common/service/helper.service.ts index 29471628..b2211722 100644 --- a/src/app/common/service/helper.service.ts +++ b/src/app/common/service/helper.service.ts @@ -9,7 +9,7 @@ export class HelperService { private makeProperDateFormat(dateString, trueFalse: boolean) { if (!trueFalse) return dateString; const dateArray = dateString.split("/"); - let newDate = dateArray[2] + "-" + dateArray[1] + "-" + dateArray[0]; + let newDate = dateArray[2] + "-" + dateArray[0] + "-" + dateArray[1]; return newDate; }