From b2c048d897e185e90f815d9305d7e743a3d0c5de Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 3 Apr 2018 19:56:37 +0500 Subject: [PATCH 1/5] done --- queries.js | 86 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 25 deletions(-) diff --git a/queries.js b/queries.js index e71db97..334e3cb 100644 --- a/queries.js +++ b/queries.js @@ -3,11 +3,27 @@ module.exports = class Queries { constructor(mongoose, { souvenirsCollection, cartsCollection }) { const souvenirSchema = mongoose.Schema({ // eslint-disable-line new-cap - // Ваша схема сувенира тут + tags: [String], + reviews: [{ + id: String, + login: String, + date: Date, + text: String, + rating: Number, + isApproved: Boolean + }], + name: String, + image: String, + price: { type: Number, index: true }, + amount: Number, + country: { type: String, index: true }, + rating: { type: Number, index: true }, + isRecent: Boolean }); const cartSchema = mongoose.Schema({ // eslint-disable-line new-cap - // Ваша схема корзины тут + login: String, + items: [{ souvenirId: String, amount: Number }] }); // Модели в таком формате нужны для корректного запуска тестов @@ -18,42 +34,38 @@ module.exports = class Queries { // Далее идут методы, которые вам необходимо реализовать: getAllSouvenirs() { - // Данный метод должен возвращать все сувениры + return this._Souvenir.find(); } getCheapSouvenirs(price) { - // Данный метод должен возвращать все сувениры, цена которых меньше или равна price + return this._Souvenir.find({ $lte: price }); } getTopRatingSouvenirs(n) { - // Данный метод должен возвращать топ n сувениров с самым большим рейтингом + return this._Souvenir.find() + .sort({ rating: -1 }) + .limit(n); } getSouvenirsByTag(tag) { - // Данный метод должен возвращать все сувениры, в тегах которых есть tag - // Кроме того, в ответе должны быть только поля name, image и price + return this._Souvenir.find({ tags: tag }, { name: 1, image: 1, price: 1, _id: 0 }); } getSouvenrisCount({ country, rating, price }) { - // Данный метод должен возвращать количество сувениров, - // из страны country, с рейтингом больше или равной rating, - // и ценой меньше или равной price - - // ! Важно, чтобы метод работал очень быстро, - // поэтому учтите это при определении схем + return this._Souvenir.find({ country, rating: { $gte: rating }, price: { $lte: price } }) + .count(); } searchSouvenirs(substring) { - // Данный метод должен возвращать все сувениры, в название которых входит - // подстрока substring. Поиск должен быть регистронезависимым + return this._Souvenir.find({ name: { $regex: substring, $options: 'i' } }); } getDisscusedSouvenirs(date) { - // Данный метод должен возвращать все сувениры, - // первый отзыв на которые был оставлен не раньше даты date + return this._Souvenir.find({ 'reviews.0.date': { $gte: date } }); } deleteOutOfStockSouvenirs() { + return this._Souvenir.find({ amount: { $eq: 0 } }).remove(); // Данный метод должен удалять все сувениры, которых нет в наличии // (то есть amount = 0) @@ -62,16 +74,40 @@ module.exports = class Queries { } async addReview(souvenirId, { login, rating, text }) { - // Данный метод должен добавлять отзыв к сувениру souvenirId, отзыв добавляется - // в конец массива (чтобы сохранить упорядоченность по дате), - // содержит login, rating, text - из аргументов, - // date - текущая дата и isApproved - false - // Обратите внимание, что при добавлении отзыва рейтинг сувенира должен быть пересчитан + let reviewsCount = 1; + let ratingSum = rating; + await this._Souvenir.find({ _id: souvenirId }) + .then(souvenir => souvenir[0].reviews + .forEach(review => { + reviewsCount++; + ratingSum += review.rating; + }) + ); + this._Souvenir.update({ _id: souvenirId }, { + $push: { + reviews: { + login, + rating, + text, + date: new Date(), + isApproved: false + } + }, + $set: { + rating: ratingSum / reviewsCount + } + }); } async getCartSum(login) { - // Данный метод должен считать общую стоимость корзины пользователя login - // У пользователя может быть только одна корзина, поэтому это тоже можно отразить - // в схеме + const cart = ((await this._Cart.find({ login }, { items: 1, _id: 0 }))[0]).items; + + let sum = 0; + for (let orderedSouvenir of cart) { + const souvenir = (await this._Souvenir.find({ _id: orderedSouvenir.souvenirId }))[0]; + sum += souvenir.price * orderedSouvenir.amount; + } + + return sum; } }; From fc26ab7865a5d1613df204d775ea13d7edfb75e4 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 3 Apr 2018 19:59:11 +0500 Subject: [PATCH 2/5] add ids --- queries.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/queries.js b/queries.js index 334e3cb..6be10a7 100644 --- a/queries.js +++ b/queries.js @@ -3,6 +3,7 @@ module.exports = class Queries { constructor(mongoose, { souvenirsCollection, cartsCollection }) { const souvenirSchema = mongoose.Schema({ // eslint-disable-line new-cap + _id: mongoose.Schema.Types.ObjectId, tags: [String], reviews: [{ id: String, @@ -22,6 +23,7 @@ module.exports = class Queries { }); const cartSchema = mongoose.Schema({ // eslint-disable-line new-cap + _id: mongoose.Schema.Types.ObjectId, login: String, items: [{ souvenirId: String, amount: Number }] }); From d6832b138df91a010acb729326934ba44d30d0d7 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 3 Apr 2018 20:25:00 +0500 Subject: [PATCH 3/5] fix query bug --- queries.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/queries.js b/queries.js index 6be10a7..67085d1 100644 --- a/queries.js +++ b/queries.js @@ -40,7 +40,7 @@ module.exports = class Queries { } getCheapSouvenirs(price) { - return this._Souvenir.find({ $lte: price }); + return this._Souvenir.find({ price: { $lte: price } }); } getTopRatingSouvenirs(n) { From 7cf572c6fafb996170bc5c68726277ed76de81fd Mon Sep 17 00:00:00 2001 From: Alexey Date: Wed, 4 Apr 2018 09:41:06 +0500 Subject: [PATCH 4/5] add await in review --- queries.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/queries.js b/queries.js index 67085d1..daad9dd 100644 --- a/queries.js +++ b/queries.js @@ -85,20 +85,19 @@ module.exports = class Queries { ratingSum += review.rating; }) ); - this._Souvenir.update({ _id: souvenirId }, { - $push: { - reviews: { - login, - rating, - text, - date: new Date(), - isApproved: false - } - }, - $set: { - rating: ratingSum / reviewsCount - } + + let review = { + login, + rating, + text, + date: new Date(), + isApproved: false + }; + await this._Souvenir.findOneAndUpdate({ _id: souvenirId }, { + $push: { reviews: review }, + $set: { rating: ratingSum / reviewsCount } }); + // await } async getCartSum(login) { From f38feb14113f158a68f4229628b553c5e6717fd2 Mon Sep 17 00:00:00 2001 From: Alexey Date: Fri, 6 Apr 2018 12:36:04 +0500 Subject: [PATCH 5/5] magic --- queries.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/queries.js b/queries.js index daad9dd..e59110a 100644 --- a/queries.js +++ b/queries.js @@ -5,14 +5,7 @@ module.exports = class Queries { const souvenirSchema = mongoose.Schema({ // eslint-disable-line new-cap _id: mongoose.Schema.Types.ObjectId, tags: [String], - reviews: [{ - id: String, - login: String, - date: Date, - text: String, - rating: Number, - isApproved: Boolean - }], + reviews: [mongoose.Schema.Types.Mixed], name: String, image: String, price: { type: Number, index: true },